@h-ai/vecdb 0.1.0-alpha.67 → 0.1.0-alpha.68

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../messages/en-US.json","../messages/zh-CN.json","../src/vecdb-i18n.ts","../src/vecdb-config.ts","../src/vecdb-types.ts","../src/providers/vecdb-provider-base.ts","../src/providers/vecdb-provider-chroma.ts","../src/providers/vecdb-provider-lancedb.ts","../src/providers/vecdb-provider-pgvector.ts","../src/providers/vecdb-provider-qdrant.ts","../src/vecdb-main.ts"],"names":["core","err","ok","delay","require","logger","distanceToScore"],"mappings":";;;;;;;;;;AAAA,IAAA,aAAA,GAAA;AAAA,EACE,OAAA,EAAW,iDAAA;AAAA,EACX,oBAAA,EAAwB,iEAAA;AAAA,EACxB,gBAAA,EAAoB,+CAAA;AAAA,EACpB,iBAAA,EAAqB,0CAAA;AAAA,EACrB,iBAAA,EAAqB,mDAAA;AAAA,EACrB,oBAAA,EAAwB,uDAAA;AAAA,EACxB,qBAAA,EAAyB,0CAAA;AAAA,EACzB,oBAAA,EAAwB,8EAAA;AAAA,EACxB,sBAAA,EAA0B,+CAAA;AAAA,EAC1B,wBAAA,EAA4B,8BAAA;AAAA,EAC5B,6BAAA,EAAiC,mCAAA;AAAA,EACjC,uBAAA,EAA2B,iEAAA;AAAA,EAC3B,kBAAA,EAAsB,mCAAA;AAAA,EACtB,kBAAA,EAAsB,mCAAA;AAAA,EACtB,kBAAA,EAAsB,mCAAA;AAAA,EACtB,iBAAA,EAAqB,kCAAA;AAAA,EACrB,sBAAA,EAA0B,gCAAA;AAAA,EAC1B,yBAAA,EAA6B,+CAAA;AAAA,EAC7B,sBAAA,EAA0B,mEAAA;AAAA,EAC1B,wBAAA,EAA4B,mCAAA;AAAA,EAC5B,4BAAA,EAAgC;AAClC,CAAA;;;ACtBA,IAAA,aAAA,GAAA;AAAA,EACE,OAAA,EAAW,iDAAA;AAAA,EACX,oBAAA,EAAwB,mGAAA;AAAA,EACxB,gBAAA,EAAoB,uEAAA;AAAA,EACpB,iBAAA,EAAqB,iEAAA;AAAA,EACrB,iBAAA,EAAqB,iFAAA;AAAA,EACrB,oBAAA,EAAwB,gFAAA;AAAA,EACxB,qBAAA,EAAyB,4EAAA;AAAA,EACzB,oBAAA,EAAwB,kHAAA;AAAA,EACxB,sBAAA,EAA0B,iEAAA;AAAA,EAC1B,wBAAA,EAA4B,wCAAA;AAAA,EAC5B,6BAAA,EAAiC,wCAAA;AAAA,EACjC,uBAAA,EAA2B,gGAAA;AAAA,EAC3B,kBAAA,EAAsB,+CAAA;AAAA,EACtB,kBAAA,EAAsB,+CAAA;AAAA,EACtB,kBAAA,EAAsB,+CAAA;AAAA,EACtB,iBAAA,EAAqB,+CAAA;AAAA,EACrB,sBAAA,EAA0B,+CAAA;AAAA,EAC1B,yBAAA,EAA6B,kEAAA;AAAA,EAC7B,sBAAA,EAA0B,mGAAA;AAAA,EAC1B,wBAAA,EAA4B,oEAAA;AAAA,EAC5B,4BAAA,EAAgC;AAClC,CAAA;;;ACEO,IAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,mBAAA,CAAqC;AAAA,EACnE,OAAA,EAAS,aAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAC,CAAA;;;ACMM,IAAM,oBAAA,GAAuB,CAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,aAAa,KAAK,CAAC,CAAA,CAAE,OAAA,CAAQ,QAAQ;AAKpF,IAAM,6BAAA,GAAgC,EAAE,MAAA,CAAO;AAAA,EACpD,IAAA,EAAM,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA,EAC/B,KAAA,EAAO,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA,EAChC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,GAAI,CAAA;AAAA,EAC/C,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,SAAS,OAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,OAAO;AAC3D,CAAC;AAID,IAAM,6BAAA,GAAgC;AAAA,EACpC,YAAA,EAAc,8BAA8B,QAAA;AAC9C,CAAA;AAYA,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EACnC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA;AAAA,EAEzB,IAAA,EAAM,EAAE,MAAA,EAAO,CAAE,IAAI,CAAA,EAAG,MAAA,CAAO,0BAA0B,CAAC,CAAA;AAAA;AAAA,EAE1D,MAAA,EAAQ,qBAAqB,QAAA,EAAS;AAAA,EACtC,GAAG;AACL,CAAC,CAAA;AAaD,IAAM,uBAAA,GAA0B,EAAE,IAAA,CAAK,CAAC,WAAW,MAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAqB1E,IAAM,oBAAA,GAAuB,EAAE,MAAA,CAAO;AAAA,EACpC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA;AAAA,EAE1B,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAEzB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,WAAW,CAAA;AAAA;AAAA,EAEpC,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,CAAE,QAAQ,IAAI,CAAA;AAAA;AAAA,EAErD,QAAA,EAAU,EAAE,MAAA,EAAO,CAAE,IAAI,CAAA,EAAG,MAAA,CAAO,8BAA8B,CAAC,CAAA;AAAA;AAAA,EAElE,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE9B,SAAA,EAAW,wBAAwB,QAAA,EAAS;AAAA;AAAA,EAE5C,MAAA,EAAQ,qBAAqB,QAAA,EAAS;AAAA;AAAA,EAEtC,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,MAAM,CAAA;AAAA,EACtC,GAAG;AACL,CAAC,CAAA;AAeD,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EAClC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA;AAAA,EAExB,KAAK,CAAA,CAAE,MAAA,GAAS,GAAA,EAAI,CAAE,QAAQ,uBAAuB,CAAA;AAAA;AAAA,EAErD,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE5B,MAAA,EAAQ,qBAAqB,QAAA,EAAS;AAAA,EACtC,GAAG;AACL,CAAC,CAAA;AAwBD,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EAClC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA;AAAA,EAExB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE1B,KAAK,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,QAAA,EAAS;AAAA;AAAA,EAE/B,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,WAAW,CAAA;AAAA;AAAA,EAEpC,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,CAAE,QAAQ,GAAI,CAAA;AAAA;AAAA,EAErD,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAE5B,aAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,QAAQ,QAAQ,CAAA;AAAA;AAAA,EAE1C,cAAA,EAAgB,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,GAAM,CAAA;AAAA;AAAA,EAE1D,MAAA,EAAQ,qBAAqB,QAAA,EAAS;AAAA,EACtC,GAAG;AACL,CAAC,CAAA;AAYM,IAAM,iBAAA,GAAoB,CAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EAC5D,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAC;AC5LD,IAAM,cAAA,GAAiB;AAAA,EACrB,iBAAA,EAAmB,SAAA;AAAA,EACnB,YAAA,EAAc,SAAA;AAAA,EACd,oBAAA,EAAsB,SAAA;AAAA,EACtB,yBAAA,EAA2B,SAAA;AAAA,EAC3B,kBAAA,EAAoB,SAAA;AAAA,EACpB,aAAA,EAAe,SAAA;AAAA,EACf,aAAA,EAAe,SAAA;AAAA,EACf,aAAA,EAAe,SAAA;AAAA,EACf,kBAAA,EAAoB,SAAA;AAAA,EACpB,eAAA,EAAiB,SAAA;AAAA,EACjB,YAAA,EAAc,SAAA;AAAA,EACd,gBAAA,EAAkB,SAAA;AAAA,EAClB,gBAAA,EAAkB,SAAA;AAAA,EAClB,oBAAA,EAAsB;AACxB,CAAA;AAKO,IAAM,aAAA,GAAgBA,IAAAA,CAAK,KAAA,CAAM,iBAAA,CAAkB,SAAS,cAAc;ACiEjF,SAAS,yBAAA,CAA0B,SAAkB,SAAA,EAA2B;AAC9E,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,CAAC,MAAM,KAAA,KAAmB;AAC7D,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,OAAO,MAAM,QAAA,EAAS;AAAA,MACxB;AACA,MAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,QAAA,OAAO,YAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,SAAS,SAAA,GAAY,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA,GAAA,CAAA,GAAQ,IAAA;AAAA,EACtE,CAAA,CAAA,MACM;AACJ,IAAA,MAAM,IAAA,GAAO,OAAO,OAAO,CAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,SAAS,SAAA,GAAY,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAC,CAAA,GAAA,CAAA,GAAQ,IAAA;AAAA,EACtE;AACF;AAEO,SAAS,iBAAA,CACd,GAAA,EACA,QAAA,EACA,SAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAI,YAAA,IAAe;AAClC,EAAA,IAAI,CAAC,MAAA,GAAS,QAAQ,CAAA,EAAG;AACvB,IAAA;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,0BAAA,EAA4B;AAAA,IACnD,QAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,EAAS,yBAAA,CAA0B,OAAA,EAAS,MAAA,CAAO,SAAS;AAAA,GAC7D,CAAA;AACH;AAGA,SAAS,gBAAA,CAAiB,KAAkB,QAAA,EAA0B;AACpE,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,aAAA,CAAc,aAAA;AACjB,MAAA,OAAO,MAAA,CAAO,sBAAsB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,IAAY,CAAA;AAAA,IACrE,KAAK,aAAA,CAAc,aAAA;AACjB,MAAA,OAAO,MAAA,CAAO,sBAAsB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,IAAY,CAAA;AAAA,IACrE,KAAK,aAAA,CAAc,aAAA;AACjB,MAAA,OAAO,MAAA,CAAO,sBAAsB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,IAAY,CAAA;AAAA,IACrE;AACE,MAAA,OAAO,MAAA,CAAO,qBAAqB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,IAAY,CAAA;AAAA;AAExE;AASA,eAAe,MAAA,CACb,GAAA,EACA,EAAA,EACA,QAAA,EACA,YACA,SAAA,EACuB;AACvB,EAAA,IAAI,CAAC,GAAA,CAAI,WAAA,EAAY,EAAG;AACtB,IAAA,OAAO,GAAA,CAAI,aAAA,CAAc,eAAA,EAAiB,MAAA,CAAO,sBAAsB,CAAC,CAAA;AAAA,EAC1E;AACA,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,EAAA,EAAG;AAAA,EAClB,SACO,KAAA,EAAO;AACZ,IAAA,GAAA,CAAI,OAAO,KAAA,CAAM,UAAA,EAAY,EAAE,GAAG,SAAA,EAAW,OAAO,CAAA;AACpD,IAAA,OAAO,GAAA,CAAI,UAAU,gBAAA,CAAiB,QAAA,EAAU,OAAO,KAAK,CAAC,GAAG,KAAK,CAAA;AAAA,EACvE;AACF;AASO,SAAS,uBAAA,CAAwB,KAAsB,MAAA,EAAgD;AAC5G,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAO,IAAA,EAAM,OAAA,KAAY;AAE/B,MAAA,IAAI,CAAC,OAAO,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA,IAAK,OAAA,CAAQ,aAAa,CAAA,EAAG;AAClE,QAAA,OAAO,GAAA;AAAA,UACL,aAAA,CAAc,kBAAA;AAAA,UACd,MAAA,CAAO,wBAAA,EAA0B,EAAE,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAE,EAAG;AAAA,SACvF;AAAA,MACF;AACA,MAAA,iBAAA,CAAkB,KAAK,OAAA,EAAS,mBAAA,EAAqB,EAAE,IAAA,EAAM,SAAS,CAAA;AACtE,MAAA,OAAO,MAAA;AAAA,QACL,GAAA;AAAA,QACA,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA;AAAA,QACjC,aAAA,CAAc,YAAA;AAAA,QACd,6BAAA;AAAA,QACA,EAAE,IAAA;AAAK,OACT;AAAA,IACF,CAAA;AAAA,IACA,IAAA,EAAM,CAAC,IAAA,KAAS;AACd,MAAA,iBAAA,CAAkB,GAAA,EAAK,OAAA,EAAS,iBAAA,EAAmB,EAAE,MAAM,CAAA;AAC3D,MAAA,OAAO,MAAA;AAAA,QACL,GAAA;AAAA,QACA,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,QACtB,aAAA,CAAc,aAAA;AAAA,QACd,2BAAA;AAAA,QACA,EAAE,IAAA;AAAK,OACT;AAAA,IACF,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,IAAA,KAAS;AAChB,MAAA,iBAAA,CAAkB,GAAA,EAAK,MAAA,EAAQ,mBAAA,EAAqB,EAAE,MAAM,CAAA;AAC5D,MAAA,OAAO,MAAA;AAAA,QACL,GAAA;AAAA,QACA,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,QACxB,aAAA,CAAc,YAAA;AAAA,QACd,4BAAA;AAAA,QACA,EAAE,IAAA;AAAK,OACT;AAAA,IACF,CAAA;AAAA,IACA,IAAA,EAAM,CAAC,IAAA,KAAS;AACd,MAAA,iBAAA,CAAkB,GAAA,EAAK,MAAA,EAAQ,iBAAA,EAAmB,EAAE,MAAM,CAAA;AAC1D,MAAA,OAAO,MAAA;AAAA,QACL,GAAA;AAAA,QACA,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,QACtB,aAAA,CAAc,YAAA;AAAA,QACd,+BAAA;AAAA,QACA,EAAE,IAAA;AAAK,OACT;AAAA,IACF,CAAA;AAAA,IACA,MAAM,MAAM;AACV,MAAA,iBAAA,CAAkB,GAAA,EAAK,MAAA,EAAQ,iBAAA,EAAmB,EAAE,CAAA;AACpD,MAAA,OAAO,MAAA;AAAA,QACL,GAAA;AAAA,QACA,MAAM,OAAO,IAAA,EAAK;AAAA,QAClB,aAAA,CAAc,YAAA;AAAA,QACd;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AAQO,SAAS,mBAAA,CAAoB,KAAsB,MAAA,EAAwC;AAChG,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,CAAC,UAAA,EAAY,SAAA,KAAc;AACjC,MAAA,iBAAA,CAAkB,GAAA,EAAK,SAAS,eAAA,EAAiB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,MAAA,EAAQ,SAAA,EAAW,CAAA;AACnG,MAAA,OAAO,MAAA;AAAA,QACL,GAAA;AAAA,QACA,MAAM,SAAA,CAAU,MAAA,KAAW,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,EAAA,CAAG,MAAS,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,YAAY,SAAS,CAAA;AAAA,QACnG,aAAA,CAAc,aAAA;AAAA,QACd,0BAAA;AAAA,QACA,EAAE,UAAA;AAAW,OACf;AAAA,IACF,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,UAAA,EAAY,SAAA,KAAc;AACjC,MAAA,iBAAA,CAAkB,GAAA,EAAK,SAAS,eAAA,EAAiB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,MAAA,EAAQ,SAAA,EAAW,CAAA;AACnG,MAAA,OAAO,MAAA;AAAA,QACL,GAAA;AAAA,QACA,MAAM,SAAA,CAAU,MAAA,KAAW,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,EAAA,CAAG,MAAS,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,YAAY,SAAS,CAAA;AAAA,QACnG,aAAA,CAAc,aAAA;AAAA,QACd,0BAAA;AAAA,QACA,EAAE,UAAA;AAAW,OACf;AAAA,IACF,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,UAAA,EAAY,GAAA,KAAQ;AAC3B,MAAA,iBAAA,CAAkB,GAAA,EAAK,SAAS,eAAA,EAAiB,EAAE,YAAY,KAAA,EAAO,GAAA,CAAI,MAAA,EAAQ,GAAA,EAAK,CAAA;AACvF,MAAA,OAAO,MAAA;AAAA,QACL,GAAA;AAAA,QACA,MAAM,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,EAAA,CAAG,MAAS,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,QACvF,aAAA,CAAc,aAAA;AAAA,QACd,0BAAA;AAAA,QACA,EAAE,UAAA;AAAW,OACf;AAAA,IACF,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,UAAA,EAAY,MAAA,EAAQ,OAAA,KAAY;AACvC,MAAA,iBAAA,CAAkB,KAAK,MAAA,EAAQ,eAAA,EAAiB,EAAE,UAAA,EAAY,MAAA,EAAQ,SAAS,CAAA;AAC/E,MAAA,OAAO,MAAA;AAAA,QACL,GAAA;AAAA,QACA,MAAM,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,QAAQ,OAAO,CAAA;AAAA,QAC/C,aAAA,CAAc,YAAA;AAAA,QACd,0BAAA;AAAA,QACA,EAAE,UAAA;AAAW,OACf;AAAA,IACF,CAAA;AAAA,IACA,KAAA,EAAO,CAAC,UAAA,KAAe;AACrB,MAAA,iBAAA,CAAkB,GAAA,EAAK,MAAA,EAAQ,cAAA,EAAgB,EAAE,YAAY,CAAA;AAC7D,MAAA,OAAO,MAAA;AAAA,QACL,GAAA;AAAA,QACA,MAAM,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,QAC7B,aAAA,CAAc,YAAA;AAAA,QACd,yBAAA;AAAA,QACA,EAAE,UAAA;AAAW,OACf;AAAA,IACF;AAAA,GACF;AACF;;;AC3RA,IAAM,MAAA,GAASA,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,CAAA;AACrE,IAAM,sBAAA,GAAyB,eAAA;AAC/B,IAAM,kBAAA,GAAqB,YAAA;AAC3B,IAAM,uBAAA,GAA0B,GAAA;AAuChC,SAAS,eAAe,KAAA,EAAuC;AAC7D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,OAAQ,MAAqC,YAAA,KAAiB,UAAA;AACtH;AAMA,IAAM,uBAAA,GAA0B;AAAA,EAC9B,IAAA,EAAM,UAAA;AAAA,EACN,MAAM,QAAA,GAAgC;AACpC,IAAA,MAAM,IAAI,MAAM,iFAAiF,CAAA;AAAA,EACnG;AACF,CAAA;AAGA,SAAS,cAAc,MAAA,EAAgC;AACrD,EAAA,IAAI,MAAA,KAAW,WAAA;AACb,IAAA,OAAO,IAAA;AACT,EAAA,IAAI,MAAA,KAAW,KAAA;AACb,IAAA,OAAO,IAAA;AACT,EAAA,OAAO,QAAA;AACT;AAGA,SAAS,gBAAgB,KAAA,EAAgC;AACvD,EAAA,IAAI,KAAA,KAAU,IAAA;AACZ,IAAA,OAAO,WAAA;AACT,EAAA,IAAI,KAAA,KAAU,IAAA;AACZ,IAAA,OAAO,KAAA;AACT,EAAA,OAAO,QAAA;AACT;AAGA,SAAS,eAAA,CAAgB,UAAkB,MAAA,EAAgC;AACzE,EAAA,IAAI,MAAA,KAAW,QAAA;AACb,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,QAAQ,CAAC,CAAA;AAC9C,EAAA,OAAO,CAAA,IAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,QAAQ,CAAA,CAAA;AACtC;AAGA,SAAS,WAAW,MAAA,EAAuE;AACzF,EAAA,IAAI,CAAC,MAAA;AACH,IAAA,OAAO,MAAA;AACT,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AACrC,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA;AACrB,IAAA,OAAO,MAAA;AACT,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA;AACrB,IAAA,OAAO,EAAE,CAAC,OAAA,CAAQ,CAAC,CAAA,CAAE,CAAC,CAAC,GAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,CAAC,CAAA,EAAE;AAC1C,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO,EAAE,CAAC,GAAG,GAAG,KAAA,GAAQ,CAAA,EAAE;AACnE;AAKO,SAAS,oBAAA,GAAsC;AACpD,EAAA,IAAI,MAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,MAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,aAAA,GAAqC,IAAA;AAEzC,EAAA,SAAS,qBAAqB,KAAA,EAAyB;AACrD,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAO,OAAA,CAAQ,SAAS,UAAU,CAAA;AAAA,EACpC;AAGA,EAAA,eAAe,gBAAA,GAAqD;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,OAAO,UAAU,CAAA;AACnC,MAAA,IAAI,CAAC,cAAA,CAAe,GAAG,CAAA,EAAG;AACxB,QAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,qDAAqD,CAAA;AAC7E,QAAA,MAAA,CAAO,MAAM,8BAAA,EAAgC,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AACrE,QAAA,OAAOC,GAAAA,CAAI,aAAA,CAAc,gBAAA,EAAkB,MAAA,CAAO,sBAAA,EAAwB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,UAAA,EAAW,EAAG,GAAG,KAAK,CAAA;AAAA,MACtH;AACA,MAAA,OAAOC,GAAG,GAAG,CAAA;AAAA,IACf,SACO,KAAA,EAAO;AACZ,MAAA,IAAI,oBAAA,CAAqB,KAAK,CAAA,EAAG;AAC/B,QAAA,MAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAC9G,QAAA,OAAOD,GAAAA,CAAI,aAAA,CAAc,gBAAA,EAAkB,MAAA,CAAO,sBAAA,EAAwB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,UAAA,EAAW,EAAG,GAAG,KAAK,CAAA;AAAA,MACtH;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAGA,EAAA,SAAS,oBAAoB,YAAA,EAAkC;AAC7D,IAAA,MAAM,IAAA,GAAO,CAAC,KAAA,EAAO,QAAA,EAAU,aAAa,IAAA,IAAQ,eAAA,EAAiB,QAAA,EAAU,YAAA,CAAa,IAAA,EAAM,QAAA,EAAU,MAAA,CAAO,YAAA,CAAa,IAAI,CAAC,CAAA;AACrI,IAAA,MAAA,CAAO,IAAA,CAAK,iCAAA,EAAmC,EAAE,OAAA,EAAS,YAAA,CAAa,aAAA,EAAe,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,CAAA;AACxI,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,aAAA,EAAe,MAAM,EAAE,KAAA,EAAO,UAAU,CAAA;AACxE,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAiB;AACjC,MAAA,MAAA,CAAO,MAAM,6BAAA,EAA+B,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAAA,IACtE,CAAC,CAAA;AACD,IAAA,aAAA,GAAgB,IAAA;AAAA,EAClB;AAGA,EAAA,SAAS,kBAAA,GAA2B;AAClC,IAAA,IAAI,CAAC,aAAA;AACH,MAAA;AACF,IAAA,IAAI;AACF,MAAA,aAAA,CAAc,IAAA,EAAK;AAAA,IACrB,SACO,KAAA,EAAO;AACZ,MAAA,MAAA,CAAO,IAAA,CAAK,8BAAA,EAAgC,EAAE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAAA,IAC/G;AACA,IAAA,aAAA,GAAgB,IAAA;AAAA,EAClB;AAGA,EAAA,eAAe,gBAAA,CAAiB,cAA4B,OAAA,EAAgC;AAC1F,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAC9B,IAAA,IAAI,SAAA;AACJ,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,aAAa,SAAA,EAAU;AAC7B,QAAA;AAAA,MACF,SACO,KAAA,EAAO;AACZ,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA,MAAME,WAAM,uBAAuB,CAAA;AAAA,MACrC;AAAA,IACF;AACA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,OAAO,CAAA,IAAA,EAAO,SAAA,YAAqB,KAAA,GAAQ,SAAA,CAAU,OAAA,GAAU,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,EACxI;AAGA,EAAA,eAAe,cAAc,IAAA,EAAyC;AACpE,IAAA,OAAO,OAAQ,aAAA,CAAc,EAAE,IAAA,EAAM,iBAAA,EAAmB,yBAAyB,CAAA;AAAA,EACnF;AAGA,EAAA,SAAS,cAAc,UAAA,EAAsC;AAC3D,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,QAAA,GAAW,sBAAsB,CAAA;AAC1D,IAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,CAAA;AAAA,EAC7C;AAEA,EAAA,SAAS,iBAAA,CAAqB,UAAkB,MAAA,EAAqC;AACnF,IAAA,IAAI,QAAA,KAAa,KAAK,QAAA,KAAa,MAAA;AACjC,MAAA,OAAO,IAAA;AACT,IAAA,OAAOF,GAAAA;AAAA,MACL,aAAA,CAAc,kBAAA;AAAA,MACd,MAAA,CAAO,yBAAA,EAA2B,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,CAAO,QAAQ,CAAA,EAAG,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAA,IAAK;AAAA,KACtG;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,EAAE,WAAA,EAAa,MAAM,MAAA,KAAW,MAAM,MAAA,EAAQ,YAAA,EAAc,MAAM,MAAA,EAAQ,YAAA,EAAa;AAInG,EAAA,MAAM,gBAAA,GAAqC;AAAA,IACzC,MAAM,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS;AAC1B,MAAA,MAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAElG,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAQ,eAAA,EAAgB;AAC/C,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,CAAA,IAAA,KAAA,CAAS,OAAO,SAAS,QAAA,GAAW,IAAA,GAAO,IAAA,CAAK,IAAA,MAAU,IAAI,CAAA;AAC3F,MAAA,IAAI,MAAA;AACF,QAAA,OAAOA,GAAAA,CAAI,aAAA,CAAc,yBAAA,EAA2B,MAAA,CAAO,+BAAA,EAAiC,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAEnH,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,MAAA,EAAQ,MAAA,IAAU,QAAA;AACnD,MAAA,MAAM,OAAQ,qBAAA,CAAsB;AAAA,QAClC,IAAA;AAAA,QACA,QAAA,EAAU,EAAE,CAAC,kBAAkB,GAAG,aAAA,CAAc,MAAM,CAAA,EAAG,CAAC,sBAAsB,GAAG,OAAA,CAAQ,SAAA,EAAU;AAAA,QACrG,iBAAA,EAAmB;AAAA,OACpB,CAAA;AAED,MAAA,MAAA,CAAO,IAAA,CAAK,sBAAsB,EAAE,IAAA,EAAM,WAAW,OAAA,CAAQ,SAAA,EAAW,QAAQ,CAAA;AAChF,MAAA,OAAOC,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,KAAK,IAAA,EAAM;AACf,MAAA,MAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,IAAA,EAAM,CAAA;AAC5C,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAQ,eAAA,EAAgB;AAC/C,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,CAAA,IAAA,KAAA,CAAS,OAAO,SAAS,QAAA,GAAW,IAAA,GAAO,IAAA,CAAK,IAAA,MAAU,IAAI,CAAA;AAC3F,MAAA,IAAI,CAAC,MAAA;AACH,QAAA,OAAOD,GAAAA,CAAI,aAAA,CAAc,oBAAA,EAAsB,MAAA,CAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAEzG,MAAA,MAAM,MAAA,CAAQ,gBAAA,CAAiB,EAAE,IAAA,EAAM,CAAA;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,oBAAA,EAAsB,EAAE,IAAA,EAAM,CAAA;AAC1C,MAAA,OAAOC,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAA,MAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,IAAA,EAAM,CAAA;AACnD,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAQ,eAAA,EAAgB;AAC/C,MAAA,OAAOA,EAAAA,CAAG,QAAA,CAAS,IAAA,CAAK,CAAA,IAAA,KAAA,CAAS,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,IAAA,CAAK,IAAA,MAAU,IAAI,CAAC,CAAA;AAAA,IACzF,CAAA;AAAA,IAEA,MAAM,KAAK,IAAA,EAAM;AACf,MAAA,MAAA,CAAO,KAAA,CAAM,yBAAA,EAA2B,EAAE,IAAA,EAAM,CAAA;AAChD,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAQ,eAAA,EAAgB;AAC/C,MAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,CAAA,IAAA,KAAA,CAAS,OAAO,SAAS,QAAA,GAAW,IAAA,GAAO,IAAA,CAAK,IAAA,MAAU,IAAI,CAAA;AAC/E,QAAA,OAAOD,GAAAA,CAAI,aAAA,CAAc,oBAAA,EAAsB,MAAA,CAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAEzG,MAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc,IAAI,CAAA;AAC3C,MAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,KAAA,EAAM;AACrC,MAAA,OAAOC,EAAAA,CAAG;AAAA,QACR,IAAA;AAAA,QACA,SAAA,EAAW,cAAc,UAAU,CAAA;AAAA,QACnC,MAAA,EAAQ,eAAA,CAAgB,UAAA,CAAW,QAAA,GAAW,kBAAkB,CAAC,CAAA;AAAA,QACjE;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,IAAA,GAAO;AACX,MAAA,MAAA,CAAO,MAAM,qBAAqB,CAAA;AAClC,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAQ,eAAA,EAAgB;AAC/C,MAAA,OAAOA,EAAAA,CAAG,QAAA,CAAS,GAAA,CAAI,CAAA,IAAA,KAAS,OAAO,SAAS,QAAA,GAAW,IAAA,GAAO,IAAA,CAAK,IAAK,CAAC,CAAA;AAAA,IAC/E;AAAA,GACF;AAIA,EAAA,SAAS,cAAc,SAAA,EAAwH;AAC7I,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,SAAA,CAAU,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,EAAE,CAAA;AAAA,MAChC,UAAA,EAAY,SAAA,CAAU,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,MAAM,CAAA;AAAA,MAC3C,WAAW,SAAA,CAAU,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,WAAW,IAAI,CAAA;AAAA,MACnD,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAA,GAAA,MAAQ,EAAE,GAAG,GAAA,CAAI,QAAA,EAAU,QAAA,EAAU,GAAA,CAAI,OAAA,IAAW,EAAA,EAAG,CAAE;AAAA,KACpF;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAA6B;AAAA,IACjC,MAAM,MAAA,CAAO,UAAA,EAAY,SAAA,EAAW;AAClC,MAAA,MAAA,CAAO,MAAM,mBAAA,EAAqB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AACzE,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,UAAU,CAAA;AAC7C,MAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,MAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,QAAA,MAAM,UAAA,GAAa,iBAAA,CAAwB,QAAA,EAAU,GAAA,CAAI,OAAO,MAAM,CAAA;AACtE,QAAA,IAAI,UAAA;AACF,UAAA,OAAO,UAAA;AAAA,MACX;AACA,MAAA,MAAM,MAAA,CAAO,GAAA,CAAI,aAAA,CAAc,SAAS,CAAC,CAAA;AACzC,MAAA,MAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AACvE,MAAA,OAAOA,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,UAAA,EAAY,SAAA,EAAW;AAClC,MAAA,MAAA,CAAO,MAAM,mBAAA,EAAqB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AACzE,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,UAAU,CAAA;AAC7C,MAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,MAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,QAAA,MAAM,UAAA,GAAa,iBAAA,CAAwB,QAAA,EAAU,GAAA,CAAI,OAAO,MAAM,CAAA;AACtE,QAAA,IAAI,UAAA;AACF,UAAA,OAAO,UAAA;AAAA,MACX;AACA,MAAA,MAAM,MAAA,CAAO,MAAA,CAAO,aAAA,CAAc,SAAS,CAAC,CAAA;AAC5C,MAAA,MAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AACvE,MAAA,OAAOA,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,UAAA,EAAY,GAAA,EAAK;AAC5B,MAAA,MAAA,CAAO,MAAM,kBAAA,EAAoB,EAAE,YAAY,KAAA,EAAO,GAAA,CAAI,QAAQ,CAAA;AAClE,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,UAAU,CAAA;AAC7C,MAAA,MAAM,MAAA,CAAO,MAAA,CAAO,EAAE,GAAA,EAAK,CAAA;AAC3B,MAAA,MAAA,CAAO,KAAK,iBAAA,EAAmB,EAAE,YAAY,KAAA,EAAO,GAAA,CAAI,QAAQ,CAAA;AAChE,MAAA,OAAOA,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,UAAA,EAAY,MAAA,EAAQ,OAAA,EAAS;AACxC,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,EAAA;AAC9B,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,CAAA;AACtC,MAAA,MAAA,CAAO,KAAA,CAAM,mBAAA,EAAqB,EAAE,UAAA,EAAY,IAAA,EAAM,WAAW,CAAC,CAAC,OAAA,EAAS,MAAA,EAAQ,CAAA;AAEpF,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,UAAU,CAAA;AAC7C,MAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,MAAA,MAAM,UAAA,GAAa,iBAAA,CAAwC,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAClF,MAAA,IAAI,UAAA;AACF,QAAA,OAAO,UAAA;AAET,MAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,MAAA,CAAO,QAAA,GAAW,kBAAkB,CAAC,CAAA;AACpE,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,KAAA,CAAM,EAAE,iBAAiB,CAAC,MAAM,CAAA,EAAG,QAAA,EAAU,MAAM,KAAA,EAAO,UAAA,CAAW,OAAA,EAAS,MAAM,GAAG,CAAA;AAErH,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,CAAC,KAAK,EAAC;AAChC,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,SAAA,GAAY,CAAC,KAAK,EAAC;AAC9C,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,SAAA,GAAY,CAAC,KAAK,EAAC;AAE9C,MAAA,MAAM,UAAgC,EAAC;AACvC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,QAAA,MAAM,QAAQ,eAAA,CAAgB,SAAA,CAAU,CAAC,CAAA,IAAK,GAAG,MAAM,CAAA;AACvD,QAAA,IAAI,KAAA,GAAQ,QAAA;AACV,UAAA;AACF,QAAA,MAAM,QAAA,GAAW,SAAA,CAAU,CAAC,CAAA,IAAK,EAAC;AAClC,QAAA,MAAM,EAAE,QAAA,EAAU,GAAG,IAAA,EAAK,GAAI,QAAA;AAC9B,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,UACT,KAAA;AAAA,UACA,SAAS,OAAO,QAAA,KAAa,YAAY,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,GAAW,MAAA;AAAA,UAC1E,UAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,IAAI,IAAA,GAAO;AAAA,SACjD,CAAA;AAAA,MACH;AACA,MAAA,OAAOA,GAAG,OAAO,CAAA;AAAA,IACnB,CAAA;AAAA,IAEA,MAAM,MAAM,UAAA,EAAY;AACtB,MAAA,MAAA,CAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,UAAA,EAAY,CAAA;AAC/C,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,UAAU,CAAA;AAC7C,MAAA,OAAOA,EAAAA,CAAG,MAAM,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,IAChC;AAAA,GACF;AAIA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IAEN,MAAM,QAAQ,GAAA,EAA+B;AAC3C,MAAA,IAAI,IAAI,IAAA,KAAS,QAAA;AACf,QAAA,OAAOD,GAAAA,CAAI,aAAA,CAAc,gBAAA,EAAkB,MAAA,CAAO,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,EAAG,CAAC,CAAA;AAE5G,MAAA,MAAM,YAAA,GAAe,GAAA;AACrB,MAAA,MAAM,WAAW,CAAC,CAAC,YAAA,CAAa,IAAA,IAAQ,CAAC,YAAA,CAAa,GAAA;AAEtD,MAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,EAAiB;AAC1C,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA;AACd,QAAA,OAAO,UAAA;AAET,MAAA,IAAI;AACF,QAAA,IAAI,QAAA;AACF,UAAA,mBAAA,CAAoB,YAAY,CAAA;AAElC,QAAA,MAAM,YAAA,GAAwC,YAAA,CAAa,GAAA,GACvD,EAAE,MAAM,YAAA,CAAa,GAAA,EAAI,GACzB,EAAE,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,IAAA,EAAM,aAAa,IAAA,EAAK;AACvD,QAAA,IAAI,YAAA,CAAa,MAAA;AACf,UAAA,YAAA,CAAa,IAAA,GAAO,EAAE,QAAA,EAAU,OAAA,EAAS,aAAa,YAAA,CAAa,MAAA,EAAQ,iBAAiB,eAAA,EAAgB;AAG9G,QAAA,MAAM,YAAA,GAAe,IAAI,UAAA,CAAW,IAAA,CAAK,aAAa,YAAY,CAAA;AAClE,QAAA,MAAM,gBAAA,CAAiB,YAAA,EAAc,QAAA,GAAW,YAAA,CAAa,iBAAiB,GAAI,CAAA;AAElF,QAAA,MAAA,GAAS,YAAA;AACT,QAAA,MAAA,GAAS,YAAA;AACT,QAAA,MAAA,CAAO,IAAA,CAAK,kBAAA,EAAoB,EAAE,QAAA,EAAU,IAAA,EAAM,aAAa,IAAA,EAAM,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,CAAA;AAC9F,QAAA,OAAOC,GAAG,KAAA,CAAS,CAAA;AAAA,MACrB,SACO,KAAA,EAAO;AACZ,QAAA,kBAAA,EAAmB;AACnB,QAAA,MAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAC7G,QAAA,OAAOD,GAAAA,CAAI,aAAA,CAAc,iBAAA,EAAmB,MAAA,CAAO,0BAA0B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC3H;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,KAAA,GAAkC;AACtC,MAAA,kBAAA,EAAmB;AACnB,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,MAAA,CAAO,KAAK,0BAA0B,CAAA;AACtC,MAAA,OAAOC,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,WAAA,GAAuB;AACrB,MAAA,OAAO,MAAA,KAAW,IAAA;AAAA,IACpB,CAAA;AAAA,IAEA,UAAA,EAAY,uBAAA,CAAwB,GAAA,EAAK,gBAAgB,CAAA;AAAA,IACzD,MAAA,EAAQ,mBAAA,CAAoB,GAAA,EAAK,YAAY;AAAA,GAC/C;AACF;ACpZA,IAAME,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAE7C,IAAMC,OAAAA,GAASL,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,CAAA;AAoCtE,SAAS,uBAAuB,KAAA,EAAuB;AACrD,EAAA,OAAO,KAAA,CACJ,OAAA,CAAQ,KAAA,EAAO,MAAM,EACrB,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CACnB,QAAQ,IAAA,EAAM,KAAK,CAAA,CACnB,OAAA,CAAQ,MAAM,KAAK,CAAA;AACxB;AAGA,SAAS,oBAAoB,KAAA,EAAuB;AAClD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,IAAM,CAAA;AACnC;AAiBO,SAAS,qBAAA,GAAuC;AACrD,EAAA,IAAI,UAAA,GAAqC,IAAA;AACzC,EAAA,IAAI,MAAA,GAA+B,IAAA;AAGnC,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAA4B;AAWxD,EAAA,SAAS,WAAA,GAA4D;AACnE,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMI,SAAQ,kBAAkB,CAAA;AACtC,MAAA,OAAOF,GAAG,GAAG,CAAA;AAAA,IACf,SACO,KAAA,EAAO;AACZ,MAAAG,OAAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,EAAE,OAAO,CAAA;AACzD,MAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,gBAAA,EAAkB,MAAA,CAAO,sBAAA,EAAwB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,kBAAA,EAAmB,EAAG,GAAG,KAAK,CAAA;AAAA,IAC9H;AAAA,EACF;AAKA,EAAA,eAAe,UAAU,IAAA,EAA0C;AACjE,IAAA,IAAI,CAAC,UAAA;AACH,MAAA,OAAO,IAAA;AACT,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,UAAA,EAAW;AAC/C,MAAA,IAAI,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA,EAAG;AAC7B,QAAA,OAAO,MAAM,UAAA,CAAW,SAAA,CAAU,IAAI,CAAA;AAAA,MACxC;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MACM;AACJ,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,SAAS,uBAAuB,IAAA,EAA6B;AAC3D,IAAA,OAAO,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,EAAG,SAAA,IAAa,IAAA;AAAA,EACjD;AAGA,EAAA,SAAS,6BAAA,CAAiC,UAAkB,MAAA,EAA8B;AACxF,IAAA,OAAOA,GAAAA;AAAA,MACL,aAAA,CAAc,kBAAA;AAAA,MACd,OAAO,yBAAA,EAA2B;AAAA,QAChC,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,CAAO,QAAQ,CAAA,EAAG,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAA;AAAE,OAC9D;AAAA,KACH;AAAA,EACF;AAGA,EAAA,SAAS,uBAAA,CAA2B,YAAoB,MAAA,EAAuC;AAC7F,IAAA,MAAM,QAAA,GAAW,uBAAuB,UAAU,CAAA;AAClD,IAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,MAAA,CAAO,MAAA,KAAW,QAAA,EAAU;AACnD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,6BAAA,CAAiC,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,EACjE;AAGA,EAAA,SAAS,0BAAA,CAA2B,YAAoB,SAAA,EAAqD;AAC3G,IAAA,MAAM,QAAA,GAAW,uBAAuB,UAAU,CAAA;AAClD,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI,QAAA,CAAS,MAAA,CAAO,MAAA,KAAW,QAAA,EAAU;AACvC,QAAA,OAAO,6BAAA,CAAoC,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAAA,MAC7E;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAIA,EAAA,MAAM,GAAA,GAAM,EAAE,WAAA,EAAa,MAAM,UAAA,KAAe,IAAA,EAAM,MAAA,EAAAI,OAAAA,EAAQ,YAAA,EAAc,MAAM,MAAA,EAAQ,YAAA,EAAa;AAIvG,EAAA,MAAM,gBAAA,GAAqC;AAAA,IACzC,MAAM,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS;AAC1B,MAAAA,OAAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAElG,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAY,UAAA,EAAW;AAChD,MAAA,IAAI,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA,EAAG;AAC7B,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,yBAAA,EAA2B,MAAA,CAAO,+BAAA,EAAiC,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MACnH;AAGA,MAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,MAAA,EAAQ,MAAA,IAAU,QAAA;AACnD,MAAA,MAAM,UAAA,GAAa;AAAA,QACjB,EAAA,EAAI,UAAA;AAAA,QACJ,MAAA,EAAQ,MAAM,IAAA,CAAK,EAAE,QAAQ,SAAA,EAAW,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AAAA,QAChD,OAAA,EAAS,EAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACZ;AAEA,MAAA,MAAM,QAAQ,MAAM,UAAA,CAAY,YAAY,IAAA,EAAM,CAAC,UAAU,CAAC,CAAA;AAE9D,MAAA,MAAM,KAAA,CAAM,OAAO,iBAAmB,CAAA;AAEtC,MAAA,eAAA,CAAgB,GAAA,CAAI,IAAA,EAAM,EAAE,SAAA,EAAW,QAAQ,CAAA;AAE/C,MAAAI,QAAO,IAAA,CAAK,oBAAA,EAAsB,EAAE,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAA;AAC7D,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,KAAK,IAAA,EAAM;AACf,MAAAG,OAAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,MAAM,CAAA;AAE5C,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAY,UAAA,EAAW;AAChD,MAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA,EAAG;AAC9B,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,oBAAA,EAAsB,MAAA,CAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MACzG;AAEA,MAAA,MAAM,UAAA,CAAY,UAAU,IAAI,CAAA;AAChC,MAAA,eAAA,CAAgB,OAAO,IAAI,CAAA;AAE3B,MAAAI,OAAAA,CAAO,IAAA,CAAK,oBAAA,EAAsB,EAAE,MAAM,CAAA;AAC1C,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAAG,OAAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,MAAM,CAAA;AAEnD,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAY,UAAA,EAAW;AAChD,MAAA,OAAOH,EAAAA,CAAG,UAAA,CAAW,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IACrC,CAAA;AAAA,IAEA,MAAM,KAAK,IAAA,EAAM;AACf,MAAAG,OAAAA,CAAO,KAAA,CAAM,yBAAA,EAA2B,EAAE,MAAM,CAAA;AAEhD,MAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,IAAI,CAAA;AAClC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,oBAAA,EAAsB,MAAA,CAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MACzG;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,SAAA,EAAU;AACpC,MAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AAErC,MAAA,OAAOC,EAAAA,CAAG;AAAA,QACR,IAAA;AAAA,QACA,SAAA,EAAW,MAAM,SAAA,IAAa,CAAA;AAAA,QAC9B,MAAA,EAAS,IAAA,EAAM,MAAA,IAAU,MAAA,EAAQ,MAAA,IAAU,QAAA;AAAA,QAC3C;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,IAAA,GAAO;AACX,MAAAG,OAAAA,CAAO,MAAM,qBAAqB,CAAA;AAElC,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAY,UAAA,EAAW;AAChD,MAAA,OAAOH,GAAG,UAAU,CAAA;AAAA,IACtB;AAAA,GACF;AAIA,EAAA,MAAM,YAAA,GAA6B;AAAA,IACjC,MAAM,MAAA,CAAO,UAAA,EAAY,SAAA,EAAW;AAClC,MAAAG,OAAAA,CAAO,MAAM,mBAAA,EAAqB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AAEzE,MAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,UAAU,CAAA;AACxC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,oBAAA,EAAsB,MAAA,CAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAA,EAAW,EAAG,CAAC,CAAA;AAAA,MACrH;AAEA,MAAA,MAAM,mBAAA,GAAsB,0BAAA,CAA2B,UAAA,EAAY,SAAS,CAAA;AAC5E,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,OAAO,mBAAA;AAAA,MACT;AAEA,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,QACpC,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,OAAA,EAAS,IAAI,OAAA,IAAW,EAAA;AAAA,QACxB,UAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,IAAY,EAAE;AAAA,OAC7C,CAAE,CAAA;AAEF,MAAA,MAAM,KAAA,CAAM,IAAI,OAAO,CAAA;AAEvB,MAAAI,OAAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AACvE,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,UAAA,EAAY,SAAA,EAAW;AAClC,MAAAG,OAAAA,CAAO,MAAM,mBAAA,EAAqB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AAEzE,MAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,UAAU,CAAA;AACxC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,oBAAA,EAAsB,MAAA,CAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAA,EAAW,EAAG,CAAC,CAAA;AAAA,MACrH;AAEA,MAAA,MAAM,mBAAA,GAAsB,0BAAA,CAA2B,UAAA,EAAY,SAAS,CAAA;AAC5E,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,OAAO,mBAAA;AAAA,MACT;AAEA,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,QACpC,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,OAAA,EAAS,IAAI,OAAA,IAAW,EAAA;AAAA,QACxB,UAAU,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,IAAY,EAAE;AAAA,OAC7C,CAAE,CAAA;AAEF,MAAA,IAAI,OAAO,KAAA,CAAM,WAAA,KAAgB,UAAA,EAAY;AAC3C,QAAA,MAAM,KAAA,CACH,YAAY,IAAI,CAAA,CAChB,sBAAqB,CACrB,uBAAA,EAAwB,CACxB,OAAA,CAAQ,OAAO,CAAA;AAAA,MACpB,CAAA,MACK;AACH,QAAAI,OAAAA,CAAO,KAAK,uEAAuE,CAAA;AACnF,QAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAA,EAAI,mBAAA,CAAoB,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC1E,QAAA,MAAM,KAAA,CAAM,MAAA,CAAO,CAAA,OAAA,EAAU,GAAG,CAAA,CAAA,CAAG,CAAA;AACnC,QAAA,MAAM,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,MACzB;AAEA,MAAAA,OAAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AACvE,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,UAAA,EAAY,GAAA,EAAK;AAC5B,MAAAG,OAAAA,CAAO,MAAM,kBAAA,EAAoB,EAAE,YAAY,KAAA,EAAO,GAAA,CAAI,QAAQ,CAAA;AAElE,MAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,UAAU,CAAA;AACxC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,oBAAA,EAAsB,MAAA,CAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAA,EAAW,EAAG,CAAC,CAAA;AAAA,MACrH;AAEA,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,CAAA,EAAA,KAAM,CAAA,CAAA,EAAI,mBAAA,CAAoB,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACtE,MAAA,MAAM,KAAA,CAAM,MAAA,CAAO,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,CAAG,CAAA;AAEtC,MAAAI,OAAAA,CAAO,KAAK,iBAAA,EAAmB,EAAE,YAAY,KAAA,EAAO,GAAA,CAAI,QAAQ,CAAA;AAChE,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,UAAA,EAAY,MAAA,EAAQ,OAAA,EAAS;AACxC,MAAAG,OAAAA,CAAO,KAAA,CAAM,mBAAA,EAAqB,EAAE,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,CAAC,CAAC,OAAA,EAAS,QAAQ,CAAA;AAEnG,MAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,UAAU,CAAA;AACxC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,oBAAA,EAAsB,MAAA,CAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAA,EAAW,EAAG,CAAC,CAAA;AAAA,MACrH;AAEA,MAAA,MAAM,mBAAA,GAAsB,uBAAA,CAA8C,UAAA,EAAY,MAAM,CAAA;AAC5F,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,OAAO,mBAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,EAAA;AAC9B,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,CAAA;AAEtC,MAAA,IAAI,QAAQ,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAE,MAAM,IAAI,CAAA;AAG3C,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,MAAM,cAAwB,EAAC;AAC/B,QAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AAEzD,UAAA,WAAA,CAAY,IAAA,CAAK,CAAA,iBAAA,EAAoB,sBAAA,CAAuB,GAAG,CAAC,CAAA,GAAA,EAAM,sBAAA,CAAuB,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA,GAAA,CAAK,CAAA;AAAA,QAClH;AACA,QAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,UAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,QAC/C;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,OAAA,EAAQ;AAEpC,MAAA,MAAM,aAAA,GAAsC,OAAA,CACzC,GAAA,CAAI,CAAC,GAAA,KAAiC;AAErC,QAAA,MAAM,QAAA,GAAY,IAAI,SAAA,IAAwB,CAAA;AAC9C,QAAA,MAAM,KAAA,GAAQ,KAAK,CAAA,GAAI,QAAA,CAAA;AAEvB,QAAA,OAAO;AAAA,UACL,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,KAAA;AAAA,UACA,OAAA,EAAU,IAAI,OAAA,IAAsB,MAAA;AAAA,UACpC,UAAU,GAAA,CAAI,QAAA,GAAW,KAAK,KAAA,CAAM,GAAA,CAAI,QAAkB,CAAA,GAA+B;AAAA,SAC3F;AAAA,MACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAA0B,CAAA,CAAE,SAAS,QAAQ,CAAA;AAExD,MAAA,OAAOC,GAAG,aAAa,CAAA;AAAA,IACzB,CAAA;AAAA,IAEA,MAAM,MAAM,UAAA,EAAY;AACtB,MAAAG,OAAAA,CAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,YAAY,CAAA;AAE/C,MAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,UAAU,CAAA;AACxC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,oBAAA,EAAsB,MAAA,CAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAA,EAAW,EAAG,CAAC,CAAA;AAAA,MACrH;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,SAAA,EAAU;AACpC,MAAA,OAAOC,GAAG,KAAK,CAAA;AAAA,IACjB;AAAA,GACF;AAIA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IAEN,MAAM,QAAQ,GAAA,EAA+B;AAC3C,MAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAC1B,QAAA,OAAOD,GAAAA,CAAI,aAAA,CAAc,gBAAA,EAAkB,MAAA,CAAO,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MAC5G;AAEA,MAAA,MAAM,WAAA,GAAc,GAAA;AACpB,MAAA,MAAM,aAAa,WAAA,EAAY;AAC/B,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA;AACd,QAAA,OAAO,UAAA;AAET,MAAA,MAAM,UAAU,UAAA,CAAW,IAAA;AAE3B,MAAA,IAAI;AAEF,QAAA,UAAA,GAAa,MAAM,OAAA,CAAQ,OAAA,CAAQ,WAAA,CAAY,IAAI,CAAA;AACnD,QAAA,MAAA,GAAS,WAAA;AAKT,QAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAY,UAAA,EAAW;AAChD,QAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,UAAA,CAAW,GAAA,CAAI,OAAO,IAAA,KAAS;AACtD,UAAA,IAAI;AACF,YAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAY,SAAA,CAAU,IAAI,CAAA;AAC9C,YAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,SAAA,EAAU;AACpC,YAAA,IAAI,KAAA,KAAU,CAAA;AACZ,cAAA;AAEF,YAAA,MAAM,OAAO,MAAM,KAAA,CAAM,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,KAAK,CAAC,CAAC,EAAE,KAAA,CAAM,CAAC,EAAE,OAAA,EAAQ;AACpF,YAAA,IAAI,KAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,CAAC,EAAE,MAAA,EAAQ;AACrC,cAAA,eAAA,CAAgB,IAAI,IAAA,EAAM;AAAA,gBACxB,SAAA,EAAY,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,CAAoB,MAAA;AAAA,gBACxC,MAAA,EAAQ,YAAY,MAAA,IAAU;AAAA,eAC/B,CAAA;AAAA,YACH;AAAA,UACF,CAAA,CAAA,MACM;AAAA,UAEN;AAAA,QACF,CAAC,CAAC,CAAA;AAEF,QAAAI,QAAO,IAAA,CAAK,mBAAA,EAAqB,EAAE,IAAA,EAAM,WAAA,CAAY,MAAM,CAAA;AAC3D,QAAA,OAAOH,GAAG,KAAA,CAAS,CAAA;AAAA,MACrB,SACO,KAAA,EAAO;AACZ,QAAAG,OAAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,OAAO,CAAA;AACtD,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,iBAAA,EAAmB,MAAA,CAAO,0BAA0B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC3H;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,KAAA,GAAkC;AACtC,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,eAAA,CAAgB,KAAA,EAAM;AACtB,MAAAI,OAAAA,CAAO,KAAK,2BAA2B,CAAA;AACvC,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,WAAA,GAAuB;AACrB,MAAA,OAAO,UAAA,KAAe,IAAA;AAAA,IACxB,CAAA;AAAA,IAEA,UAAA,EAAY,uBAAA,CAAwB,GAAA,EAAK,gBAAgB,CAAA;AAAA,IACzD,MAAA,EAAQ,mBAAA,CAAoB,GAAA,EAAK,YAAY;AAAA,GAC/C;AACF;ACtcA,IAAMG,OAAAA,GAASL,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,UAAA,EAAY,CAAA;AAavE,SAAS,WAAW,KAAA,EAAmC;AACrD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA;AACpB,EAAA,OAAO,OAAO,YAAY,IAAA,KAAS,UAAA;AACrC;AAOO,SAAS,sBAAA,GAAwC;AACtD,EAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,EAAA,IAAI,MAAA,GAAgC,IAAA;AAKpC,EAAA,SAAS,UAAU,UAAA,EAA4B;AAC7C,IAAA,OAAO,CAAA,EAAG,MAAA,EAAQ,WAAA,IAAe,MAAM,GAAG,UAAU,CAAA,CAAA;AAAA,EACtD;AAGA,EAAA,SAAS,WAAW,IAAA,EAAsB;AACxC,IAAA,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACrC;AAGA,EAAA,SAAS,UAAA,GAAqB;AAC5B,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,QAAA;AACjC,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,QAAA;AAAU,QAAA,OAAO,KAAA;AAAA,MACtB,KAAK,WAAA;AAAa,QAAA,OAAO,KAAA;AAAA,MACzB,KAAK,KAAA;AAAO,QAAA,OAAO,KAAA;AAAA,MACnB;AAAS,QAAA,OAAO,KAAA;AAAA;AAClB,EACF;AAGA,EAAA,SAASM,iBAAgB,QAAA,EAA0B;AACjD,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,QAAA;AACjC,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,QAAA;AAEH,QAAA,OAAO,IAAI,QAAA,GAAW,CAAA;AAAA,MACxB,KAAK,WAAA;AACH,QAAA,OAAO,KAAK,CAAA,GAAI,QAAA,CAAA;AAAA,MAClB,KAAK,KAAA;AAEH,QAAA,OAAO,CAAC,QAAA;AAAA,MACV;AACE,QAAA,OAAO,KAAK,CAAA,GAAI,QAAA,CAAA;AAAA;AACpB,EACF;AAGA,EAAA,SAAS,oBAAA,CAAqB,OAAgB,WAAA,EAA8B;AAC1E,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,CAAA,CAAA,EAAI,WAAW,GAAG,CAAA,IAAK,OAAA,CAAQ,QAAA,CAAS,CAAA,CAAA,EAAK,WAAW,CAAA,CAAA,CAAI,CAAA,IAAK,OAAA,CAAQ,SAAS,WAAW,CAAA;AAAA,EACvH;AAGA,EAAA,eAAe,MAAA,GAAuC;AACpD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,OAAO,IAAI,CAAA;AAC7B,MAAA,IAAI,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG;AACpB,QAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,uCAAuC,CAAA;AAC/D,QAAAD,QAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AACjE,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,gBAAA,EAAkB,MAAA,CAAO,sBAAA,EAAwB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,IAAA,EAAK,EAAG,GAAG,KAAK,CAAA;AAAA,MAChH;AAEA,MAAA,OAAOC,GAAG,GAAG,CAAA;AAAA,IACf,SACO,KAAA,EAAO;AACZ,MAAA,IAAI,oBAAA,CAAqB,KAAA,EAAO,IAAI,CAAA,EAAG;AACrC,QAAAG,OAAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAC1G,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,gBAAA,EAAkB,MAAA,CAAO,sBAAA,EAAwB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,IAAA,EAAK,EAAG,GAAG,KAAK,CAAA;AAAA,MAChH;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAGA,EAAA,eAAe,uBAAuB,IAAA,EAA0C;AAC9E,IAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAE5B,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAM,KAAA;AAAA,MAC/B,CAAA,2EAAA,CAAA;AAAA,MACA,CAAC,KAAK;AAAA,KACR;AACA,IAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,CAAC,EAAE,MAAA,EAAQ;AAChC,MAAA,OAAOA,GAAAA,CAAI,aAAA,CAAc,oBAAA,EAAsB,MAAA,CAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,IACzG;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAM,KAAA,CAAM;AAAA;AAAA;AAAA,IAAA,CAAA,EAGjC,CAAC,UAAA,CAAW,KAAK,CAAC,CAAC,CAAA;AAEtB,IAAA,OAAOC,EAAAA,CAAG,SAAA,CAAU,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,CAAA,GAAI,CAAC,CAAA;AAAA,EAC/E;AAGA,EAAA,SAAS,uBAAA,CAA2B,UAAkB,MAAA,EAAqC;AACzF,IAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAOD,GAAAA;AAAA,MACL,aAAA,CAAc,kBAAA;AAAA,MACd,OAAO,yBAAA,EAA2B;AAAA,QAChC,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,CAAO,QAAQ,CAAA,EAAG,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAA;AAAE,OAC9D;AAAA,KACH;AAAA,EACF;AAGA,EAAA,SAAS,0BAAA,CAA2B,UAAkB,SAAA,EAAqD;AACzG,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,UAAA,GAAa,uBAAA,CAA8B,QAAA,EAAU,QAAA,CAAS,OAAO,MAAM,CAAA;AACjF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAIA,EAAA,MAAM,GAAA,GAAM,EAAE,WAAA,EAAa,MAAM,IAAA,KAAS,IAAA,EAAM,MAAA,EAAAI,OAAAA,EAAQ,YAAA,EAAc,MAAM,MAAA,EAAQ,YAAA,EAAa;AAIjG,EAAA,MAAM,gBAAA,GAAqC;AAAA,IACzC,MAAM,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS;AAC1B,MAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAC5B,MAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,MAAA,EAAQ,MAAA,IAAU,QAAA;AACnD,MAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,MAAA;AAEvC,MAAAA,OAAAA,CAAO,MAAM,qBAAA,EAAuB,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,WAAW,CAAA;AAG1E,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAM,KAAA;AAAA,QAC9B,CAAA,2EAAA,CAAA;AAAA,QACA,CAAC,KAAK;AAAA,OACR;AACA,MAAA,IAAI,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,EAAQ;AAC9B,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,yBAAA,EAA2B,MAAA,CAAO,+BAAA,EAAiC,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MACnH;AAGA,MAAA,MAAM,EAAA,GAAK,WAAW,KAAK,CAAA;AAC3B,MAAA,MAAM,KAAM,KAAA,CAAM;AAAA,qBAAA,EACD,EAAE,CAAA;AAAA;AAAA,wBAAA,EAEC,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAI5B,CAAA;AAGD,MAAA,MAAM,SAAS,UAAA,EAAW;AAC1B,MAAA,MAAM,WAAW,MAAA,KAAW,KAAA,GACxB,mBAAA,GACA,MAAA,KAAW,QACT,eAAA,GACA,eAAA;AAEN,MAAA,IAAI,cAAc,MAAA,EAAQ;AACxB,QAAA,MAAM,KAAM,KAAA,CAAM;AAAA,0BAAA,EACE,EAAE;AAAA,6BAAA,EACC,QAAQ,CAAA;AAAA,QAAA,CAC9B,CAAA;AAAA,MACH,CAAA,MACK;AAGH,QAAA,MAAM,KAAM,KAAA,CAAM;AAAA,0BAAA,EACE,EAAE;AAAA,gCAAA,EACI,QAAQ,CAAA;AAAA;AAAA,QAAA,CAEjC,CAAA;AAAA,MACH;AAEA,MAAAI,OAAAA,CAAO,KAAK,oBAAA,EAAsB,EAAE,MAAM,SAAA,EAAW,MAAA,EAAQ,WAAW,CAAA;AACxE,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,KAAK,IAAA,EAAM;AACf,MAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAE5B,MAAAG,OAAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,MAAM,CAAA;AAE5C,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAM,KAAA;AAAA,QAC9B,CAAA,2EAAA,CAAA;AAAA,QACA,CAAC,KAAK;AAAA,OACR;AACA,MAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,CAAC,EAAE,MAAA,EAAQ;AAC/B,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,oBAAA,EAAsB,MAAA,CAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MACzG;AAEA,MAAA,MAAM,KAAM,KAAA,CAAM,CAAA,WAAA,EAAc,UAAA,CAAW,KAAK,CAAC,CAAA,CAAE,CAAA;AAEnD,MAAAI,OAAAA,CAAO,IAAA,CAAK,oBAAA,EAAsB,EAAE,MAAM,CAAA;AAC1C,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAAG,OAAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,MAAM,CAAA;AAEnD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAM,KAAA;AAAA,QACzB,CAAA,2EAAA,CAAA;AAAA,QACA,CAAC,SAAA,CAAU,IAAI,CAAC;AAAA,OAClB;AACA,MAAA,OAAOH,EAAAA,CAAG,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,MAAiB,CAAA;AAAA,IAC5C,CAAA;AAAA,IAEA,MAAM,KAAK,IAAA,EAAM;AACf,MAAAG,OAAAA,CAAO,KAAA,CAAM,yBAAA,EAA2B,EAAE,MAAM,CAAA;AAEhD,MAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAC5B,MAAA,MAAM,eAAA,GAAkB,MAAM,sBAAA,CAAuB,IAAI,CAAA;AACzD,MAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,QAAA,OAAO,eAAA;AAAA,MACT;AAGA,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAM,KAAA,CAAM,iCAAiC,UAAA,CAAW,KAAK,CAAC,CAAA,CAAE,CAAA;AAC1F,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,WAAA,CAAY,KAAK,CAAC,CAAA,CAAE,KAAK,CAAA,EAAG,EAAE,CAAA;AAEnE,MAAA,OAAOH,EAAAA,CAAG;AAAA,QACR,IAAA;AAAA,QACA,WAAW,eAAA,CAAgB,IAAA;AAAA,QAC3B,MAAA,EAAQ,QAAQ,MAAA,IAAU,QAAA;AAAA,QAC1B;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,IAAA,GAAO;AACX,MAAA,MAAM,MAAA,GAAS,QAAQ,WAAA,IAAe,MAAA;AAEtC,MAAAG,OAAAA,CAAO,MAAM,qBAAqB,CAAA;AAElC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAM,KAAA;AAAA,QACzB,CAAA,qGAAA,CAAA;AAAA,QACA,CAAC,CAAA,EAAG,MAAM,CAAA,CAAA,CAAG;AAAA,OACf;AACA,MAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,GAAA;AAAA,QAAI,CAAC,QAC7B,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA,CAAE,KAAA,CAAM,OAAO,MAAM;AAAA,OAC5C;AACA,MAAA,OAAOH,GAAG,KAAK,CAAA;AAAA,IACjB;AAAA,GACF;AAIA,EAAA,MAAM,YAAA,GAA6B;AAAA,IACjC,MAAM,MAAA,CAAO,UAAA,EAAY,SAAA,EAAW;AAClC,MAAA,MAAM,KAAA,GAAQ,UAAU,UAAU,CAAA;AAElC,MAAAG,OAAAA,CAAO,MAAM,mBAAA,EAAqB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AAEzE,MAAA,MAAM,eAAA,GAAkB,MAAM,sBAAA,CAAuB,UAAU,CAAA;AAC/D,MAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,QAAA,OAAO,eAAA;AAAA,MACT;AAEA,MAAA,MAAM,mBAAA,GAAsB,0BAAA,CAA2B,eAAA,CAAgB,IAAA,EAAM,SAAS,CAAA;AACtF,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,OAAO,mBAAA;AAAA,MACT;AAIA,MAAA,MAAM,EAAA,GAAK,WAAW,KAAK,CAAA;AAC3B,MAAA,MAAM,SAAmB,EAAC;AAC1B,MAAA,MAAM,SAAoB,EAAC;AAC3B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,QAAA,MAAM,OAAO,CAAA,GAAI,CAAA;AACjB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAA,EAAK,IAAA,GAAO,CAAC,CAAA,GAAA,EAAM,IAAA,GAAO,CAAC,CAAA,WAAA,EAAc,IAAA,GAAO,CAAC,CAAA,GAAA,EAAM,IAAA,GAAO,CAAC,CAAA,QAAA,CAAU,CAAA;AACrF,QAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AACvB,QAAA,MAAA,CAAO,KAAK,GAAA,CAAI,EAAA,EAAI,IAAI,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAC,KAAK,GAAA,CAAI,OAAA,IAAW,IAAI,IAAA,CAAK,SAAA,CAAU,IAAI,QAAA,IAAY,EAAE,CAAC,CAAA;AAAA,MACxG;AAEA,MAAA,MAAM,IAAA,CAAM,KAAA;AAAA,QACV,eAAe,EAAE,CAAA,wCAAA,EAA2C,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QAC7E;AAAA,OACF;AAEA,MAAAA,OAAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AACvE,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,UAAA,EAAY,SAAA,EAAW;AAClC,MAAA,MAAM,KAAA,GAAQ,UAAU,UAAU,CAAA;AAElC,MAAAG,OAAAA,CAAO,MAAM,mBAAA,EAAqB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AAEzE,MAAA,MAAM,eAAA,GAAkB,MAAM,sBAAA,CAAuB,UAAU,CAAA;AAC/D,MAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,QAAA,OAAO,eAAA;AAAA,MACT;AAEA,MAAA,MAAM,mBAAA,GAAsB,0BAAA,CAA2B,eAAA,CAAgB,IAAA,EAAM,SAAS,CAAA;AACtF,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,OAAO,mBAAA;AAAA,MACT;AAEA,MAAA,MAAM,EAAA,GAAK,WAAW,KAAK,CAAA;AAE3B,MAAA,MAAM,SAAmB,EAAC;AAC1B,MAAA,MAAM,SAAoB,EAAC;AAC3B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,QAAA,MAAM,OAAO,CAAA,GAAI,CAAA;AACjB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAA,EAAK,IAAA,GAAO,CAAC,CAAA,GAAA,EAAM,IAAA,GAAO,CAAC,CAAA,WAAA,EAAc,IAAA,GAAO,CAAC,CAAA,GAAA,EAAM,IAAA,GAAO,CAAC,CAAA,QAAA,CAAU,CAAA;AACrF,QAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AACvB,QAAA,MAAA,CAAO,KAAK,GAAA,CAAI,EAAA,EAAI,IAAI,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAC,KAAK,GAAA,CAAI,OAAA,IAAW,IAAI,IAAA,CAAK,SAAA,CAAU,IAAI,QAAA,IAAY,EAAE,CAAC,CAAA;AAAA,MACxG;AAEA,MAAA,MAAM,IAAA,CAAM,KAAA;AAAA,QACV,eAAe,EAAE,CAAA,wCAAA,EAA2C,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,uCAAA,CAAA;AAAA,QAK7E;AAAA,OACF;AAEA,MAAAA,OAAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AACvE,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,UAAA,EAAY,GAAA,EAAK;AAC5B,MAAA,MAAM,KAAA,GAAQ,UAAU,UAAU,CAAA;AAElC,MAAAG,OAAAA,CAAO,MAAM,kBAAA,EAAoB,EAAE,YAAY,KAAA,EAAO,GAAA,CAAI,QAAQ,CAAA;AAElE,MAAA,MAAM,YAAA,GAAe,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC7D,MAAA,MAAM,IAAA,CAAM,MAAM,CAAA,YAAA,EAAe,UAAA,CAAW,KAAK,CAAC,CAAA,cAAA,EAAiB,YAAY,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAEvF,MAAAA,OAAAA,CAAO,KAAK,iBAAA,EAAmB,EAAE,YAAY,KAAA,EAAO,GAAA,CAAI,QAAQ,CAAA;AAChE,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,UAAA,EAAY,MAAA,EAAQ,OAAA,EAAS;AACxC,MAAA,MAAM,KAAA,GAAQ,UAAU,UAAU,CAAA;AAClC,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,EAAA;AAC9B,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,CAAA;AACtC,MAAA,MAAM,KAAK,UAAA,EAAW;AAEtB,MAAAG,OAAAA,CAAO,KAAA,CAAM,mBAAA,EAAqB,EAAE,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,CAAC,CAAC,OAAA,EAAS,MAAA,EAAQ,CAAA;AAEpF,MAAA,MAAM,eAAA,GAAkB,MAAM,sBAAA,CAAuB,UAAU,CAAA;AAC/D,MAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,QAAA,OAAO,eAAA;AAAA,MACT;AAEA,MAAA,MAAM,mBAAA,GAAsB,uBAAA,CAA8C,eAAA,CAAgB,IAAA,EAAM,OAAO,MAAM,CAAA;AAC7G,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,OAAO,mBAAA;AAAA,MACT;AAEA,MAAA,MAAM,SAAA,GAAY,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAGtC,MAAA,IAAI,SAAA,GAAY,EAAA;AAChB,MAAA,MAAM,YAAA,GAA0B,CAAC,SAAA,EAAW,IAAI,CAAA;AAChD,MAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,MAAM,cAAwB,EAAC;AAC/B,QAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzD,UAAA,WAAA,CAAY,KAAK,CAAA,YAAA,EAAe,UAAU,CAAA,IAAA,EAAO,UAAA,GAAa,CAAC,CAAA,CAAE,CAAA;AACjE,UAAA,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AACpC,UAAA,UAAA,IAAc,CAAA;AAAA,QAChB;AACA,QAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,UAAA,SAAA,GAAY,CAAA,MAAA,EAAS,WAAA,CAAY,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AAAA,QAChD;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAM,KAAA;AAAA,QACzB,wCAAwC,EAAE,CAAA;AAAA,cAAA,EAClC,UAAA,CAAW,KAAK,CAAC;AAAA,SAAA,EACtB,SAAS;AAAA,yBAAA,EACO,EAAE,CAAA;AAAA,iBAAA,CAAA;AAAA,QAErB;AAAA,OACF;AAEA,MAAA,MAAM,aAAA,GAAsC,MAAA,CAAO,IAAA,CAChD,GAAA,CAAI,CAAC,GAAA,KAAiC;AACrC,QAAA,MAAM,KAAA,GAAQC,gBAAAA,CAAgB,GAAA,CAAI,QAAkB,CAAA;AACpD,QAAA,OAAO;AAAA,UACL,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,KAAA;AAAA,UACA,OAAA,EAAU,IAAI,OAAA,IAAsB,MAAA;AAAA,UACpC,UAAU,GAAA,CAAI;AAAA,SAChB;AAAA,MACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAA0B,CAAA,CAAE,SAAS,QAAQ,CAAA;AAExD,MAAA,OAAOJ,GAAG,aAAa,CAAA;AAAA,IACzB,CAAA;AAAA,IAEA,MAAM,MAAM,UAAA,EAAY;AACtB,MAAA,MAAM,KAAA,GAAQ,UAAU,UAAU,CAAA;AAElC,MAAAG,OAAAA,CAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,YAAY,CAAA;AAE/C,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAM,KAAA,CAAM,iCAAiC,UAAA,CAAW,KAAK,CAAC,CAAA,CAAE,CAAA;AACrF,MAAA,OAAOH,EAAAA,CAAG,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,KAAK,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IAC7D;AAAA,GACF;AAIA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IAEN,MAAM,QAAQ,GAAA,EAA+B;AAC3C,MAAA,IAAI,GAAA,CAAI,SAAS,UAAA,EAAY;AAC3B,QAAA,OAAOD,GAAAA,CAAI,aAAA,CAAc,gBAAA,EAAkB,MAAA,CAAO,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MAC5G;AAEA,MAAA,MAAM,QAAA,GAAW,GAAA;AAEjB,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,EAAO;AAChC,QAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,UAAA,OAAO,UAAA;AAAA,QACT;AAEA,QAAA,MAAM,EAAE,IAAA,EAAK,GAAI,UAAA,CAAW,IAAA;AAE5B,QAAA,MAAM,aAAa,QAAA,CAAS,GAAA,GACxB,EAAE,gBAAA,EAAkB,QAAA,CAAS,KAAI,GACjC;AAAA,UACE,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,UAAU,QAAA,CAAS,QAAA;AAAA,UACnB,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,UAAU,QAAA,CAAS;AAAA,SACrB;AAEJ,QAAA,IAAA,GAAO,IAAI,KAAK,UAAU,CAAA;AAG1B,QAAA,MAAM,IAAA,CAAK,MAAM,uCAAuC,CAAA;AAExD,QAAA,MAAA,GAAS,QAAA;AAET,QAAAI,OAAAA,CAAO,IAAA,CAAK,oBAAA,EAAsB,EAAE,IAAA,EAAM,SAAS,IAAA,EAAM,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,CAAA;AACtF,QAAA,OAAOH,GAAG,KAAA,CAAS,CAAA;AAAA,MACrB,SACO,KAAA,EAAO;AAEZ,QAAAG,OAAAA,CAAO,KAAA,CAAM,+BAAA,EAAiC,EAAE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAC/G,QAAA,OAAOJ,IAAI,aAAA,CAAc,iBAAA,EAAmB,OAAO,wBAAA,EAA0B,EAAE,QAAQ,EAAE,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,MAAA,CAAO,KAAK,GAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACpK;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,KAAA,GAAkC;AACtC,MAAA,IAAI;AACF,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAM,KAAK,GAAA,EAAI;AAAA,QACjB;AACA,QAAA,IAAA,GAAO,IAAA;AACP,QAAA,MAAA,GAAS,IAAA;AACT,QAAAI,OAAAA,CAAO,KAAK,4BAA4B,CAAA;AACxC,QAAA,OAAOH,GAAG,KAAA,CAAS,CAAA;AAAA,MACrB,SACO,KAAA,EAAO;AACZ,QAAAG,OAAAA,CAAO,KAAA,CAAM,qCAAA,EAAuC,EAAE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AACrH,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,iBAAA,EAAmB,MAAA,CAAO,qBAAqB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACtH;AAAA,IACF,CAAA;AAAA,IAEA,WAAA,GAAuB;AACrB,MAAA,OAAO,IAAA,KAAS,IAAA;AAAA,IAClB,CAAA;AAAA,IAEA,UAAA,EAAY,uBAAA,CAAwB,GAAA,EAAK,gBAAgB,CAAA;AAAA,IACzD,MAAA,EAAQ,mBAAA,CAAoB,GAAA,EAAK,YAAY;AAAA,GAC/C;AACF;ACvfA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,IAAI,MAAA,CAAO,QAAA;AACT,MAAA,MAAA,CAAO,QAAA,GAAW,KAAA;AACpB,IAAA,IAAI,MAAA,CAAO,QAAA;AACT,MAAA,MAAA,CAAO,QAAA,GAAW,KAAA;AACpB,IAAA,OAAO,OAAO,QAAA,EAAS;AAAA,EACzB,CAAA,CAAA,MACM;AACJ,IAAA,OAAO,eAAA;AAAA,EACT;AACF;AAEA,IAAMI,OAAAA,GAASL,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,CAAA;AAmCrE,SAAS,eAAe,KAAA,EAAuC;AAC7D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA;AACpB,EAAA,OAAO,OAAO,YAAY,YAAA,KAAiB,UAAA;AAC7C;AAQA,SAAS,WAAW,EAAA,EAAoB;AACtC,EAAA,MAAM,IAAA,GAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,EAAE,CAAA,CAAE,OAAO,KAAK,CAAA;AACzD,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA;AACnH;AAKA,SAAS,iBAAiB,MAAA,EAAgC;AACxD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,QAAA;AAAU,MAAA,OAAO,QAAA;AAAA,IACtB,KAAK,WAAA;AAAa,MAAA,OAAO,QAAA;AAAA,IACzB,KAAK,KAAA;AAAO,MAAA,OAAO,KAAA;AAAA,IACnB;AAAS,MAAA,OAAO,QAAA;AAAA;AAEpB;AAOO,SAAS,oBAAA,GAAsC;AACpD,EAAA,IAAI,MAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,MAAA,GAA8B,IAAA;AAKlC,EAAA,SAAS,oBAAA,CAAqB,OAAgB,WAAA,EAA8B;AAC1E,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,CAAA,CAAA,EAAI,WAAW,GAAG,CAAA,IAAK,OAAA,CAAQ,QAAA,CAAS,CAAA,CAAA,EAAK,WAAW,CAAA,CAAA,CAAI,CAAA,IAAK,OAAA,CAAQ,SAAS,WAAW,CAAA;AAAA,EACvH;AAGA,EAAA,eAAe,gBAAA,GAAqD;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,OAAO,wBAAwB,CAAA;AACjD,MAAA,IAAI,CAAC,cAAA,CAAe,GAAG,CAAA,EAAG;AACxB,QAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,mEAAmE,CAAA;AAC3F,QAAAK,QAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AACrE,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,gBAAA,EAAkB,MAAA,CAAO,sBAAA,EAAwB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,wBAAA,EAAyB,EAAG,GAAG,KAAK,CAAA;AAAA,MACpI;AAEA,MAAA,OAAOC,GAAG,GAAG,CAAA;AAAA,IACf,SACO,KAAA,EAAO;AACZ,MAAA,IAAI,oBAAA,CAAqB,KAAA,EAAO,wBAAwB,CAAA,EAAG;AACzD,QAAAG,OAAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAC9G,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,gBAAA,EAAkB,MAAA,CAAO,sBAAA,EAAwB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,wBAAA,EAAyB,EAAG,GAAG,KAAK,CAAA;AAAA,MACpI;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAGA,EAAA,SAAS,sBAAsB,KAAA,EAAyB;AACtD,IAAA,MAAM,sBAAA,GAAyB,QAAQ,aAAA,CAAc,KAAA;AACrD,IAAA,IAAI,sBAAA,IAA0B,iBAAiB,sBAAA,EAAwB;AACrE,MAAA,OAAO,KAAA,CAAM,aAAA,IAAgB,CAAE,MAAA,KAAW,GAAA;AAAA,IAC5C;AAEA,IAAA,MAAM,UAAA,GAAa,KAAA;AAMnB,IAAA,OAAO,UAAA,CAAW,WAAW,GAAA,IACxB,UAAA,CAAW,UAAU,MAAA,KAAW,GAAA,IAChC,UAAA,CAAW,SAAA,EAAW,cAAA,KAAmB,GAAA;AAAA,EAChD;AAGA,EAAA,eAAe,kBAAkB,IAAA,EAAwD;AACvF,IAAA,IAAI;AACF,MAAA,OAAOC,EAAAA,CAAG,MAAM,MAAA,CAAQ,aAAA,CAAc,IAAI,CAAC,CAAA;AAAA,IAC7C,SACO,KAAA,EAAO;AACZ,MAAA,IAAI,qBAAA,CAAsB,KAAK,CAAA,EAAG;AAChC,QAAA,OAAOD,GAAAA,CAAI,aAAA,CAAc,oBAAA,EAAsB,MAAA,CAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MACzG;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAGA,EAAA,eAAe,uBAAuB,IAAA,EAA0C;AAC9E,IAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAC/C,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,OAAOC,GAAG,UAAA,CAAW,IAAA,CAAK,QAAQ,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,EAC9D;AAGA,EAAA,SAAS,uBAAA,CAA2B,UAAkB,MAAA,EAAqC;AACzF,IAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAOD,GAAAA;AAAA,MACL,aAAA,CAAc,kBAAA;AAAA,MACd,OAAO,yBAAA,EAA2B;AAAA,QAChC,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,CAAO,QAAQ,CAAA,EAAG,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAA;AAAE,OAC9D;AAAA,KACH;AAAA,EACF;AAIA,EAAA,MAAM,GAAA,GAAM,EAAE,WAAA,EAAa,MAAM,MAAA,KAAW,IAAA,EAAM,MAAA,EAAAI,OAAAA,EAAQ,YAAA,EAAc,MAAM,MAAA,EAAQ,YAAA,EAAa;AAInG,EAAA,MAAM,gBAAA,GAAqC;AAAA,IACzC,MAAM,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS;AAC1B,MAAAA,OAAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAGlG,MAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAQ,cAAA,EAAe;AACjD,MAAA,MAAM,MAAA,GAAS,YAAY,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAwB,CAAA,CAAE,SAAS,IAAI,CAAA;AACpF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,yBAAA,EAA2B,MAAA,CAAO,+BAAA,EAAiC,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MACnH;AAEA,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,MAAA,EAAQ,MAAA,IAAU,QAAA;AAEnD,MAAA,MAAM,MAAA,CAAQ,iBAAiB,IAAA,EAAM;AAAA,QACnC,OAAA,EAAS;AAAA,UACP,MAAM,OAAA,CAAQ,SAAA;AAAA,UACd,QAAA,EAAU,iBAAiB,MAAM;AAAA;AACnC,OACD,CAAA;AAED,MAAAI,OAAAA,CAAO,KAAK,oBAAA,EAAsB,EAAE,MAAM,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,MAAA,EAAQ,CAAA;AAChF,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,KAAK,IAAA,EAAM;AACf,MAAAG,OAAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,MAAM,CAAA;AAE5C,MAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAC/C,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAO,UAAA;AAAA,MACT;AAEA,MAAA,MAAM,MAAA,CAAQ,iBAAiB,IAAI,CAAA;AAEnC,MAAAA,OAAAA,CAAO,IAAA,CAAK,oBAAA,EAAsB,EAAE,MAAM,CAAA;AAC1C,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAAG,OAAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,MAAM,CAAA;AAEnD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAQ,cAAc,IAAI,CAAA;AAChC,QAAA,OAAOH,GAAG,IAAI,CAAA;AAAA,MAChB,SACO,KAAA,EAAO;AACZ,QAAA,IAAI,qBAAA,CAAsB,KAAK,CAAA,EAAG;AAChC,UAAA,OAAOA,GAAG,KAAK,CAAA;AAAA,QACjB;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,KAAK,IAAA,EAAM;AACf,MAAAG,OAAAA,CAAO,KAAA,CAAM,yBAAA,EAA2B,EAAE,MAAM,CAAA;AAEhD,MAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAC/C,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAO,UAAA;AAAA,MACT;AAEA,MAAA,MAAM,iBAAiB,UAAA,CAAW,IAAA;AAElC,MAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,OAAA;AACrD,MAAA,MAAM,SAAA,GAAY,eAAe,IAAA,IAAQ,CAAA;AAGzC,MAAA,MAAM,cAAA,GAAiB,eAAe,QAAA,IAAY,QAAA;AAClD,MAAA,MAAM,SAAyB,cAAA,KAAmB,QAAA,GAC9C,WAAA,GACA,cAAA,KAAmB,QAAQ,KAAA,GAAQ,QAAA;AAEvC,MAAA,OAAOH,EAAAA,CAAG;AAAA,QACR,IAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA,EAAO,eAAe,YAAA,IAAgB;AAAA,OACvC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,IAAA,GAAO;AACX,MAAAG,OAAAA,CAAO,MAAM,qBAAqB,CAAA;AAElC,MAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAQ,cAAA,EAAe;AACjD,MAAA,MAAM,QAAQ,WAAA,CAAY,WAAA,CAAY,IAAI,CAAC,CAAA,KAAwB,EAAE,IAAI,CAAA;AACzE,MAAA,OAAOH,GAAG,KAAK,CAAA;AAAA,IACjB;AAAA,GACF;AAIA,EAAA,MAAM,YAAA,GAA6B;AAAA,IACjC,MAAM,MAAA,CAAO,UAAA,EAAY,SAAA,EAAW;AAClC,MAAAG,OAAAA,CAAO,MAAM,mBAAA,EAAqB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AAEzE,MAAA,MAAM,eAAA,GAAkB,MAAM,sBAAA,CAAuB,UAAU,CAAA;AAC/D,MAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,QAAA,OAAO,eAAA;AAAA,MACT;AAEA,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,MAAM,aAAa,uBAAA,CAA8B,eAAA,CAAgB,IAAA,EAAM,QAAA,CAAS,OAAO,MAAM,CAAA;AAC7F,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAO,UAAA;AAAA,QACT;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,QACnC,EAAA,EAAI,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AAAA,QACrB,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,OAAA,EAAS;AAAA,UACP,GAAG,GAAA,CAAI,QAAA;AAAA,UACP,KAAK,GAAA,CAAI,EAAA;AAAA,UACT,QAAA,EAAU,IAAI,OAAA,IAAW;AAAA;AAC3B,OACF,CAAE,CAAA;AAIF,MAAA,MAAM,MAAA,CAAQ,MAAA,CAAO,UAAA,EAAY,EAAE,QAAQ,CAAA;AAE3C,MAAAA,OAAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AACvE,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,UAAA,EAAY,SAAA,EAAW;AAClC,MAAAG,OAAAA,CAAO,MAAM,mBAAA,EAAqB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AAEzE,MAAA,MAAM,eAAA,GAAkB,MAAM,sBAAA,CAAuB,UAAU,CAAA;AAC/D,MAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,QAAA,OAAO,eAAA;AAAA,MACT;AAEA,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,MAAM,aAAa,uBAAA,CAA8B,eAAA,CAAgB,IAAA,EAAM,QAAA,CAAS,OAAO,MAAM,CAAA;AAC7F,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAO,UAAA;AAAA,QACT;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,QACnC,EAAA,EAAI,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AAAA,QACrB,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,OAAA,EAAS;AAAA,UACP,GAAG,GAAA,CAAI,QAAA;AAAA,UACP,KAAK,GAAA,CAAI,EAAA;AAAA,UACT,QAAA,EAAU,IAAI,OAAA,IAAW;AAAA;AAC3B,OACF,CAAE,CAAA;AAEF,MAAA,MAAM,MAAA,CAAQ,MAAA,CAAO,UAAA,EAAY,EAAE,QAAQ,CAAA;AAE3C,MAAAA,OAAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,YAAY,KAAA,EAAO,SAAA,CAAU,QAAQ,CAAA;AACvE,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,UAAA,EAAY,GAAA,EAAK;AAC5B,MAAAG,OAAAA,CAAO,MAAM,kBAAA,EAAoB,EAAE,YAAY,KAAA,EAAO,GAAA,CAAI,QAAQ,CAAA;AAElE,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA;AAChC,MAAA,MAAM,OAAQ,MAAA,CAAO,UAAA,EAAY,EAAE,MAAA,EAAQ,OAAO,CAAA;AAElD,MAAAA,OAAAA,CAAO,KAAK,iBAAA,EAAmB,EAAE,YAAY,KAAA,EAAO,GAAA,CAAI,QAAQ,CAAA;AAChE,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,UAAA,EAAY,MAAA,EAAQ,OAAA,EAAS;AACxC,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,EAAA;AAC9B,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,CAAA;AAEtC,MAAAG,OAAAA,CAAO,KAAA,CAAM,mBAAA,EAAqB,EAAE,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,CAAC,CAAC,OAAA,EAAS,MAAA,EAAQ,CAAA;AAEpF,MAAA,MAAM,eAAA,GAAkB,MAAM,sBAAA,CAAuB,UAAU,CAAA;AAC/D,MAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,QAAA,OAAO,eAAA;AAAA,MACT;AAEA,MAAA,MAAM,mBAAA,GAAsB,uBAAA,CAA8C,eAAA,CAAgB,IAAA,EAAM,OAAO,MAAM,CAAA;AAC7G,MAAA,IAAI,mBAAA,EAAqB;AACvB,QAAA,OAAO,mBAAA;AAAA,MACT;AAGA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,OAAA,EAAS,UAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAC7D,QAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO;AAAA,UAC3E,GAAA;AAAA,UACA,KAAA,EAAO,EAAE,KAAA;AAAM,SACjB,CAAE,CAAA;AACF,QAAA,MAAA,GAAS,EAAE,MAAM,cAAA,EAAe;AAAA,MAClC;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAQ,KAAA,CAAM,UAAA,EAAY;AAAA,QACnD,KAAA,EAAO,MAAA;AAAA,QACP,KAAA,EAAO,IAAA;AAAA,QACP,eAAA,EAAiB,QAAA,GAAW,CAAA,GAAI,QAAA,GAAW,MAAA;AAAA,QAC3C,MAAA;AAAA,QACA,YAAA,EAAc;AAAA,OACf,CAAA;AAED,MAAA,MAAM,OAAA,GAAgC,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAmC;AAChG,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAsC,EAAC;AAC7D,QAAA,MAAM,EAAE,GAAA,EAAK,QAAA,EAAU,GAAG,UAAS,GAAI,OAAA;AACvC,QAAA,OAAO;AAAA,UACL,IAAK,GAAA,IAAkB,EAAA;AAAA,UACvB,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,SAAU,QAAA,IAAuB,MAAA;AAAA,UACjC,UAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,IAAI,QAAA,GAAW;AAAA,SAC1D;AAAA,MACF,CAAC,CAAA;AAED,MAAA,OAAOH,GAAG,OAAO,CAAA;AAAA,IACnB,CAAA;AAAA,IAEA,MAAM,MAAM,UAAA,EAAY;AACtB,MAAAG,OAAAA,CAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,YAAY,CAAA;AAE/C,MAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB,UAAU,CAAA;AACrD,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAO,UAAA;AAAA,MACT;AAEA,MAAA,OAAOH,EAAAA,CAAG,UAAA,CAAW,IAAA,CAAK,YAAA,IAAgB,CAAC,CAAA;AAAA,IAC7C;AAAA,GACF;AAIA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IAEN,MAAM,QAAQ,GAAA,EAA+B;AAC3C,MAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,QAAA,OAAOD,GAAAA,CAAI,aAAA,CAAc,gBAAA,EAAkB,MAAA,CAAO,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MAC5G;AAEA,MAAA,MAAM,YAAA,GAAe,GAAA;AAErB,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,EAAiB;AAC1C,QAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,UAAA,OAAO,UAAA;AAAA,QACT;AAEA,QAAA,MAAM,EAAE,YAAA,EAAc,iBAAA,EAAkB,GAAI,UAAA,CAAW,IAAA;AAGvD,QAAA,MAAM,YAAA,GAAe,IAAI,iBAAA,CAAkB;AAAA,UACzC,KAAK,YAAA,CAAa,GAAA;AAAA,UAClB,QAAQ,YAAA,CAAa;AAAA,SACtB,CAAA;AAGD,QAAA,MAAM,aAAa,cAAA,EAAe;AAElC,QAAA,MAAA,GAAS,YAAA;AAET,QAAA,MAAA,GAAS,YAAA;AACT,QAAAI,OAAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,KAAK,WAAA,CAAY,YAAA,CAAa,GAAG,CAAA,EAAG,CAAA;AACtE,QAAA,OAAOH,GAAG,KAAA,CAAS,CAAA;AAAA,MACrB,SACO,KAAA,EAAO;AAEZ,QAAAG,OAAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAC7G,QAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,iBAAA,EAAmB,MAAA,CAAO,0BAA0B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC3H;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,KAAA,GAAkC;AACtC,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,MAAA,GAAS,IAAA;AACT,MAAAI,OAAAA,CAAO,KAAK,0BAA0B,CAAA;AACtC,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,WAAA,GAAuB;AACrB,MAAA,OAAO,MAAA,KAAW,IAAA;AAAA,IACpB,CAAA;AAAA,IAEA,UAAA,EAAY,uBAAA,CAAwB,GAAA,EAAK,gBAAgB,CAAA;AAAA,IACzD,MAAA,EAAQ,mBAAA,CAAoB,GAAA,EAAK,YAAY;AAAA,GAC/C;AACF;;;AC5cA,IAAMG,OAAAA,GAASL,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,CAAA;AAKnE,IAAI,eAAA,GAAwC,IAAA;AAG5C,IAAI,aAAA,GAAoC,IAAA;AAGxC,IAAI,cAAA,GAAiB,KAAA;AAUrB,SAAS,eAAe,MAAA,EAAoC;AAC1D,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,SAAA;AACH,MAAA,OAAO,qBAAA,EAAsB;AAAA,IAC/B,KAAK,UAAA;AACH,MAAA,OAAO,sBAAA,EAAuB;AAAA,IAChC,KAAK,QAAA;AACH,MAAA,OAAO,oBAAA,EAAqB;AAAA,IAC9B,KAAK,QAAA;AACH,MAAA,OAAO,oBAAA,EAAqB;AAAA;AAElC;AAKA,IAAM,cAAA,GAAiBA,KAAK,MAAA,CAAO,uBAAA;AAAA,EACjC,aAAA,CAAc,eAAA;AAAA,EACd,MAAM,OAAO,sBAAsB;AACrC,CAAA;AAGA,IAAM,wBAAA,GAA2B,eAAe,KAAA,EAA4B;AAG5E,IAAM,oBAAA,GAAuB,eAAe,KAAA,EAAwB;AAqC7D,IAAM,KAAA,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnC,MAAM,KAAK,MAAA,EAAoD;AAE7D,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAAK,OAAAA,CAAO,KAAK,0DAA0D,CAAA;AACtE,MAAA,OAAOJ,GAAAA,CAAI,aAAA,CAAc,YAAA,EAAc,MAAA,CAAO,sBAAsB,CAAC,CAAA;AAAA,IACvE;AACA,IAAA,cAAA,GAAiB,IAAA;AAEjB,IAAA,IAAI;AACF,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAAI,OAAAA,CAAO,KAAK,qDAAqD,CAAA;AACjE,QAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,KAAA,EAAM;AACtC,QAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,UAAA,OAAO,WAAA;AAAA,QACT;AAAA,MACF;AAEA,MAAAA,OAAAA,CAAO,KAAK,2BAA2B,CAAA;AAEvC,MAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,SAAA,CAAU,MAAM,CAAA;AACtD,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,QAAAA,OAAAA,CAAO,MAAM,gCAAA,EAAkC,EAAE,OAAO,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA;AACnF,QAAA,OAAOJ,IAAI,aAAA,CAAc,YAAA,EAAc,MAAA,CAAO,mBAAA,EAAqB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,WAAA,CAAY,MAAM,OAAA,EAAQ,EAAG,CAAA,EAAG,YAAY,KAAK,CAAA;AAAA,MACzI;AACA,MAAA,MAAM,SAAS,WAAA,CAAY,IAAA;AAE3B,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,eAAe,MAAM,CAAA;AACtC,QAAA,MAAM,aAAA,GAAgB,MAAM,QAAA,CAAS,OAAA,CAAQ,MAAM,CAAA;AACnD,QAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAC1B,UAAAI,OAAAA,CAAO,MAAM,oCAAA,EAAsC;AAAA,YACjD,IAAA,EAAM,cAAc,KAAA,CAAM,IAAA;AAAA,YAC1B,OAAA,EAAS,cAAc,KAAA,CAAM;AAAA,WAC9B,CAAA;AACD,UAAA,OAAO,aAAA;AAAA,QACT;AACA,QAAA,eAAA,GAAkB,QAAA;AAClB,QAAA,aAAA,GAAgB,MAAA;AAChB,QAAAA,QAAO,IAAA,CAAK,0BAAA,EAA4B,EAAE,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AAC7D,QAAA,OAAOH,GAAG,KAAA,CAAS,CAAA;AAAA,MACrB,SACO,KAAA,EAAO;AACZ,QAAAG,OAAAA,CAAO,KAAA,CAAM,oCAAA,EAAsC,EAAE,OAAO,CAAA;AAC5D,QAAA,OAAOJ,IAAI,aAAA,CAAc,iBAAA,EAAmB,OAAO,kBAAA,EAAoB,EAAE,QAAQ,EAAE,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,MAAA,CAAO,KAAK,GAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC9J;AAAA,IACF,CAAA,SACA;AACE,MAAA,cAAA,GAAiB,KAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,UAAA,GAAmC;AACrC,IAAA,OAAO,iBAAiB,UAAA,IAAc,wBAAA;AAAA,EACxC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,MAAA,GAA2B;AAC7B,IAAA,OAAO,iBAAiB,MAAA,IAAU,oBAAA;AAAA,EACpC,CAAA;AAAA;AAAA,EAGA,IAAI,MAAA,GAA6B;AAC/B,IAAA,OAAO,aAAA,GAAgBD,IAAAA,CAAK,QAAA,CAAS,uBAAA,CAAwB,aAAa,CAAA,GAAI,IAAA;AAAA,EAChF,CAAA;AAAA;AAAA,EAGA,IAAI,aAAA,GAAwC;AAC1C,IAAA,IAAI,CAAC,aAAA;AACH,MAAA,OAAO,IAAA;AACT,IAAA,IAAI,cAAc,IAAA,KAAS,QAAA;AACzB,MAAA,OAAO,EAAE,MAAM,QAAA,EAAU,GAAA,EAAK,cAAc,GAAA,EAAK,MAAA,EAAQ,cAAc,MAAA,EAAO;AAChF,IAAA,IAAI,aAAA,CAAc,SAAS,UAAA,EAAY;AACrC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,UAAA;AAAA,QACN,kBAAkB,aAAA,CAAc,GAAA;AAAA,QAChC,MAAM,aAAA,CAAc,IAAA;AAAA,QACpB,MAAM,aAAA,CAAc,IAAA;AAAA,QACpB,UAAU,aAAA,CAAc,QAAA;AAAA,QACxB,MAAM,aAAA,CAAc,IAAA;AAAA,QACpB,UAAU,aAAA,CAAc;AAAA,OAC1B;AAAA,IACF;AACA,IAAA,IAAI,aAAA,CAAc,SAAS,QAAA,EAAU;AACnC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,KAAK,aAAA,CAAc,GAAA;AAAA,QACnB,MAAM,aAAA,CAAc,IAAA;AAAA,QACpB,MAAM,aAAA,CAAc,IAAA;AAAA,QACpB,QAAQ,aAAA,CAAc,MAAA;AAAA,QACtB,MAAM,aAAA,CAAc;AAAA,OACtB;AAAA,IACF;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,aAAA,CAAc,IAAA,EAAM,IAAA,EAAM,cAAc,IAAA,EAAK;AAAA,EAC9D,CAAA;AAAA;AAAA,EAGA,IAAI,aAAA,GAAyB;AAC3B,IAAA,OAAO,eAAA,KAAoB,IAAA,IAAQ,eAAA,CAAgB,WAAA,EAAY;AAAA,EACjE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,GAAkC;AACtC,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,aAAA,GAAgB,IAAA;AAChB,MAAAK,OAAAA,CAAO,KAAK,uCAAuC,CAAA;AACnD,MAAA,OAAOH,GAAG,MAAS,CAAA;AAAA,IACrB;AAEA,IAAAG,OAAAA,CAAO,KAAK,sBAAsB,CAAA;AAElC,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgB,KAAA,EAAM;AAChD,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,QAAAA,OAAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,IAAA,EAAM,WAAA,CAAY,KAAA,CAAM,IAAA,EAAM,OAAA,EAAS,WAAA,CAAY,KAAA,CAAM,OAAA,EAAS,CAAA;AAC9G,QAAA,OAAO,WAAA;AAAA,MACT;AACA,MAAAA,OAAAA,CAAO,KAAK,qBAAqB,CAAA;AACjC,MAAA,OAAOH,GAAG,KAAA,CAAS,CAAA;AAAA,IACrB,SACO,KAAA,EAAO;AACZ,MAAAG,OAAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,OAAO,CAAA;AACnD,MAAA,OAAOJ,IAAI,aAAA,CAAc,iBAAA,EAAmB,OAAO,mBAAA,EAAqB,EAAE,QAAQ,EAAE,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,MAAA,CAAO,KAAK,GAAE,EAAG,GAAG,KAAK,CAAA;AAAA,IAC/J,CAAA,SACA;AACE,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA,aAAA,GAAgB,IAAA;AAAA,IAClB;AAAA,EACF;AACF","file":"index.js","sourcesContent":["{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"vecdb_notInitialized\": \"Vector database not initialized, please call vecdb.init() first\",\n \"vecdb_initFailed\": \"Failed to initialize vector database: {error}\",\n \"vecdb_closeFailed\": \"Failed to close vector database: {error}\",\n \"vecdb_configError\": \"Vector database config validation failed: {error}\",\n \"vecdb_initInProgress\": \"Vector database initialization is already in progress\",\n \"vecdb_unsupportedType\": \"Unsupported vector database type: {type}\",\n \"vecdb_driverNotFound\": \"Vector database driver not installed: {driver}, please run pnpm add {driver}\",\n \"vecdb_connectionFailed\": \"Failed to connect to vector database: {error}\",\n \"vecdb_collectionNotFound\": \"Collection not found: {name}\",\n \"vecdb_collectionAlreadyExists\": \"Collection already exists: {name}\",\n \"vecdb_dimensionMismatch\": \"Vector dimension mismatch: expected {expected}, actual {actual}\",\n \"vecdb_insertFailed\": \"Failed to insert vectors: {error}\",\n \"vecdb_deleteFailed\": \"Failed to delete vectors: {error}\",\n \"vecdb_updateFailed\": \"Failed to update vectors: {error}\",\n \"vecdb_queryFailed\": \"Failed to query vectors: {error}\",\n \"vecdb_indexBuildFailed\": \"Failed to build index: {error}\",\n \"vecdb_serializationFailed\": \"Serialization/deserialization failed: {error}\",\n \"vecdb_invalidDimension\": \"Invalid vector dimension: {dimension}, must be a positive integer\",\n \"vecdb_configPathRequired\": \"Database storage path is required\",\n \"vecdb_configDatabaseRequired\": \"Database name is required\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"vecdb_notInitialized\": \"向量数据库未初始化,请先调用 vecdb.init()\",\n \"vecdb_initFailed\": \"初始化向量数据库失败: {error}\",\n \"vecdb_closeFailed\": \"关闭向量数据库失败: {error}\",\n \"vecdb_configError\": \"向量数据库配置校验失败:{error}\",\n \"vecdb_initInProgress\": \"向量数据库初始化正在进行中\",\n \"vecdb_unsupportedType\": \"不支持的向量数据库类型: {type}\",\n \"vecdb_driverNotFound\": \"向量数据库驱动未安装: {driver},请执行 pnpm add {driver}\",\n \"vecdb_connectionFailed\": \"连接向量数据库失败: {error}\",\n \"vecdb_collectionNotFound\": \"集合不存在: {name}\",\n \"vecdb_collectionAlreadyExists\": \"集合已存在: {name}\",\n \"vecdb_dimensionMismatch\": \"向量维度不匹配: 期望 {expected},实际 {actual}\",\n \"vecdb_insertFailed\": \"插入向量失败: {error}\",\n \"vecdb_deleteFailed\": \"删除向量失败: {error}\",\n \"vecdb_updateFailed\": \"更新向量失败: {error}\",\n \"vecdb_queryFailed\": \"查询向量失败: {error}\",\n \"vecdb_indexBuildFailed\": \"构建索引失败: {error}\",\n \"vecdb_serializationFailed\": \"序列化/反序列化失败: {error}\",\n \"vecdb_invalidDimension\": \"无效的向量维度: {dimension},必须为正整数\",\n \"vecdb_configPathRequired\": \"数据库存储路径不能为空\",\n \"vecdb_configDatabaseRequired\": \"数据库名称不能为空\"\n}\n","/**\n * @h-ai/vecdb — i18n\n *\n * 本文件提供向量数据库模块的 i18n 文案访问入口。\n * @module vecdb-i18n\n */\n\nimport { core } from '@h-ai/core'\nimport messagesEnUS from '../messages/en-US.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\n// ─── i18n ───\n\n/**\n * 向量数据库模块文案 Key 类型\n */\ntype VecdbMessageKey = keyof typeof messagesZhCN\n\n/**\n * 获取向量数据库模块文案。\n * @param key - 文案 Key\n * @param options - 插值参数与格式化选项\n * @returns 本地化后的文案字符串\n */\nexport const vecdbM = core.i18n.createMessageGetter<VecdbMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n})\n","/**\n * @h-ai/vecdb — 向量数据库配置 Schema\n *\n * 本文件定义向量数据库模块的错误码常量、Zod Schema 和配置类型。\n * 支持 LanceDB(默认)、pgvector、Qdrant、Chroma 四种后端。\n * @module vecdb-config\n */\n\nimport { z } from 'zod'\nimport { vecdbM } from './vecdb-i18n.js'\n// ─── 向量数据库类型枚举 ───\n\n/**\n * 向量数据库类型枚举\n *\n * 支持的向量数据库类型:\n * - `lancedb` — LanceDB 嵌入式向量数据库(默认)\n * - `pgvector` — PostgreSQL + pgvector 扩展\n * - `qdrant` — Qdrant 向量搜索引擎\n * - `chroma` — Chroma 向量数据库(支持嵌入式自动拉起本地服务)\n */\n/** 向量数据库类型 */\nexport type VecdbType = 'lancedb' | 'pgvector' | 'qdrant' | 'chroma'\n\n// ─── 距离度量 ───\n\n/**\n * 距离度量类型\n *\n * - `cosine` — 余弦相似度(默认,适用于文本嵌入)\n * - `euclidean` — 欧氏距离(L2)\n * - `dot` — 内积(点积)\n */\nexport const DistanceMetricSchema = z.enum(['cosine', 'euclidean', 'dot']).default('cosine')\n\n/** 距离度量类型 */\nexport type DistanceMetric = z.infer<typeof DistanceMetricSchema>\n\nexport const VecdbOperationLogConfigSchema = z.object({\n read: z.boolean().default(false),\n write: z.boolean().default(false),\n maxLength: z.number().int().min(0).default(1000),\n level: z.enum(['info', 'debug', 'trace']).default('debug'),\n})\n\nexport type VecdbOperationLogConfig = z.infer<typeof VecdbOperationLogConfigSchema>\n\nconst OperationLogConfigFieldSchema = {\n operationLog: VecdbOperationLogConfigSchema.optional(),\n}\n\n// ─── LanceDB 配置 ───\n\n/**\n * LanceDB 配置 Schema\n *\n * @example\n * ```ts\n * { type: 'lancedb', path: './data/vecdb' }\n * ```\n */\nconst LancedbConfigSchema = z.object({\n type: z.literal('lancedb'),\n /** 数据库存储路径(本地目录) */\n path: z.string().min(1, vecdbM('vecdb_configPathRequired')),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/** LanceDB 配置类型 */\nexport type LancedbConfig = z.infer<typeof LancedbConfigSchema>\n\n// ─── pgvector 配置 ───\n\n/**\n * pgvector 索引类型\n *\n * - `ivfflat` — IVFFlat 索引(适合中等规模数据)\n * - `hnsw` — HNSW 索引(适合大规模数据,检索速度更快)\n */\nconst PgvectorIndexTypeSchema = z.enum(['ivfflat', 'hnsw']).default('hnsw')\n\n/**\n * pgvector 配置 Schema\n *\n * @example\n * ```ts\n * // 使用连接字符串\n * { type: 'pgvector', url: 'postgres://user:pass@localhost:5432/mydb' }\n *\n * // 使用分开的字段\n * {\n * type: 'pgvector',\n * host: 'localhost',\n * port: 5432,\n * database: 'mydb',\n * user: 'admin',\n * password: 'secret'\n * }\n * ```\n */\nconst PgvectorConfigSchema = z.object({\n type: z.literal('pgvector'),\n /** 连接字符串(可选,优先使用) */\n url: z.string().optional(),\n /** 数据库主机地址(默认 localhost) */\n host: z.string().default('localhost'),\n /** 端口号(默认 5432) */\n port: z.number().int().min(1).max(65535).default(5432),\n /** 数据库名称 */\n database: z.string().min(1, vecdbM('vecdb_configDatabaseRequired')),\n /** 用户名 */\n user: z.string().optional(),\n /** 密码 */\n password: z.string().optional(),\n /** 索引类型(默认 hnsw) */\n indexType: PgvectorIndexTypeSchema.optional(),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n /** 表名前缀(默认 'vec_') */\n tablePrefix: z.string().default('vec_'),\n ...OperationLogConfigFieldSchema,\n})\n\n/** pgvector 配置类型 */\nexport type PgvectorConfig = z.infer<typeof PgvectorConfigSchema>\n\n// ─── Qdrant 配置 ───\n\n/**\n * Qdrant 配置 Schema\n *\n * @example\n * ```ts\n * { type: 'qdrant', url: 'http://localhost:6333' }\n * ```\n */\nconst QdrantConfigSchema = z.object({\n type: z.literal('qdrant'),\n /** Qdrant 服务器 URL */\n url: z.string().url().default('http://localhost:6333'),\n /** API Key(可选) */\n apiKey: z.string().optional(),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/** Qdrant 配置类型 */\nexport type QdrantConfig = z.infer<typeof QdrantConfigSchema>\n\n// ─── Chroma 配置 ───\n\n/**\n * Chroma 配置 Schema\n *\n * Chroma 在 Node 端只有 HTTP 客户端(无进程内嵌入式)。本 Provider 支持两种模式:\n * - **嵌入式**:提供 `path` 且不提供 `url` 时,init 自动拉起本地 `chroma run` 服务\n * (持久化到 `path`),close 时关闭;数据落地本地目录,无需手动启动服务。\n * - **直连**:提供 `url`(或已运行的 host:port)时,直接连接已有 Chroma 服务,不拉起进程。\n *\n * @example\n * ```ts\n * // 嵌入式(自动拉起本地服务)\n * { type: 'chroma', path: './data/chroma' }\n *\n * // 直连已有服务\n * { type: 'chroma', url: 'http://localhost:8000' }\n * ```\n */\nconst ChromaConfigSchema = z.object({\n type: z.literal('chroma'),\n /** 本地持久化路径(嵌入式模式:提供且无 url 时自动拉起本地服务) */\n path: z.string().optional(),\n /** 已有 Chroma 服务 URL(提供时直连,不自动拉起进程) */\n url: z.string().url().optional(),\n /** 主机(默认 localhost) */\n host: z.string().default('localhost'),\n /** 端口(默认 8000) */\n port: z.number().int().min(1).max(65535).default(8000),\n /** API Key(可选,连接受保护的 Chroma 服务时使用) */\n apiKey: z.string().optional(),\n /** 拉起本地服务的可执行命令(默认 'chroma',可指定绝对路径) */\n serverCommand: z.string().default('chroma'),\n /** 拉起本地服务的就绪等待超时(毫秒,默认 30000) */\n startupTimeout: z.number().int().positive().default(30_000),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/** Chroma 配置类型 */\nexport type ChromaConfig = z.infer<typeof ChromaConfigSchema>\n\n// ─── 统一配置 ───\n\n/**\n * 统一向量数据库配置 Schema(判别联合体)\n *\n * 根据 `type` 字段区分不同向量数据库类型的配置。\n */\nexport const VecdbConfigSchema = z.discriminatedUnion('type', [\n LancedbConfigSchema,\n PgvectorConfigSchema,\n QdrantConfigSchema,\n ChromaConfigSchema,\n])\n\n/** 向量数据库配置类型(判别联合体) */\nexport type VecdbConfig = z.infer<typeof VecdbConfigSchema>\n\n/**\n * 向量数据库配置输入类型(用于 init 等入口)\n *\n * 说明:Zod 的 default 会让输入端字段可省略,但输出端字段为必填。\n * 因此对外 API(如 vecdb.init)更适合接收 VecdbConfigInput。\n */\nexport type VecdbConfigInput = z.input<typeof VecdbConfigSchema>\n","/**\n * @h-ai/vecdb — 类型定义\n *\n * 本文件定义向量数据库模块的核心接口和类型(非配置相关)。\n * 配置相关类型请从 vecdb-config.ts 导入。\n * @module vecdb-types\n */\n\nimport type { ErrorInfo, HaiResult } from '@h-ai/core'\nimport type { DistanceMetric, VecdbConfig, VecdbConfigInput } from './vecdb-config.js'\nimport { core } from '@h-ai/core'\n\n// ─── 错误定义(照 @h-ai/core 范式) ───\n\n/**\n * 向量数据库错误信息映射(错误码:HTTP状态码)。\n *\n * 完整错误码将自动生成为:`hai:vecdb:NNN`\n */\nconst VecdbErrorInfo = {\n CONNECTION_FAILED: '001:500',\n QUERY_FAILED: '002:500',\n COLLECTION_NOT_FOUND: '003:404',\n COLLECTION_ALREADY_EXISTS: '004:409',\n DIMENSION_MISMATCH: '005:400',\n INSERT_FAILED: '006:500',\n DELETE_FAILED: '007:500',\n UPDATE_FAILED: '008:500',\n INDEX_BUILD_FAILED: '009:500',\n NOT_INITIALIZED: '010:500',\n CONFIG_ERROR: '011:500',\n UNSUPPORTED_TYPE: '012:400',\n DRIVER_NOT_FOUND: '013:500',\n SERIALIZATION_FAILED: '014:500',\n} as const satisfies ErrorInfo\n\n/**\n * Vecdb 模块标准错误定义对象。\n */\nexport const HaiVecdbError = core.error.buildHaiErrorsDef('vecdb', VecdbErrorInfo)\n\n// ─── 向量文档 ───\n\n/**\n * 向量文档接口\n *\n * 表示一条存入向量数据库的记录,包含向量、文本内容和元数据。\n *\n * @example\n * ```ts\n * const doc: VectorDocument = {\n * id: 'doc-001',\n * vector: [0.1, 0.2, 0.3, ...],\n * content: '这是文档内容',\n * metadata: { source: 'wiki', page: 1 },\n * }\n * ```\n */\nexport interface VectorDocument {\n /** 文档唯一标识 */\n id: string\n /** 向量数据(浮点数组) */\n vector: number[]\n /** 文本内容(可选,用于存储原始文本) */\n content?: string\n /** 元数据(可选,用于存储附加信息) */\n metadata?: Record<string, unknown>\n}\n\n/**\n * 向量搜索选项\n *\n * @example\n * ```ts\n * const options: VectorSearchOptions = {\n * topK: 10,\n * filter: { source: 'wiki' },\n * minScore: 0.7,\n * }\n * ```\n */\nexport interface VectorSearchOptions {\n /** 返回的最大结果数(默认 10) */\n topK?: number\n /** 元数据过滤条件(键值对,精确匹配) */\n filter?: Record<string, unknown>\n /** 最低相似度阈值(0-1,低于此值的结果将被过滤) */\n minScore?: number\n}\n\n/**\n * 向量搜索结果\n *\n * 包含匹配的文档和相似度得分。\n *\n * @example\n * ```ts\n * const result: VectorSearchResult = {\n * id: 'doc-001',\n * score: 0.95,\n * content: '匹配的文档内容',\n * metadata: { source: 'wiki' },\n * }\n * ```\n */\nexport interface VectorSearchResult {\n /** 文档唯一标识 */\n id: string\n /** 相似度得分(0-1,越高越相似) */\n score: number\n /** 文本内容(如果存储时包含) */\n content?: string\n /** 元数据(如果存储时包含) */\n metadata?: Record<string, unknown>\n /** 原始向量(可选,默认不返回以节省传输) */\n vector?: number[]\n}\n\n// ─── 集合信息 ───\n\n/**\n * 集合信息接口\n *\n * 描述一个向量集合的元信息。\n *\n * @example\n * ```ts\n * const info: CollectionInfo = {\n * name: 'docs',\n * dimension: 1536,\n * metric: 'cosine',\n * count: 42,\n * }\n * ```\n */\nexport interface CollectionInfo {\n /** 集合名称 */\n name: string\n /** 向量维度 */\n dimension: number\n /** 距离度量类型 */\n metric: DistanceMetric\n /** 集合中的文档数量 */\n count: number\n}\n\n// ─── 操作接口 ───\n\n/**\n * 集合管理操作接口\n *\n * 通过 `vecdb.collection` 访问,管理向量集合的创建、删除和查询。\n *\n * @example\n * ```ts\n * // 创建集合\n * await vecdb.collection.create('my-docs', { dimension: 1536 })\n *\n * // 列出集合\n * const result = await vecdb.collection.list()\n * ```\n */\nexport interface CollectionOperations {\n /**\n * 创建集合\n *\n * @param name - 集合名称\n * @param options - 创建选项\n * @returns 成功返回 ok(undefined);集合已存在返回 COLLECTION_ALREADY_EXISTS\n */\n create: (name: string, options: CollectionCreateOptions) => Promise<HaiResult<void>>\n\n /**\n * 删除集合\n *\n * @param name - 集合名称\n * @returns 成功返回 ok(undefined);集合不存在返回 COLLECTION_NOT_FOUND\n */\n drop: (name: string) => Promise<HaiResult<void>>\n\n /**\n * 判断集合是否存在\n *\n * @param name - 集合名称\n * @returns 存在返回 true,不存在返回 false\n */\n exists: (name: string) => Promise<HaiResult<boolean>>\n\n /**\n * 获取集合信息\n *\n * @param name - 集合名称\n * @returns 集合信息\n */\n info: (name: string) => Promise<HaiResult<CollectionInfo>>\n\n /**\n * 列出所有集合\n *\n * @returns 集合名称列表\n */\n list: () => Promise<HaiResult<string[]>>\n}\n\n/**\n * 集合创建选项\n *\n * @example\n * ```ts\n * const options: CollectionCreateOptions = {\n * dimension: 1536,\n * metric: 'cosine',\n * }\n * ```\n */\nexport interface CollectionCreateOptions {\n /** 向量维度(必填) */\n dimension: number\n /** 距离度量(可选,默认使用全局配置中的 metric) */\n metric?: DistanceMetric\n}\n\n/**\n * 向量操作接口\n *\n * 通过 `vecdb.vector` 访问,管理向量文档的增删改查和搜索。\n *\n * @example\n * ```ts\n * // 插入向量\n * await vecdb.vector.insert('my-docs', [\n * { id: 'doc-1', vector: [...], content: '文档1' },\n * { id: 'doc-2', vector: [...], content: '文档2' },\n * ])\n *\n * // 搜索向量\n * const result = await vecdb.vector.search('my-docs', queryVector, { topK: 5 })\n * ```\n */\nexport interface VectorOperations {\n /**\n * 插入向量文档\n *\n * @param collection - 集合名称\n * @param documents - 文档列表\n * @returns 成功返回 ok(undefined)\n */\n insert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n\n /**\n * 更新向量文档(按 id 匹配,整体替换)\n *\n * @param collection - 集合名称\n * @param documents - 待更新的文档(id 必须已存在)\n * @returns 成功返回 ok(undefined)\n */\n upsert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n\n /**\n * 删除向量文档\n *\n * @param collection - 集合名称\n * @param ids - 文档 ID 列表\n * @returns 成功返回 ok(undefined)\n */\n delete: (collection: string, ids: string[]) => Promise<HaiResult<void>>\n\n /**\n * 向量搜索\n *\n * @param collection - 集合名称\n * @param vector - 查询向量\n * @param options - 搜索选项\n * @returns 搜索结果列表(按相似度降序排列)\n */\n search: (\n collection: string,\n vector: number[],\n options?: VectorSearchOptions,\n ) => Promise<HaiResult<VectorSearchResult[]>>\n\n /**\n * 获取集合中的文档数量\n *\n * @param collection - 集合名称\n * @returns 文档数量\n */\n count: (collection: string) => Promise<HaiResult<number>>\n}\n\n// ─── VecdbFunctions 接口 ───\n\n/**\n * 向量数据库服务接口(通过 `vecdb` 对象访问)\n *\n * @example\n * ```ts\n * import { vecdb } from '@h-ai/vecdb'\n *\n * // 初始化(LanceDB)\n * await vecdb.init({ type: 'lancedb', path: './data/vecdb' })\n *\n * // 创建集合\n * await vecdb.collection.create('docs', { dimension: 1536 })\n *\n * // 插入向量\n * await vecdb.vector.insert('docs', [{ id: '1', vector: [...], content: '...' }])\n *\n * // 搜索\n * const result = await vecdb.vector.search('docs', queryVector, { topK: 5 })\n *\n * // 关闭\n * await vecdb.close()\n * ```\n */\nexport interface VecdbFunctions {\n /** 初始化向量数据库连接 */\n init: (config: VecdbConfigInput) => Promise<HaiResult<void>>\n /** 关闭连接 */\n close: () => Promise<HaiResult<void>>\n /** 当前脱敏配置快照(未初始化时为 null) */\n readonly config: VecdbConfig | null\n /**\n * 获取底层后端的原始连接信息(含凭证,未初始化时为 null)\n *\n * 供需要直连同一向量库的外部引擎(如 mem0 OSS)复用后端。返回值包含未脱敏的凭证,\n * 仅供同进程内集成使用,禁止写入日志或返回给外部调用方。\n */\n readonly rawConnection: VecdbConnection | null\n /** 是否已初始化 */\n readonly isInitialized: boolean\n /** 集合管理操作 */\n readonly collection: CollectionOperations\n /** 向量操作 */\n readonly vector: VectorOperations\n}\n\n/**\n * 向量库原始连接信息\n *\n * 由 `vecdb.rawConnection` 暴露,字段按后端类型填充。包含凭证,仅供同进程内集成使用。\n */\nexport interface VecdbConnection {\n /** 后端类型 */\n type: VecdbConfig['type']\n /** 服务 URL(qdrant) */\n url?: string\n /** API Key(qdrant) */\n apiKey?: string\n /** 主机(pgvector) */\n host?: string\n /** 端口(pgvector) */\n port?: number\n /** 数据库名(pgvector) */\n database?: string\n /** 用户名(pgvector) */\n user?: string\n /** 密码(pgvector) */\n password?: string\n /** 连接串(pgvector) */\n connectionString?: string\n /** 本地路径(lancedb) */\n path?: string\n}\n","/**\n * @h-ai/vecdb — Provider 共享基础层\n *\n * 将各 Provider 的共性逻辑抽取为统一实现:连接守卫、运行时异常捕获、HaiResult 包装。\n *\n * 各 Provider 只需提供 CollectionDriver / VectorDriver(原始操作适配器),\n * base 层统一处理初始化检查与 catch-all 安全网。\n * @module vecdb-provider-base\n */\n\nimport type { HaiErrorDef, HaiResult } from '@h-ai/core'\nimport type { VecdbConfig, VecdbOperationLogConfig } from '../vecdb-config.js'\nimport type {\n CollectionCreateOptions,\n CollectionInfo,\n CollectionOperations,\n VectorDocument,\n VectorOperations,\n VectorSearchOptions,\n VectorSearchResult,\n} from '../vecdb-types.js'\n\nimport { err, ok } from '@h-ai/core'\n\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\n// ─── Provider 接口(内部,不暴露给模块消费者) ───\n\n/**\n * 向量数据库 Provider 接口\n *\n * 各后端实现需遵循此接口,提供统一的集合管理和向量操作能力。\n */\nexport interface VecdbProvider {\n /** Provider 名称标识 */\n readonly name: string\n /** 连接到向量数据库 */\n connect: (config: VecdbConfig) => Promise<HaiResult<void>>\n /** 关闭连接 */\n close: () => Promise<HaiResult<void>>\n /** 是否已连接 */\n isConnected: () => boolean\n /** 集合管理操作 */\n collection: CollectionOperations\n /** 向量操作 */\n vector: VectorOperations\n}\n\n// ─── 上下文与适配器接口 ───\n\n/** 操作上下文:由 Provider 在创建 ops 时传入 */\nexport interface VecdbOpsContext {\n /** 连接状态检查 */\n isConnected: () => boolean\n /** Logger 实例(用于运行时异常的错误日志) */\n logger: {\n error: (msg: string, meta?: Record<string, unknown>) => void\n info: (msg: string, meta?: Record<string, unknown>) => void\n debug: (msg: string, meta?: Record<string, unknown>) => void\n trace: (msg: string, meta?: Record<string, unknown>) => void\n }\n /** 当前操作日志配置 */\n operationLog?: () => VecdbOperationLogConfig | undefined\n}\n\n/**\n * 集合操作原始适配器\n *\n * Provider 将引擎特定的集合管理逻辑适配为此接口。\n * 实现方返回 HaiResult 以表达业务错误(如集合已存在);\n * 未预期的运行时异常直接 throw,由 wrapOp 统一捕获。\n */\nexport interface CollectionDriver {\n create: (name: string, options: CollectionCreateOptions) => Promise<HaiResult<void>>\n drop: (name: string) => Promise<HaiResult<void>>\n exists: (name: string) => Promise<HaiResult<boolean>>\n info: (name: string) => Promise<HaiResult<CollectionInfo>>\n list: () => Promise<HaiResult<string[]>>\n}\n\n/**\n * 向量操作原始适配器\n *\n * Provider 将引擎特定的向量管理逻辑适配为此接口。\n * 实现方返回 HaiResult 以表达业务错误(如集合不存在);\n * 未预期的运行时异常直接 throw,由 wrapOp 统一捕获。\n */\nexport interface VectorDriver {\n insert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n upsert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n delete: (collection: string, ids: string[]) => Promise<HaiResult<void>>\n search: (\n collection: string,\n vector: number[],\n options?: VectorSearchOptions,\n ) => Promise<HaiResult<VectorSearchResult[]>>\n count: (collection: string) => Promise<HaiResult<number>>\n}\n\n// ─── 内部帮助 ───\n\ntype VecdbOperationCategory = 'read' | 'write'\n\nfunction stringifyOperationPayload(payload: unknown, maxLength: number): string {\n if (maxLength <= 0) {\n return ''\n }\n\n try {\n const text = JSON.stringify(payload, (_key, value: unknown) => {\n if (typeof value === 'bigint') {\n return value.toString()\n }\n if (typeof value === 'function') {\n return '[Function]'\n }\n return value\n })\n return text.length > maxLength ? `${text.slice(0, maxLength)}...` : text\n }\n catch {\n const text = String(payload)\n return text.length > maxLength ? `${text.slice(0, maxLength)}...` : text\n }\n}\n\nexport function logVecdbOperation(\n ctx: VecdbOpsContext,\n category: VecdbOperationCategory,\n operation: string,\n payload: unknown,\n): void {\n const config = ctx.operationLog?.()\n if (!config?.[category]) {\n return\n }\n\n ctx.logger[config.level]('VecDB operation executed', {\n category,\n operation,\n payload: stringifyOperationPayload(payload, config.maxLength),\n })\n}\n\n/** 根据错误定义获取对应的 i18n 错误消息 */\nfunction errorMsgFromCode(def: HaiErrorDef, errorStr: string): string {\n switch (def) {\n case HaiVecdbError.DELETE_FAILED:\n return vecdbM('vecdb_deleteFailed', { params: { error: errorStr } })\n case HaiVecdbError.INSERT_FAILED:\n return vecdbM('vecdb_insertFailed', { params: { error: errorStr } })\n case HaiVecdbError.UPDATE_FAILED:\n return vecdbM('vecdb_updateFailed', { params: { error: errorStr } })\n default:\n return vecdbM('vecdb_queryFailed', { params: { error: errorStr } })\n }\n}\n\n/**\n * 统一操作包装器:guard → delegate → catch-all\n *\n * 1. 连接守卫:未初始化时直接返回 NOT_INITIALIZED\n * 2. 委托给 driver 执行(driver 内部用 HaiResult 表达业务错误)\n * 3. catch-all 安全网:捕获 driver 未预期的运行时异常\n */\nasync function wrapOp<T>(\n ctx: VecdbOpsContext,\n fn: () => Promise<HaiResult<T>>,\n errorDef: HaiErrorDef,\n errorLabel: string,\n errorMeta?: Record<string, unknown>,\n): Promise<HaiResult<T>> {\n if (!ctx.isConnected()) {\n return err(HaiVecdbError.NOT_INITIALIZED, vecdbM('vecdb_notInitialized'))\n }\n try {\n return await fn()\n }\n catch (error) {\n ctx.logger.error(errorLabel, { ...errorMeta, error })\n return err(errorDef, errorMsgFromCode(errorDef, String(error)), error)\n }\n}\n\n// ─── 集合操作工厂 ───\n\n/**\n * 创建标准集合操作\n *\n * 各 Provider 只需提供 CollectionDriver,base 层统一处理连接守卫与运行时异常。\n */\nexport function createBaseCollectionOps(ctx: VecdbOpsContext, driver: CollectionDriver): CollectionOperations {\n return {\n create: async (name, options) => {\n // 参数校验:dimension 必须为正整数(防止 pgvector SQL 插值注入)\n if (!Number.isInteger(options.dimension) || options.dimension <= 0) {\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_invalidDimension', { params: { dimension: String(options.dimension) } }),\n )\n }\n logVecdbOperation(ctx, 'write', 'collection.create', { name, options })\n return wrapOp(\n ctx,\n () => driver.create(name, options),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to create collection',\n { name },\n )\n },\n drop: (name) => {\n logVecdbOperation(ctx, 'write', 'collection.drop', { name })\n return wrapOp(\n ctx,\n () => driver.drop(name),\n HaiVecdbError.DELETE_FAILED,\n 'Failed to drop collection',\n { name },\n )\n },\n exists: (name) => {\n logVecdbOperation(ctx, 'read', 'collection.exists', { name })\n return wrapOp(\n ctx,\n () => driver.exists(name),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to check collection',\n { name },\n )\n },\n info: (name) => {\n logVecdbOperation(ctx, 'read', 'collection.info', { name })\n return wrapOp(\n ctx,\n () => driver.info(name),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to get collection info',\n { name },\n )\n },\n list: () => {\n logVecdbOperation(ctx, 'read', 'collection.list', {})\n return wrapOp(\n ctx,\n () => driver.list(),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to list collections',\n )\n },\n }\n}\n// ─── 向量操作工厂 ───\n\n/**\n * 创建标准向量操作\n *\n * 各 Provider 只需提供 VectorDriver,base 层统一处理连接守卫与运行时异常。\n */\nexport function createBaseVectorOps(ctx: VecdbOpsContext, driver: VectorDriver): VectorOperations {\n return {\n insert: (collection, documents) => {\n logVecdbOperation(ctx, 'write', 'vector.insert', { collection, count: documents.length, documents })\n return wrapOp(\n ctx,\n () => documents.length === 0 ? Promise.resolve(ok(undefined)) : driver.insert(collection, documents),\n HaiVecdbError.INSERT_FAILED,\n 'Failed to insert vectors',\n { collection },\n )\n },\n upsert: (collection, documents) => {\n logVecdbOperation(ctx, 'write', 'vector.upsert', { collection, count: documents.length, documents })\n return wrapOp(\n ctx,\n () => documents.length === 0 ? Promise.resolve(ok(undefined)) : driver.upsert(collection, documents),\n HaiVecdbError.UPDATE_FAILED,\n 'Failed to upsert vectors',\n { collection },\n )\n },\n delete: (collection, ids) => {\n logVecdbOperation(ctx, 'write', 'vector.delete', { collection, count: ids.length, ids })\n return wrapOp(\n ctx,\n () => ids.length === 0 ? Promise.resolve(ok(undefined)) : driver.delete(collection, ids),\n HaiVecdbError.DELETE_FAILED,\n 'Failed to delete vectors',\n { collection },\n )\n },\n search: (collection, vector, options) => {\n logVecdbOperation(ctx, 'read', 'vector.search', { collection, vector, options })\n return wrapOp(\n ctx,\n () => driver.search(collection, vector, options),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to search vectors',\n { collection },\n )\n },\n count: (collection) => {\n logVecdbOperation(ctx, 'read', 'vector.count', { collection })\n return wrapOp(\n ctx,\n () => driver.count(collection),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to count vectors',\n { collection },\n )\n },\n }\n}\n","/**\n * @h-ai/vecdb — Chroma Provider\n *\n * 基于 Chroma 向量数据库的 Provider 实现。Chroma 在 Node 端只有 HTTP 客户端,\n * 本 Provider 支持两种模式:\n * - **嵌入式**:提供 `path` 且无 `url` 时,connect 自动拉起本地 `chroma run` 服务\n * (持久化到 `path`),close 时关闭进程。\n * - **直连**:提供 `url` 时直接连接已有服务,不拉起进程。\n *\n * 向量由调用方显式提供,集合不使用 Chroma 内置 embedding function。\n * @module vecdb-provider-chroma\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ChildProcess } from 'node:child_process'\nimport type { ChromaConfig, DistanceMetric } from '../vecdb-config.js'\nimport type {\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { spawn } from 'node:child_process'\nimport { setTimeout as delay } from 'node:timers/promises'\nimport { core, err, ok } from '@h-ai/core'\n\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'chroma' })\nconst DIMENSION_METADATA_KEY = 'hai_dimension'\nconst SPACE_METADATA_KEY = 'hnsw:space'\nconst HEARTBEAT_POLL_INTERVAL = 300\n\n/** Chroma Collection 的最小接口定义(避免强依赖可选包) */\ninterface ChromaCollection {\n metadata?: Record<string, unknown> | null\n add: (params: ChromaWriteParams) => Promise<unknown>\n upsert: (params: ChromaWriteParams) => Promise<unknown>\n delete: (params: { ids: string[] }) => Promise<unknown>\n query: (params: { queryEmbeddings: number[][], nResults?: number, where?: Record<string, unknown> }) => Promise<ChromaQueryResult>\n count: () => Promise<number>\n}\n\ninterface ChromaWriteParams {\n ids: string[]\n embeddings: number[][]\n documents?: (string | null)[]\n metadatas?: (Record<string, unknown> | null)[]\n}\n\ninterface ChromaQueryResult {\n ids: string[][]\n distances?: (number[] | null)[] | null\n documents?: ((string | null)[] | null)[] | null\n metadatas?: ((Record<string, unknown> | null)[] | null)[] | null\n}\n\ninterface ChromaClient {\n heartbeat: () => Promise<number>\n getOrCreateCollection: (params: { name: string, metadata?: Record<string, unknown>, embeddingFunction?: unknown }) => Promise<ChromaCollection>\n getCollection: (params: { name: string, embeddingFunction?: unknown }) => Promise<ChromaCollection>\n deleteCollection: (params: { name: string }) => Promise<unknown>\n listCollections: () => Promise<Array<{ name: string } | string>>\n}\n\n/** Chroma 模块的最小接口 */\ninterface ChromaModule {\n ChromaClient: new (params: Record<string, unknown>) => ChromaClient\n}\n\nfunction isChromaModule(value: unknown): value is ChromaModule {\n return typeof value === 'object' && value !== null && typeof (value as { ChromaClient?: unknown }).ChromaClient === 'function'\n}\n\n/**\n * 占位 embedding function:本 Provider 始终显式传入向量,此函数不会被调用。\n * 提供它是为了避免 Chroma 在无 embedding function 时加载默认实现(需额外依赖)。\n */\nconst NOOP_EMBEDDING_FUNCTION = {\n name: 'hai-noop',\n async generate(): Promise<number[][]> {\n throw new Error('Chroma embedding function should not be called: vectors are provided explicitly')\n },\n}\n\n/** DistanceMetric → Chroma hnsw:space */\nfunction toChromaSpace(metric: DistanceMetric): string {\n if (metric === 'euclidean')\n return 'l2'\n if (metric === 'dot')\n return 'ip'\n return 'cosine'\n}\n\n/** Chroma hnsw:space → DistanceMetric */\nfunction fromChromaSpace(space: unknown): DistanceMetric {\n if (space === 'l2')\n return 'euclidean'\n if (space === 'ip')\n return 'dot'\n return 'cosine'\n}\n\n/** 将 Chroma 距离转换为相似度分数 [0, 1] */\nfunction distanceToScore(distance: number, metric: DistanceMetric): number {\n if (metric === 'cosine')\n return Math.max(0, Math.min(1, 1 - distance))\n return 1 / (1 + Math.max(0, distance))\n}\n\n/** 构建 Chroma where 过滤条件(单键直接匹配,多键用 $and) */\nfunction buildWhere(filter?: Record<string, unknown>): Record<string, unknown> | undefined {\n if (!filter)\n return undefined\n const entries = Object.entries(filter)\n if (entries.length === 0)\n return undefined\n if (entries.length === 1)\n return { [entries[0][0]]: entries[0][1] }\n return { $and: entries.map(([key, value]) => ({ [key]: value })) }\n}\n\n/**\n * 创建 Chroma Provider\n */\nexport function createChromaProvider(): VecdbProvider {\n let client: ChromaClient | null = null\n let config: ChromaConfig | null = null\n let serverProcess: ChildProcess | null = null\n\n function isMissingModuleError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes('chromadb')\n }\n\n /** 动态加载 Chroma JS 客户端 */\n async function loadChromaModule(): Promise<HaiResult<ChromaModule>> {\n try {\n const mod = await import('chromadb')\n if (!isChromaModule(mod)) {\n const error = new Error('chromadb driver module does not export ChromaClient')\n logger.error('Failed to load Chroma driver', { error: error.message })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'chromadb' } }), error)\n }\n return ok(mod)\n }\n catch (error) {\n if (isMissingModuleError(error)) {\n logger.error('Failed to load Chroma driver', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'chromadb' } }), error)\n }\n throw error\n }\n }\n\n /** 拉起本地 Chroma 服务(嵌入式模式) */\n function startEmbeddedServer(chromaConfig: ChromaConfig): void {\n const args = ['run', '--path', chromaConfig.path ?? './data/chroma', '--host', chromaConfig.host, '--port', String(chromaConfig.port)]\n logger.info('Starting embedded Chroma server', { command: chromaConfig.serverCommand, host: chromaConfig.host, port: chromaConfig.port })\n const proc = spawn(chromaConfig.serverCommand, args, { stdio: 'ignore' })\n proc.on('error', (error: Error) => {\n logger.error('Chroma server process error', { error: error.message })\n })\n serverProcess = proc\n }\n\n /** 停止本地 Chroma 服务 */\n function stopEmbeddedServer(): void {\n if (!serverProcess)\n return\n try {\n serverProcess.kill()\n }\n catch (error) {\n logger.warn('Failed to stop Chroma server', { error: error instanceof Error ? error.message : String(error) })\n }\n serverProcess = null\n }\n\n /** 轮询心跳直至就绪或超时 */\n async function waitForHeartbeat(chromaClient: ChromaClient, timeout: number): Promise<void> {\n const deadline = Date.now() + timeout\n let lastError: unknown\n while (Date.now() < deadline) {\n try {\n await chromaClient.heartbeat()\n return\n }\n catch (error) {\n lastError = error\n await delay(HEARTBEAT_POLL_INTERVAL)\n }\n }\n throw new Error(`Chroma heartbeat timed out after ${timeout}ms: ${lastError instanceof Error ? lastError.message : String(lastError)}`)\n }\n\n /** 获取集合(含维度校验所需的 metadata) */\n async function getCollection(name: string): Promise<ChromaCollection> {\n return client!.getCollection({ name, embeddingFunction: NOOP_EMBEDDING_FUNCTION })\n }\n\n /** 读取集合存储的维度 */\n function readDimension(collection: ChromaCollection): number {\n const value = collection.metadata?.[DIMENSION_METADATA_KEY]\n return typeof value === 'number' ? value : 0\n }\n\n function validateDimension<T>(expected: number, actual: number): HaiResult<T> | null {\n if (expected === 0 || expected === actual)\n return null\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', { params: { expected: String(expected), actual: String(actual) } }),\n )\n }\n\n const ctx = { isConnected: () => client !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n logger.debug('Creating collection', { name, dimension: options.dimension, metric: options.metric })\n\n const existing = await client!.listCollections()\n const exists = existing.some(item => (typeof item === 'string' ? item : item.name) === name)\n if (exists)\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n\n const metric = options.metric ?? config?.metric ?? 'cosine'\n await client!.getOrCreateCollection({\n name,\n metadata: { [SPACE_METADATA_KEY]: toChromaSpace(metric), [DIMENSION_METADATA_KEY]: options.dimension },\n embeddingFunction: NOOP_EMBEDDING_FUNCTION,\n })\n\n logger.info('Collection created', { name, dimension: options.dimension, metric })\n return ok(undefined)\n },\n\n async drop(name) {\n logger.debug('Dropping collection', { name })\n const existing = await client!.listCollections()\n const exists = existing.some(item => (typeof item === 'string' ? item : item.name) === name)\n if (!exists)\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n\n await client!.deleteCollection({ name })\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n const existing = await client!.listCollections()\n return ok(existing.some(item => (typeof item === 'string' ? item : item.name) === name))\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n const existing = await client!.listCollections()\n if (!existing.some(item => (typeof item === 'string' ? item : item.name) === name))\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n\n const collection = await getCollection(name)\n const count = await collection.count()\n return ok({\n name,\n dimension: readDimension(collection),\n metric: fromChromaSpace(collection.metadata?.[SPACE_METADATA_KEY]),\n count,\n })\n },\n\n async list() {\n logger.debug('Listing collections')\n const existing = await client!.listCollections()\n return ok(existing.map(item => (typeof item === 'string' ? item : item.name)))\n },\n }\n\n // ─── 向量操作适配器 ───\n\n function toWriteParams(documents: { id: string, vector: number[], content?: string, metadata?: Record<string, unknown> }[]): ChromaWriteParams {\n return {\n ids: documents.map(doc => doc.id),\n embeddings: documents.map(doc => doc.vector),\n documents: documents.map(doc => doc.content ?? null),\n metadatas: documents.map(doc => ({ ...doc.metadata, _content: doc.content ?? '' })),\n }\n }\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n logger.debug('Inserting vectors', { collection, count: documents.length })\n const target = await getCollection(collection)\n const expected = readDimension(target)\n for (const doc of documents) {\n const validation = validateDimension<void>(expected, doc.vector.length)\n if (validation)\n return validation\n }\n await target.add(toWriteParams(documents))\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n logger.debug('Upserting vectors', { collection, count: documents.length })\n const target = await getCollection(collection)\n const expected = readDimension(target)\n for (const doc of documents) {\n const validation = validateDimension<void>(expected, doc.vector.length)\n if (validation)\n return validation\n }\n await target.upsert(toWriteParams(documents))\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n logger.debug('Deleting vectors', { collection, count: ids.length })\n const target = await getCollection(collection)\n await target.delete({ ids })\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n logger.debug('Searching vectors', { collection, topK, hasFilter: !!options?.filter })\n\n const target = await getCollection(collection)\n const expected = readDimension(target)\n const validation = validateDimension<VectorSearchResult[]>(expected, vector.length)\n if (validation)\n return validation\n\n const metric = fromChromaSpace(target.metadata?.[SPACE_METADATA_KEY])\n const response = await target.query({ queryEmbeddings: [vector], nResults: topK, where: buildWhere(options?.filter) })\n\n const ids = response.ids[0] ?? []\n const distances = response.distances?.[0] ?? []\n const metadatas = response.metadatas?.[0] ?? []\n\n const results: VectorSearchResult[] = []\n for (let i = 0; i < ids.length; i++) {\n const score = distanceToScore(distances[i] ?? 0, metric)\n if (score < minScore)\n continue\n const metadata = metadatas[i] ?? {}\n const { _content, ...rest } = metadata\n results.push({\n id: ids[i],\n score,\n content: typeof _content === 'string' && _content.length > 0 ? _content : undefined,\n metadata: Object.keys(rest).length > 0 ? rest : undefined,\n })\n }\n return ok(results)\n },\n\n async count(collection) {\n logger.debug('Counting vectors', { collection })\n const target = await getCollection(collection)\n return ok(await target.count())\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'chroma',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'chroma')\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n\n const chromaConfig = cfg as ChromaConfig\n const embedded = !!chromaConfig.path && !chromaConfig.url\n\n const loadResult = await loadChromaModule()\n if (!loadResult.success)\n return loadResult\n\n try {\n if (embedded)\n startEmbeddedServer(chromaConfig)\n\n const clientParams: Record<string, unknown> = chromaConfig.url\n ? { path: chromaConfig.url }\n : { host: chromaConfig.host, port: chromaConfig.port }\n if (chromaConfig.apiKey)\n clientParams.auth = { provider: 'token', credentials: chromaConfig.apiKey, tokenHeaderType: 'AUTHORIZATION' }\n\n // chromadb 为 optionalDependencies,动态 import 后类型与本地最小接口不兼容,需强转\n const chromaClient = new loadResult.data.ChromaClient(clientParams) as unknown as ChromaClient\n await waitForHeartbeat(chromaClient, embedded ? chromaConfig.startupTimeout : 5000)\n\n client = chromaClient\n config = chromaConfig\n logger.info('Chroma connected', { embedded, host: chromaConfig.host, port: chromaConfig.port })\n return ok(undefined)\n }\n catch (error) {\n stopEmbeddedServer()\n logger.error('Failed to connect to Chroma', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n stopEmbeddedServer()\n client = null\n config = null\n logger.info('Chroma connection closed')\n return ok(undefined)\n },\n\n isConnected(): boolean {\n return client !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — LanceDB Provider\n *\n * 基于 LanceDB 的向量数据库 Provider 实现。\n * LanceDB 为嵌入式向量数据库,数据存储在本地文件系统中。\n * @module vecdb-provider-lancedb\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { LancedbConfig } from '../vecdb-config.js'\nimport type {\n CollectionInfo,\n VectorDocument,\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { createRequire } from 'node:module'\nimport { core, err, ok } from '@h-ai/core'\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\n// @lancedb/lancedb 为可选原生依赖,用 require 运行时加载(见 loadLancedb)\nconst require = createRequire(import.meta.url)\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'lancedb' })\n\n// ─── LanceDB 类型接口(动态 import 使用,避免强依赖可选包) ───\n\n/** LanceDB 连接的最小接口定义 */\ninterface LanceConnection {\n tableNames: () => Promise<string[]>\n openTable: (name: string) => Promise<LanceTable>\n createTable: (name: string, data: Record<string, unknown>[]) => Promise<LanceTable>\n dropTable: (name: string) => Promise<void>\n}\n\n/** LanceDB Table 的最小接口定义 */\ninterface LanceTable {\n add: (data: Record<string, unknown>[]) => Promise<void>\n delete: (filter: string) => Promise<void>\n countRows: () => Promise<number>\n mergeInsert?: (on: string | string[]) => LanceMergeInsertBuilder\n search: (...args: unknown[]) => LanceSearchQuery\n}\n\n/** LanceDB merge insert builder 的最小接口 */\ninterface LanceMergeInsertBuilder {\n whenMatchedUpdateAll: () => LanceMergeInsertBuilder\n whenNotMatchedInsertAll: () => LanceMergeInsertBuilder\n execute: (data: Record<string, unknown>[]) => Promise<unknown>\n}\n\n/** LanceDB 查询构建器的最小接口 */\ninterface LanceSearchQuery {\n limit: (n: number) => LanceSearchQuery\n where: (filter: string) => LanceSearchQuery\n toArray: () => Promise<Record<string, unknown>[]>\n}\n\n/** 转义 LanceDB filter 表达式中的字符串值(防注入 + LIKE 通配符) */\nfunction escapeLanceFilterValue(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/%/g, '\\\\%')\n .replace(/_/g, '\\\\_')\n}\n\n/** SQL 字符串字面量使用单引号,ID 中的引号按标准 SQL 转义,保留其他字符。 */\nfunction escapeLanceSqlValue(value: string): string {\n return value.replace(/'/g, '\\'\\'')\n}\n\n/**\n * 集合元信息(内存维护,LanceDB 不存储维度等信息)\n */\ninterface CollectionMeta {\n /** 向量维度 */\n dimension: number\n /** 距离度量 */\n metric: string\n}\n\n/**\n * 创建 LanceDB Provider\n *\n * @returns VecdbProvider 实例\n */\nexport function createLancedbProvider(): VecdbProvider {\n let connection: LanceConnection | null = null\n let config: LancedbConfig | null = null\n\n /** 集合元信息缓存 */\n const collectionMetas = new Map<string, CollectionMeta>()\n\n // ─── 辅助函数 ───\n\n /**\n * 加载 @lancedb/lancedb。\n *\n * 用 require 而非 import():import() 会被打包器(如 SvelteKit adapter-node)静态跟随并尝试\n * 内联原生 .node 二进制导致构建失败;require 为运行时调用,打包器不跟随,消费方无需将\n * @lancedb/lancedb 声明为直接依赖(与 @h-ai/reldb 加载 better-sqlite3 的方式一致)。\n */\n function loadLancedb(): HaiResult<typeof import('@lancedb/lancedb')> {\n try {\n const mod = require('@lancedb/lancedb') as typeof import('@lancedb/lancedb')\n return ok(mod)\n }\n catch (error) {\n logger.error('Failed to load @lancedb/lancedb', { error })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: '@lancedb/lancedb' } }), error)\n }\n }\n\n /**\n * 打开或创建 LanceDB Table\n */\n async function openTable(name: string): Promise<LanceTable | null> {\n if (!connection)\n return null\n try {\n const tableNames = await connection.tableNames()\n if (tableNames.includes(name)) {\n return await connection.openTable(name)\n }\n return null\n }\n catch {\n return null\n }\n }\n\n /** 获取集合维度(若未知则返回 null) */\n function getCollectionDimension(name: string): number | null {\n return collectionMetas.get(name)?.dimension ?? null\n }\n\n /** 创建统一的维度不匹配错误结果 */\n function createDimensionMismatchResult<T>(expected: number, actual: number): HaiResult<T> {\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', {\n params: { expected: String(expected), actual: String(actual) },\n }),\n )\n }\n\n /** 校验查询向量维度 */\n function validateVectorDimension<T>(collection: string, vector: number[]): HaiResult<T> | null {\n const expected = getCollectionDimension(collection)\n if (expected === null || vector.length === expected) {\n return null\n }\n\n return createDimensionMismatchResult<T>(expected, vector.length)\n }\n\n /** 校验批量文档维度 */\n function validateDocumentsDimension(collection: string, documents: VectorDocument[]): HaiResult<void> | null {\n const expected = getCollectionDimension(collection)\n if (expected === null) {\n return null\n }\n\n for (const document of documents) {\n if (document.vector.length !== expected) {\n return createDimensionMismatchResult<void>(expected, document.vector.length)\n }\n }\n\n return null\n }\n\n // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => connection !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n logger.debug('Creating collection', { name, dimension: options.dimension, metric: options.metric })\n\n const tableNames = await connection!.tableNames()\n if (tableNames.includes(name)) {\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n }\n\n // 创建包含初始记录的表以确定 schema\n const dimension = options.dimension\n const metric = options.metric ?? config?.metric ?? 'cosine'\n const initRecord = {\n id: '__init__',\n vector: Array.from({ length: dimension }).fill(0),\n content: '',\n metadata: '{}',\n }\n\n const table = await connection!.createTable(name, [initRecord])\n // 删除初始记录\n await table.delete('id = \\'__init__\\'')\n\n collectionMetas.set(name, { dimension, metric })\n\n logger.info('Collection created', { name, dimension, metric })\n return ok(undefined)\n },\n\n async drop(name) {\n logger.debug('Dropping collection', { name })\n\n const tableNames = await connection!.tableNames()\n if (!tableNames.includes(name)) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n await connection!.dropTable(name)\n collectionMetas.delete(name)\n\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n\n const tableNames = await connection!.tableNames()\n return ok(tableNames.includes(name))\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n const table = await openTable(name)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n const count = await table.countRows()\n const meta = collectionMetas.get(name)\n\n return ok({\n name,\n dimension: meta?.dimension ?? 0,\n metric: (meta?.metric ?? config?.metric ?? 'cosine') as CollectionInfo['metric'],\n count,\n })\n },\n\n async list() {\n logger.debug('Listing collections')\n\n const tableNames = await connection!.tableNames()\n return ok(tableNames)\n },\n }\n\n // ─── 向量操作适配器 ───\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n logger.debug('Inserting vectors', { collection, count: documents.length })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const dimensionValidation = validateDocumentsDimension(collection, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const records = documents.map(doc => ({\n id: doc.id,\n vector: doc.vector,\n content: doc.content ?? '',\n metadata: JSON.stringify(doc.metadata ?? {}),\n }))\n\n await table.add(records)\n\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n logger.debug('Upserting vectors', { collection, count: documents.length })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const dimensionValidation = validateDocumentsDimension(collection, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const records = documents.map(doc => ({\n id: doc.id,\n vector: doc.vector,\n content: doc.content ?? '',\n metadata: JSON.stringify(doc.metadata ?? {}),\n }))\n\n if (typeof table.mergeInsert === 'function') {\n await table\n .mergeInsert('id')\n .whenMatchedUpdateAll()\n .whenNotMatchedInsertAll()\n .execute(records)\n }\n else {\n logger.warn('LanceDB mergeInsert is unavailable, falling back to delete/add upsert')\n const ids = documents.map(d => `'${escapeLanceSqlValue(d.id)}'`).join(', ')\n await table.delete(`id IN (${ids})`)\n await table.add(records)\n }\n\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n logger.debug('Deleting vectors', { collection, count: ids.length })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const idList = ids.map(id => `'${escapeLanceSqlValue(id)}'`).join(', ')\n await table.delete(`id IN (${idList})`)\n\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n logger.debug('Searching vectors', { collection, topK: options?.topK, hasFilter: !!options?.filter })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const dimensionValidation = validateVectorDimension<VectorSearchResult[]>(collection, vector)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n\n let query = table.search(vector).limit(topK)\n\n // 应用元数据过滤\n if (options?.filter) {\n const filterParts: string[] = []\n for (const [key, value] of Object.entries(options.filter)) {\n // LanceDB 过滤基于 SQL WHERE 子句(metadata 为 JSON 字符串)\n filterParts.push(`metadata LIKE '%\"${escapeLanceFilterValue(key)}\":\"${escapeLanceFilterValue(String(value))}\"%'`)\n }\n if (filterParts.length > 0) {\n query = query.where(filterParts.join(' AND '))\n }\n }\n\n const results = await query.toArray()\n\n const searchResults: VectorSearchResult[] = results\n .map((row: Record<string, unknown>) => {\n // LanceDB 返回 _distance(L2 距离),转换为相似度\n const distance = (row._distance as number) ?? 0\n const score = 1 / (1 + distance)\n\n return {\n id: row.id as string,\n score,\n content: (row.content as string) || undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) as Record<string, unknown> : undefined,\n }\n })\n .filter((r: VectorSearchResult) => r.score >= minScore)\n\n return ok(searchResults)\n },\n\n async count(collection) {\n logger.debug('Counting vectors', { collection })\n\n const table = await openTable(collection)\n if (!table) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name: collection } }))\n }\n\n const count = await table.countRows()\n return ok(count)\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'lancedb',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'lancedb') {\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n }\n\n const lanceConfig = cfg as LancedbConfig\n const loadResult = loadLancedb()\n if (!loadResult.success)\n return loadResult\n\n const lancedb = loadResult.data\n\n try {\n // @lancedb/lancedb 为 optionalDependencies,动态 import 后类型与本地最小接口不兼容,需强转\n connection = await lancedb.connect(lanceConfig.path) as unknown as LanceConnection\n config = lanceConfig\n\n // 恢复已有集合的元信息\n // 限制:LanceDB 不持久化维度/度量元信息,此处通过读取首条记录推断。\n // 若表为空或向量维度与探测维度不匹配,dimension 将为 0。\n const tableNames = await connection!.tableNames()\n await Promise.allSettled(tableNames.map(async (name) => {\n try {\n const table = await connection!.openTable(name)\n const count = await table.countRows()\n if (count === 0)\n return\n // 使用 1 维零向量探测,若真实维度不同 LanceDB 可能报错\n const rows = await table.search(Array.from({ length: 1 }).fill(0)).limit(1).toArray()\n if (rows.length > 0 && rows[0].vector) {\n collectionMetas.set(name, {\n dimension: (rows[0].vector as number[]).length,\n metric: lanceConfig.metric ?? 'cosine',\n })\n }\n }\n catch {\n // 无法推断维度(例如维度不匹配),跳过;info() 将返回 dimension=0\n }\n }))\n\n logger.info('LanceDB connected', { path: lanceConfig.path })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Failed to connect to LanceDB', { error })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n connection = null\n config = null\n collectionMetas.clear()\n logger.info('LanceDB connection closed')\n return ok(undefined)\n },\n\n isConnected(): boolean {\n return connection !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — pgvector Provider\n *\n * 基于 PostgreSQL + pgvector 扩展的向量数据库 Provider 实现。\n * 使用 pg 驱动连接,支持 IVFFlat 和 HNSW 索引。\n * @module vecdb-provider-pgvector\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { PgvectorConfig } from '../vecdb-config.js'\nimport type {\n VectorDocument,\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'pgvector' })\n\n/** pg Pool 的最小接口定义(避免强依赖可选包) */\ninterface PgPool {\n query: (text: string, params?: unknown[]) => Promise<{ rows: Record<string, unknown>[] }>\n end: () => Promise<void>\n}\n\n/** pg 模块的最小接口定义(避免强依赖可选包) */\ninterface PgModule {\n Pool: new (config: unknown) => PgPool\n}\n\nfunction isPgModule(value: unknown): value is PgModule {\n if (typeof value !== 'object' || value === null) {\n return false\n }\n\n const maybeModule = value as { Pool?: unknown }\n return typeof maybeModule.Pool === 'function'\n}\n\n/**\n * 创建 pgvector Provider\n *\n * @returns VecdbProvider 实例\n */\nexport function createPgvectorProvider(): VecdbProvider {\n let pool: PgPool | null = null\n let config: PgvectorConfig | null = null\n\n // ─── 辅助函数 ───\n\n /** 获取完整表名(带前缀) */\n function tableName(collection: string): string {\n return `${config?.tablePrefix ?? 'vec_'}${collection}`\n }\n\n /** 双引号转义 SQL 标识符,支持含特殊字符的表名 */\n function quoteIdent(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`\n }\n\n /** 获取距离算符(pgvector 语法) */\n function distanceOp(): string {\n const metric = config?.metric ?? 'cosine'\n switch (metric) {\n case 'cosine': return '<=>'\n case 'euclidean': return '<->'\n case 'dot': return '<#>'\n default: return '<=>'\n }\n }\n\n /** 将距离转换为相似度得分 [0, 1] */\n function distanceToScore(distance: number): number {\n const metric = config?.metric ?? 'cosine'\n switch (metric) {\n case 'cosine':\n // cosine distance ∈ [0, 2],相似度 = 1 - distance/2 → [0, 1]\n return 1 - distance / 2\n case 'euclidean':\n return 1 / (1 + distance)\n case 'dot':\n // 内积距离为负内积,得分 = -distance\n return -distance\n default:\n return 1 / (1 + distance)\n }\n }\n\n /** 判断动态 import 是否因缺少驱动失败 */\n function isMissingModuleError(error: unknown, packageName: string): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes(`'${packageName}'`) || message.includes(`\\\"${packageName}\\\"`) || message.includes(packageName)\n }\n\n /** 动态加载 pg 驱动 */\n async function loadPg(): Promise<HaiResult<PgModule>> {\n try {\n const mod = await import('pg')\n if (!isPgModule(mod)) {\n const error = new Error('pg driver module does not export Pool')\n logger.error('Failed to load pg driver', { error: error.message })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'pg' } }), error)\n }\n\n return ok(mod)\n }\n catch (error) {\n if (isMissingModuleError(error, 'pg')) {\n logger.error('Failed to load pg driver', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'pg' } }), error)\n }\n throw error\n }\n }\n\n /** 获取集合维度;集合不存在时返回 COLLECTION_NOT_FOUND */\n async function getCollectionDimension(name: string): Promise<HaiResult<number>> {\n const table = tableName(name)\n\n const existsResult = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [table],\n )\n if (!existsResult.rows[0].exists) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n const dimResult = await pool!.query(`\n SELECT atttypmod FROM pg_attribute\n WHERE attrelid = $1::regclass AND attname = 'vector'\n `, [quoteIdent(table)])\n\n return ok(dimResult.rows.length > 0 ? Number(dimResult.rows[0].atttypmod) : 0)\n }\n\n /** 校验查询向量维度 */\n function validateVectorDimension<T>(expected: number, actual: number): HaiResult<T> | null {\n if (expected === actual) {\n return null\n }\n\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', {\n params: { expected: String(expected), actual: String(actual) },\n }),\n )\n }\n\n /** 校验批量文档维度 */\n function validateDocumentsDimension(expected: number, documents: VectorDocument[]): HaiResult<void> | null {\n for (const document of documents) {\n const validation = validateVectorDimension<void>(expected, document.vector.length)\n if (validation) {\n return validation\n }\n }\n\n return null\n }\n\n // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => pool !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n const table = tableName(name)\n const dimension = options.dimension\n const metric = options.metric ?? config?.metric ?? 'cosine'\n const indexType = config?.indexType ?? 'hnsw'\n\n logger.debug('Creating collection', { name, dimension, metric, indexType })\n\n // 检查表是否已存在\n const checkResult = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [table],\n )\n if (checkResult.rows[0].exists) {\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n }\n\n // 创建表\n const qi = quoteIdent(table)\n await pool!.query(`\n CREATE TABLE ${qi} (\n id TEXT PRIMARY KEY,\n vector vector(${dimension}),\n content TEXT,\n metadata JSONB DEFAULT '{}'::jsonb\n )\n `)\n\n // 创建向量索引\n const distOp = distanceOp()\n const opsClass = distOp === '<=>'\n ? 'vector_cosine_ops'\n : distOp === '<->'\n ? 'vector_l2_ops'\n : 'vector_ip_ops'\n\n if (indexType === 'hnsw') {\n await pool!.query(`\n CREATE INDEX ON ${qi}\n USING hnsw (vector ${opsClass})\n `)\n }\n else {\n // IVFFlat lists 参数:建表时数据为空,使用 100 作为通用默认值\n // 适用于 100 万行以内的数据集;超大数据集应在数据增长后重建索引\n await pool!.query(`\n CREATE INDEX ON ${qi}\n USING ivfflat (vector ${opsClass})\n WITH (lists = 100)\n `)\n }\n\n logger.info('Collection created', { name, dimension, metric, indexType })\n return ok(undefined)\n },\n\n async drop(name) {\n const table = tableName(name)\n\n logger.debug('Dropping collection', { name })\n\n const checkResult = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [table],\n )\n if (!checkResult.rows[0].exists) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n await pool!.query(`DROP TABLE ${quoteIdent(table)}`)\n\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n\n const result = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [tableName(name)],\n )\n return ok(result.rows[0].exists as boolean)\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n const table = tableName(name)\n const dimensionResult = await getCollectionDimension(name)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n // 获取文档数量\n const countResult = await pool!.query(`SELECT COUNT(*) as count FROM ${quoteIdent(table)}`)\n const count = Number.parseInt(String(countResult.rows[0].count), 10)\n\n return ok({\n name,\n dimension: dimensionResult.data,\n metric: config?.metric ?? 'cosine',\n count,\n })\n },\n\n async list() {\n const prefix = config?.tablePrefix ?? 'vec_'\n\n logger.debug('Listing collections')\n\n const result = await pool!.query(\n `SELECT table_name FROM information_schema.tables WHERE table_name LIKE $1 AND table_schema = 'public'`,\n [`${prefix}%`],\n )\n const names = result.rows.map((row: Record<string, unknown>) =>\n String(row.table_name).slice(prefix.length),\n )\n return ok(names)\n },\n }\n\n // ─── 向量操作适配器 ───\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n const table = tableName(collection)\n\n logger.debug('Inserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateDocumentsDimension(dimensionResult.data, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n // 构建多值 INSERT(单条 SQL,避免 await-in-loop N+1 问题)\n // 注意:PostgreSQL 参数上限为 65535,每条文档占 4 个参数,单批最多 ~16383 条\n const qi = quoteIdent(table)\n const values: string[] = []\n const params: unknown[] = []\n for (let i = 0; i < documents.length; i++) {\n const base = i * 4\n values.push(`($${base + 1}, $${base + 2}::vector, $${base + 3}, $${base + 4}::jsonb)`)\n const doc = documents[i]\n params.push(doc.id, `[${doc.vector.join(',')}]`, doc.content ?? '', JSON.stringify(doc.metadata ?? {}))\n }\n\n await pool!.query(\n `INSERT INTO ${qi} (id, vector, content, metadata) VALUES ${values.join(', ')}`,\n params,\n )\n\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n const table = tableName(collection)\n\n logger.debug('Upserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateDocumentsDimension(dimensionResult.data, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const qi = quoteIdent(table)\n // 构建多值 INSERT ON CONFLICT(单条 SQL,避免 await-in-loop N+1 问题)\n const values: string[] = []\n const params: unknown[] = []\n for (let i = 0; i < documents.length; i++) {\n const base = i * 4\n values.push(`($${base + 1}, $${base + 2}::vector, $${base + 3}, $${base + 4}::jsonb)`)\n const doc = documents[i]\n params.push(doc.id, `[${doc.vector.join(',')}]`, doc.content ?? '', JSON.stringify(doc.metadata ?? {}))\n }\n\n await pool!.query(\n `INSERT INTO ${qi} (id, vector, content, metadata) VALUES ${values.join(', ')}\n ON CONFLICT (id) DO UPDATE SET\n vector = EXCLUDED.vector,\n content = EXCLUDED.content,\n metadata = EXCLUDED.metadata`,\n params,\n )\n\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n const table = tableName(collection)\n\n logger.debug('Deleting vectors', { collection, count: ids.length })\n\n const placeholders = ids.map((_, i) => `$${i + 1}`).join(', ')\n await pool!.query(`DELETE FROM ${quoteIdent(table)} WHERE id IN (${placeholders})`, ids)\n\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n const table = tableName(collection)\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n const op = distanceOp()\n\n logger.debug('Searching vectors', { collection, topK, hasFilter: !!options?.filter })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateVectorDimension<VectorSearchResult[]>(dimensionResult.data, vector.length)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const vectorStr = `[${vector.join(',')}]`\n\n // 构建过滤条件\n let filterSQL = ''\n const filterParams: unknown[] = [vectorStr, topK]\n let paramIndex = 3\n\n if (options?.filter) {\n const filterParts: string[] = []\n for (const [key, value] of Object.entries(options.filter)) {\n filterParts.push(`metadata->>$${paramIndex} = $${paramIndex + 1}`)\n filterParams.push(key, String(value))\n paramIndex += 2\n }\n if (filterParts.length > 0) {\n filterSQL = `WHERE ${filterParts.join(' AND ')}`\n }\n }\n\n const result = await pool!.query(\n `SELECT id, content, metadata, vector ${op} $1::vector AS distance\n FROM ${quoteIdent(table)}\n ${filterSQL}\n ORDER BY vector ${op} $1::vector\n LIMIT $2`,\n filterParams,\n )\n\n const searchResults: VectorSearchResult[] = result.rows\n .map((row: Record<string, unknown>) => {\n const score = distanceToScore(row.distance as number)\n return {\n id: row.id as string,\n score,\n content: (row.content as string) || undefined,\n metadata: row.metadata as Record<string, unknown> | undefined,\n }\n })\n .filter((r: VectorSearchResult) => r.score >= minScore)\n\n return ok(searchResults)\n },\n\n async count(collection) {\n const table = tableName(collection)\n\n logger.debug('Counting vectors', { collection })\n\n const result = await pool!.query(`SELECT COUNT(*) as count FROM ${quoteIdent(table)}`)\n return ok(Number.parseInt(String(result.rows[0].count), 10))\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'pgvector',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'pgvector') {\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n }\n\n const pgConfig = cfg as PgvectorConfig\n\n try {\n const loadResult = await loadPg()\n if (!loadResult.success) {\n return loadResult\n }\n\n const { Pool } = loadResult.data\n\n const poolConfig = pgConfig.url\n ? { connectionString: pgConfig.url }\n : {\n host: pgConfig.host,\n port: pgConfig.port,\n database: pgConfig.database,\n user: pgConfig.user,\n password: pgConfig.password,\n }\n\n pool = new Pool(poolConfig)\n\n // 确保 pgvector 扩展已启用\n await pool.query('CREATE EXTENSION IF NOT EXISTS vector')\n\n config = pgConfig\n\n logger.info('pgvector connected', { host: pgConfig.host, database: pgConfig.database })\n return ok(undefined)\n }\n catch (error) {\n // 仅提取错误消息,避免 error 对象中的连接字符串泄漏密码\n logger.error('Failed to connect to pgvector', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n try {\n if (pool) {\n await pool.end()\n }\n pool = null\n config = null\n logger.info('pgvector connection closed')\n return ok(undefined)\n }\n catch (error) {\n logger.error('Failed to close pgvector connection', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_closeFailed', { params: { error: String(error) } }), error)\n }\n },\n\n isConnected(): boolean {\n return pool !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — Qdrant Provider\n *\n * 基于 Qdrant 向量搜索引擎的 Provider 实现。\n * 使用 @qdrant/js-client-rest 客户端连接。\n * @module vecdb-provider-qdrant\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { DistanceMetric, QdrantConfig } from '../vecdb-config.js'\nimport type {\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { createHash } from 'node:crypto'\nimport { core, err, ok } from '@h-ai/core'\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\n/** 脱敏 URL 中的用户名和密码 */\nfunction sanitizeUrl(url: string): string {\n try {\n const parsed = new URL(url)\n if (parsed.username)\n parsed.username = '***'\n if (parsed.password)\n parsed.password = '***'\n return parsed.toString()\n }\n catch {\n return '(invalid url)'\n }\n}\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'qdrant' })\n\n/** Qdrant Client 的最小接口定义(避免强依赖可选包) */\ninterface QdrantClient {\n getCollections: () => Promise<{ collections: { name: string }[] }>\n getCollection: QdrantGetCollectionMethod\n createCollection: (name: string, params: Record<string, unknown>) => Promise<unknown>\n deleteCollection: (name: string) => Promise<unknown>\n upsert: (collection: string, params: Record<string, unknown>) => Promise<unknown>\n delete: (collection: string, params: Record<string, unknown>) => Promise<unknown>\n query: (collection: string, params: Record<string, unknown>) => Promise<{ points: Record<string, unknown>[] }>\n}\n\n/** Qdrant getCollection 的返回类型 */\ninterface QdrantCollectionInfo {\n config?: { params?: { vectors?: { size?: number, distance?: string } } }\n points_count?: number\n}\n\n/** Qdrant getCollection 特定错误对象的最小接口 */\ninterface QdrantGetCollectionError {\n getActualType?: () => { status?: number }\n}\n\n/** Qdrant getCollection 方法的最小接口(含 typed error 构造器) */\ninterface QdrantGetCollectionMethod {\n (name: string): Promise<QdrantCollectionInfo>\n Error?: new (...args: never[]) => QdrantGetCollectionError\n}\n\n/** Qdrant 模块的最小接口 */\ninterface QdrantModule {\n QdrantClient: new (config: { url: string, apiKey?: string }) => QdrantClient\n}\n\nfunction isQdrantModule(value: unknown): value is QdrantModule {\n if (typeof value !== 'object' || value === null) {\n return false\n }\n\n const maybeModule = value as { QdrantClient?: unknown }\n return typeof maybeModule.QdrantClient === 'function'\n}\n\n/**\n * 将字符串 ID 转换为 UUID 格式(Qdrant 要求 UUID 或无符号整数作为 point ID)\n *\n * @param id - 原始字符串 ID\n * @returns UUID 格式字符串\n */\nfunction hashToUuid(id: string): string {\n const hash = createHash('sha256').update(id).digest('hex')\n return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-${hash.slice(12, 16)}-${hash.slice(16, 20)}-${hash.slice(20, 32)}`\n}\n\n/**\n * 将 DistanceMetric 转换为 Qdrant 距离类型名称\n */\nfunction toQdrantDistance(metric: DistanceMetric): string {\n switch (metric) {\n case 'cosine': return 'Cosine'\n case 'euclidean': return 'Euclid'\n case 'dot': return 'Dot'\n default: return 'Cosine'\n }\n}\n\n/**\n * 创建 Qdrant Provider\n *\n * @returns VecdbProvider 实例\n */\nexport function createQdrantProvider(): VecdbProvider {\n let client: QdrantClient | null = null\n let config: QdrantConfig | null = null\n\n // ─── 辅助函数 ───\n\n /** 判断动态 import 是否因缺少驱动失败 */\n function isMissingModuleError(error: unknown, packageName: string): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes(`'${packageName}'`) || message.includes(`\\\"${packageName}\\\"`) || message.includes(packageName)\n }\n\n /** 动态加载 Qdrant JS 客户端 */\n async function loadQdrantClient(): Promise<HaiResult<QdrantModule>> {\n try {\n const mod = await import('@qdrant/js-client-rest')\n if (!isQdrantModule(mod)) {\n const error = new Error('@qdrant/js-client-rest driver module does not export QdrantClient')\n logger.error('Failed to load Qdrant driver', { error: error.message })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: '@qdrant/js-client-rest' } }), error)\n }\n\n return ok(mod)\n }\n catch (error) {\n if (isMissingModuleError(error, '@qdrant/js-client-rest')) {\n logger.error('Failed to load Qdrant driver', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: '@qdrant/js-client-rest' } }), error)\n }\n throw error\n }\n }\n\n /** 判断 Qdrant 错误是否为 404(集合不存在) */\n function isQdrantNotFoundError(error: unknown): boolean {\n const getCollectionErrorCtor = client?.getCollection.Error\n if (getCollectionErrorCtor && error instanceof getCollectionErrorCtor) {\n return error.getActualType?.().status === 404\n }\n\n const maybeError = error as {\n status?: number\n response?: { status?: number }\n $metadata?: { httpStatusCode?: number }\n }\n\n return maybeError.status === 404\n || maybeError.response?.status === 404\n || maybeError.$metadata?.httpStatusCode === 404\n }\n\n /** 获取集合信息;集合不存在时返回 COLLECTION_NOT_FOUND,其余异常继续抛出 */\n async function getCollectionInfo(name: string): Promise<HaiResult<QdrantCollectionInfo>> {\n try {\n return ok(await client!.getCollection(name))\n }\n catch (error) {\n if (isQdrantNotFoundError(error)) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n throw error\n }\n }\n\n /** 获取集合维度 */\n async function getCollectionDimension(name: string): Promise<HaiResult<number>> {\n const infoResult = await getCollectionInfo(name)\n if (!infoResult.success) {\n return infoResult\n }\n\n return ok(infoResult.data.config?.params?.vectors?.size ?? 0)\n }\n\n /** 校验查询向量维度 */\n function validateVectorDimension<T>(expected: number, actual: number): HaiResult<T> | null {\n if (expected === actual) {\n return null\n }\n\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', {\n params: { expected: String(expected), actual: String(actual) },\n }),\n )\n }\n\n // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => client !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n logger.debug('Creating collection', { name, dimension: options.dimension, metric: options.metric })\n\n // 检查集合是否已存在\n const collections = await client!.getCollections()\n const exists = collections.collections.some((c: { name: string }) => c.name === name)\n if (exists) {\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n }\n\n const metric = options.metric ?? config?.metric ?? 'cosine'\n\n await client!.createCollection(name, {\n vectors: {\n size: options.dimension,\n distance: toQdrantDistance(metric),\n },\n })\n\n logger.info('Collection created', { name, dimension: options.dimension, metric })\n return ok(undefined)\n },\n\n async drop(name) {\n logger.debug('Dropping collection', { name })\n\n const infoResult = await getCollectionInfo(name)\n if (!infoResult.success) {\n return infoResult\n }\n\n await client!.deleteCollection(name)\n\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n\n try {\n await client!.getCollection(name)\n return ok(true)\n }\n catch (error) {\n if (isQdrantNotFoundError(error)) {\n return ok(false)\n }\n throw error\n }\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n const infoResult = await getCollectionInfo(name)\n if (!infoResult.success) {\n return infoResult\n }\n\n const collectionInfo = infoResult.data\n\n const vectorsConfig = collectionInfo.config?.params?.vectors\n const dimension = vectorsConfig?.size ?? 0\n\n // 从 Qdrant distance 字符串映射回 DistanceMetric\n const qdrantDistance = vectorsConfig?.distance ?? 'Cosine'\n const metric: DistanceMetric = qdrantDistance === 'Euclid'\n ? 'euclidean'\n : qdrantDistance === 'Dot' ? 'dot' : 'cosine'\n\n return ok({\n name,\n dimension,\n metric,\n count: collectionInfo.points_count ?? 0,\n })\n },\n\n async list() {\n logger.debug('Listing collections')\n\n const collections = await client!.getCollections()\n const names = collections.collections.map((c: { name: string }) => c.name)\n return ok(names)\n },\n }\n\n // ─── 向量操作适配器 ───\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n logger.debug('Inserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n for (const document of documents) {\n const validation = validateVectorDimension<void>(dimensionResult.data, document.vector.length)\n if (validation) {\n return validation\n }\n }\n\n // 内部保留字段 _id / _content 放在展开之后,防止被 metadata 同名字段覆盖\n const points = documents.map(doc => ({\n id: hashToUuid(doc.id),\n vector: doc.vector,\n payload: {\n ...doc.metadata,\n _id: doc.id,\n _content: doc.content ?? '',\n },\n }))\n\n // 限制:Qdrant API 仅提供 upsert,无原生 strict insert;\n // ID 已存在时会静默覆盖而非报错,行为等同于 upsert。\n await client!.upsert(collection, { points })\n\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n logger.debug('Upserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n for (const document of documents) {\n const validation = validateVectorDimension<void>(dimensionResult.data, document.vector.length)\n if (validation) {\n return validation\n }\n }\n\n // 内部保留字段 _id / _content 放在展开之后,防止被 metadata 同名字段覆盖\n const points = documents.map(doc => ({\n id: hashToUuid(doc.id),\n vector: doc.vector,\n payload: {\n ...doc.metadata,\n _id: doc.id,\n _content: doc.content ?? '',\n },\n }))\n\n await client!.upsert(collection, { points })\n\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n logger.debug('Deleting vectors', { collection, count: ids.length })\n\n const uuids = ids.map(hashToUuid)\n await client!.delete(collection, { points: uuids })\n\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n\n logger.debug('Searching vectors', { collection, topK, hasFilter: !!options?.filter })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateVectorDimension<VectorSearchResult[]>(dimensionResult.data, vector.length)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n // 构建过滤条件\n let filter: Record<string, unknown> | undefined\n if (options?.filter && Object.keys(options.filter).length > 0) {\n const mustConditions = Object.entries(options.filter).map(([key, value]) => ({\n key,\n match: { value },\n }))\n filter = { must: mustConditions }\n }\n\n const searchResult = await client!.query(collection, {\n query: vector,\n limit: topK,\n score_threshold: minScore > 0 ? minScore : undefined,\n filter,\n with_payload: true,\n })\n\n const results: VectorSearchResult[] = searchResult.points.map((point: Record<string, unknown>) => {\n const payload = point.payload as Record<string, unknown> ?? {}\n const { _id, _content, ...metadata } = payload\n return {\n id: (_id as string) ?? '',\n score: point.score as number,\n content: (_content as string) || undefined,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n }\n })\n\n return ok(results)\n },\n\n async count(collection) {\n logger.debug('Counting vectors', { collection })\n\n const infoResult = await getCollectionInfo(collection)\n if (!infoResult.success) {\n return infoResult\n }\n\n return ok(infoResult.data.points_count ?? 0)\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'qdrant',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'qdrant') {\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n }\n\n const qdrantConfig = cfg as QdrantConfig\n\n try {\n const loadResult = await loadQdrantClient()\n if (!loadResult.success) {\n return loadResult\n }\n\n const { QdrantClient: QdrantClientClass } = loadResult.data\n\n // @qdrant/js-client-rest 为 optionalDependencies,动态 import 后类型与本地最小接口不兼容,需强转\n const qdrantClient = new QdrantClientClass({\n url: qdrantConfig.url,\n apiKey: qdrantConfig.apiKey,\n }) as unknown as QdrantClient\n\n // 验证连接\n await qdrantClient.getCollections()\n\n client = qdrantClient\n\n config = qdrantConfig\n logger.info('Qdrant connected', { url: sanitizeUrl(qdrantConfig.url) })\n return ok(undefined)\n }\n catch (error) {\n // 仅提取错误消息,避免 error 对象中的 URL 或连接信息泄漏\n logger.error('Failed to connect to Qdrant', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n client = null\n config = null\n logger.info('Qdrant connection closed')\n return ok(undefined)\n },\n\n isConnected(): boolean {\n return client !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — 向量数据库服务主入口\n *\n * 本文件提供统一的 `vecdb` 对象,聚合所有向量数据库操作功能。\n * @module vecdb-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { VecdbProvider } from './providers/vecdb-provider-base.js'\nimport type { VecdbConfig, VecdbConfigInput } from './vecdb-config.js'\nimport type {\n CollectionOperations,\n VecdbConnection,\n VecdbFunctions,\n VectorOperations,\n} from './vecdb-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { createChromaProvider } from './providers/vecdb-provider-chroma.js'\nimport { createLancedbProvider } from './providers/vecdb-provider-lancedb.js'\nimport { createPgvectorProvider } from './providers/vecdb-provider-pgvector.js'\nimport { createQdrantProvider } from './providers/vecdb-provider-qdrant.js'\nimport { VecdbConfigSchema } from './vecdb-config.js'\nimport { vecdbM } from './vecdb-i18n.js'\nimport { HaiVecdbError } from './vecdb-types.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'main' })\n\n// ─── 内部状态 ───\n\n/** 当前活跃的向量数据库 Provider(未初始化时为 null) */\nlet currentProvider: VecdbProvider | null = null\n\n/** 当前向量数据库配置(未初始化时为 null) */\nlet currentConfig: VecdbConfig | null = null\n\n/** init() 是否正在执行(并发防护) */\nlet initInProgress = false\n\n// ─── Provider 工厂 ───\n\n/**\n * 根据配置创建对应的向量数据库 Provider\n *\n * @param config - 向量数据库配置(已校验、默认值补齐)\n * @returns Provider 实例\n */\nfunction createProvider(config: VecdbConfig): VecdbProvider {\n switch (config.type) {\n case 'lancedb':\n return createLancedbProvider()\n case 'pgvector':\n return createPgvectorProvider()\n case 'qdrant':\n return createQdrantProvider()\n case 'chroma':\n return createChromaProvider()\n }\n}\n\n// ─── 未初始化时的占位操作 ───\n\n/** 未初始化工具集 */\nconst notInitialized = core.module.createNotInitializedKit(\n HaiVecdbError.NOT_INITIALIZED,\n () => vecdbM('vecdb_notInitialized'),\n)\n\n/** 未初始化时的集合操作占位对象 */\nconst notInitializedCollection = notInitialized.proxy<CollectionOperations>()\n\n/** 未初始化时的向量操作占位对象 */\nconst notInitializedVector = notInitialized.proxy<VectorOperations>()\n\n// ─── 统一向量数据库服务对象 ───\n\n/**\n * 向量数据库服务对象\n *\n * 统一的向量数据库访问入口,提供以下功能:\n * - `vecdb.init()` - 初始化连接\n * - `vecdb.close()` - 关闭连接\n * - `vecdb.collection` - 集合管理(创建/删除/查询)\n * - `vecdb.vector` - 向量操作(插入/搜索/删除)\n * - `vecdb.config` - 当前配置\n * - `vecdb.isInitialized` - 初始化状态\n *\n * @example\n * ```ts\n * import { vecdb } from '@h-ai/vecdb'\n *\n * // 初始化(LanceDB)\n * await vecdb.init({ type: 'lancedb', path: './data/vecdb' })\n *\n * // 集合操作\n * await vecdb.collection.create('docs', { dimension: 1536 })\n *\n * // 向量操作\n * await vecdb.vector.insert('docs', [\n * { id: '1', vector: [...], content: '文档内容' },\n * ])\n *\n * // 搜索\n * const result = await vecdb.vector.search('docs', queryVector, { topK: 5 })\n *\n * // 关闭\n * await vecdb.close()\n * ```\n */\nexport const vecdb: VecdbFunctions = {\n /**\n * 初始化向量数据库连接\n *\n * @param config - 向量数据库配置(允许部分字段,内部会补齐默认值)\n * @returns 初始化结果,失败时包含错误信息\n */\n async init(config: VecdbConfigInput): Promise<HaiResult<void>> {\n // 并发防护:防止多次同时调用导致 Provider/连接泄漏\n if (initInProgress) {\n logger.warn('Vecdb init already in progress, skipping concurrent call')\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_initInProgress'))\n }\n initInProgress = true\n\n try {\n if (currentProvider) {\n logger.warn('Vecdb module is already initialized, reinitializing')\n const closeResult = await vecdb.close()\n if (!closeResult.success) {\n return closeResult\n }\n }\n\n logger.info('Initializing vecdb module')\n\n const parseResult = VecdbConfigSchema.safeParse(config)\n if (!parseResult.success) {\n logger.error('Vecdb config validation failed', { error: parseResult.error.message })\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_configError', { params: { error: parseResult.error.message } }), parseResult.error)\n }\n const parsed = parseResult.data\n\n try {\n const provider = createProvider(parsed)\n const connectResult = await provider.connect(parsed)\n if (!connectResult.success) {\n logger.error('Vecdb module initialization failed', {\n code: connectResult.error.code,\n message: connectResult.error.message,\n })\n return connectResult\n }\n currentProvider = provider\n currentConfig = parsed\n logger.info('Vecdb module initialized', { type: parsed.type })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Vecdb module initialization failed', { error })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_initFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n }\n finally {\n initInProgress = false\n }\n },\n\n /**\n * 获取集合管理操作接口\n *\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get collection(): CollectionOperations {\n return currentProvider?.collection ?? notInitializedCollection\n },\n\n /**\n * 获取向量操作接口\n *\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get vector(): VectorOperations {\n return currentProvider?.vector ?? notInitializedVector\n },\n\n /** 获取当前脱敏配置快照(未初始化时为 null) */\n get config(): VecdbConfig | null {\n return currentConfig ? core.sanitize.sanitizeSensitiveFields(currentConfig) : null\n },\n\n /** 获取底层后端的原始连接信息(含凭证,未初始化时为 null;仅供同进程内集成使用) */\n get rawConnection(): VecdbConnection | null {\n if (!currentConfig)\n return null\n if (currentConfig.type === 'qdrant')\n return { type: 'qdrant', url: currentConfig.url, apiKey: currentConfig.apiKey }\n if (currentConfig.type === 'pgvector') {\n return {\n type: 'pgvector',\n connectionString: currentConfig.url,\n host: currentConfig.host,\n port: currentConfig.port,\n database: currentConfig.database,\n user: currentConfig.user,\n password: currentConfig.password,\n }\n }\n if (currentConfig.type === 'chroma') {\n return {\n type: 'chroma',\n url: currentConfig.url,\n host: currentConfig.host,\n port: currentConfig.port,\n apiKey: currentConfig.apiKey,\n path: currentConfig.path,\n }\n }\n return { type: currentConfig.type, path: currentConfig.path }\n },\n\n /** 检查是否已初始化 */\n get isInitialized(): boolean {\n return currentProvider !== null && currentProvider.isConnected()\n },\n\n /**\n * 关闭向量数据库连接\n *\n * 多次调用安全,未初始化时直接返回。\n */\n async close(): Promise<HaiResult<void>> {\n if (!currentProvider) {\n currentConfig = null\n logger.info('Vecdb module already closed, skipping')\n return ok(undefined)\n }\n\n logger.info('Closing vecdb module')\n\n try {\n const closeResult = await currentProvider.close()\n if (!closeResult.success) {\n logger.error('Vecdb module close failed', { code: closeResult.error.code, message: closeResult.error.message })\n return closeResult\n }\n logger.info('Vecdb module closed')\n return ok(undefined)\n }\n catch (error) {\n logger.error('Vecdb module close failed', { error })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_closeFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n finally {\n currentProvider = null\n currentConfig = null\n }\n },\n}\n"]}
1
+ {"version":3,"sources":["../messages/en-US.json","../messages/ja-JP.json","../messages/zh-CN.json","../src/vecdb-i18n.ts","../src/vecdb-config.ts","../src/vecdb-types.ts","../src/providers/vecdb-provider-base.ts","../src/providers/vecdb-provider-chroma.ts","../src/providers/vecdb-provider-lancedb.ts","../src/providers/vecdb-provider-pgvector.ts","../src/providers/vecdb-provider-qdrant.ts","../src/vecdb-main.ts"],"names":["core","err","ok","delay","require","logger","distanceToScore"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"vecdb_notInitialized\": \"Vector database not initialized, please call vecdb.init() first\",\n \"vecdb_initFailed\": \"Failed to initialize vector database: {error}\",\n \"vecdb_closeFailed\": \"Failed to close vector database: {error}\",\n \"vecdb_configError\": \"Vector database config validation failed: {error}\",\n \"vecdb_initInProgress\": \"Vector database initialization is already in progress\",\n \"vecdb_unsupportedType\": \"Unsupported vector database type: {type}\",\n \"vecdb_driverNotFound\": \"Vector database driver not installed: {driver}, please run pnpm add {driver}\",\n \"vecdb_connectionFailed\": \"Failed to connect to vector database: {error}\",\n \"vecdb_collectionNotFound\": \"Collection not found: {name}\",\n \"vecdb_collectionAlreadyExists\": \"Collection already exists: {name}\",\n \"vecdb_invalidCollectionSchema\": \"Collection has no valid persisted vector dimension or distance metric: {name}\",\n \"vecdb_atomicUpsertUnavailable\": \"LanceDB collection or driver lacks safe atomic merge primary-key support; no writes were performed. Rebuild the collection or use a supported driver\",\n \"vecdb_duplicateDocumentIds\": \"Vector document IDs must be unique within a batch; no writes were performed\",\n \"vecdb_jsonMetadataRequired\": \"LanceDB collection requires native JSON metadata; rebuild legacy string metadata collections before writing or filtering\",\n \"vecdb_invalidMetadataFilter\": \"LanceDB metadata filter must be a plain object of top-level string, finite number, boolean or null values; nested objects, arrays and undefined are unsupported\",\n \"vecdb_dimensionMismatch\": \"Vector dimension mismatch: expected {expected}, actual {actual}\",\n \"vecdb_insertFailed\": \"Failed to insert vectors: {error}\",\n \"vecdb_deleteFailed\": \"Failed to delete vectors: {error}\",\n \"vecdb_updateFailed\": \"Failed to update vectors: {error}\",\n \"vecdb_queryFailed\": \"Failed to query vectors: {error}\",\n \"vecdb_indexBuildFailed\": \"Failed to build index: {error}\",\n \"vecdb_serializationFailed\": \"Serialization/deserialization failed: {error}\",\n \"vecdb_invalidDimension\": \"Invalid vector dimension: {dimension}, must be a positive integer\",\n \"vecdb_configPathRequired\": \"Database storage path is required\",\n \"vecdb_configDatabaseRequired\": \"Database name is required\",\n \"vecdb_sharedBackendRequired\": \"Production mode requires a shared backend; local files and memory backends are for development or explicit end-to-end tests.\",\n \"vecdb_chromaEndpointInvalid\": \"Chroma requires an HTTP(S) root endpoint without credentials, path prefix, query or fragment\",\n \"vecdb_chromaTokenInvalid\": \"Chroma Bearer token must contain only printable ASCII characters without whitespace\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"vecdb_notInitialized\": \"ベクトルデータベースが初期化されていません。先にvecdb.init()を呼び出してください\",\n \"vecdb_initFailed\": \"ベクトルデータベースの初期化に失敗しました: {error}\",\n \"vecdb_closeFailed\": \"ベクトルデータベースの終了に失敗しました: {error}\",\n \"vecdb_configError\": \"ベクトルデータベース設定の検証に失敗しました: {error}\",\n \"vecdb_initInProgress\": \"ベクトルデータベースの初期化は既に実行中です\",\n \"vecdb_unsupportedType\": \"未対応のベクトルデータベースの種類です: {type}\",\n \"vecdb_driverNotFound\": \"ベクトルデータベースのドライバーがインストールされていません: {driver}。pnpm add {driver}を実行してください\",\n \"vecdb_connectionFailed\": \"ベクトルデータベースへの接続に失敗しました: {error}\",\n \"vecdb_collectionNotFound\": \"コレクションが見つかりません: {name}\",\n \"vecdb_collectionAlreadyExists\": \"コレクションは既に存在します: {name}\",\n \"vecdb_invalidCollectionSchema\": \"コレクションに有効な永続化済みのベクトル次元または距離メトリックがありません:{name}\",\n \"vecdb_atomicUpsertUnavailable\": \"LanceDB コレクションまたはドライバーに安全な主キーによるアトミックな merge 機能がありません。書き込みは行っていません。コレクションを再作成するか、対応ドライバーを使用してください\",\n \"vecdb_duplicateDocumentIds\": \"同一バッチのベクトル文書 ID は一意である必要があります。書き込みは行っていません\",\n \"vecdb_jsonMetadataRequired\": \"LanceDB コレクションにはネイティブ JSON メタデータが必要です。旧形式の文字列メタデータを使用するコレクションは、書き込みやフィルター処理の前に再作成してください\",\n \"vecdb_invalidMetadataFilter\": \"LanceDB メタデータフィルターは通常のオブジェクトとし、最上位の値には文字列、有限数、真偽値、null のみ指定できます。入れ子のオブジェクト、配列、undefined は使用できません\",\n \"vecdb_dimensionMismatch\": \"ベクトルの次元が一致しません: 期待値{expected}、実際の値{actual}\",\n \"vecdb_insertFailed\": \"ベクトルの挿入に失敗しました: {error}\",\n \"vecdb_deleteFailed\": \"ベクトルの削除に失敗しました: {error}\",\n \"vecdb_updateFailed\": \"ベクトルの更新に失敗しました: {error}\",\n \"vecdb_queryFailed\": \"ベクトルの検索に失敗しました: {error}\",\n \"vecdb_indexBuildFailed\": \"インデックスの構築に失敗しました: {error}\",\n \"vecdb_serializationFailed\": \"シリアライズまたはデシリアライズに失敗しました: {error}\",\n \"vecdb_invalidDimension\": \"ベクトルの次元が無効です: {dimension}。正の整数を指定してください\",\n \"vecdb_configPathRequired\": \"データベースの保存パスは必須です\",\n \"vecdb_configDatabaseRequired\": \"データベース名は必須です\",\n \"vecdb_sharedBackendRequired\": \"本番環境には共有バックエンドが必要です。ローカルファイルとメモリーバックエンドは開発環境または明示的な E2E テストでのみ使用できます。\",\n \"vecdb_chromaEndpointInvalid\": \"Chroma には HTTP(S) のルートエンドポイントを指定してください。認証情報、パスプレフィックス、クエリ、フラグメントは使用できません\",\n \"vecdb_chromaTokenInvalid\": \"Chroma Bearer トークンには空白を含まない表示可能な ASCII 文字のみ使用できます\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"vecdb_notInitialized\": \"向量数据库未初始化,请先调用 vecdb.init()\",\n \"vecdb_initFailed\": \"初始化向量数据库失败: {error}\",\n \"vecdb_closeFailed\": \"关闭向量数据库失败: {error}\",\n \"vecdb_configError\": \"向量数据库配置校验失败:{error}\",\n \"vecdb_initInProgress\": \"向量数据库初始化正在进行中\",\n \"vecdb_unsupportedType\": \"不支持的向量数据库类型: {type}\",\n \"vecdb_driverNotFound\": \"向量数据库驱动未安装: {driver},请执行 pnpm add {driver}\",\n \"vecdb_connectionFailed\": \"连接向量数据库失败: {error}\",\n \"vecdb_collectionNotFound\": \"集合不存在: {name}\",\n \"vecdb_collectionAlreadyExists\": \"集合已存在: {name}\",\n \"vecdb_invalidCollectionSchema\": \"集合缺少有效的持久化向量维度或距离度量定义: {name}\",\n \"vecdb_atomicUpsertUnavailable\": \"LanceDB 集合或驱动缺少安全的原子 merge 主键能力,未执行写入,请重建集合或使用受支持的驱动\",\n \"vecdb_duplicateDocumentIds\": \"同一批向量文档的 ID 不得重复,未执行写入\",\n \"vecdb_jsonMetadataRequired\": \"LanceDB 集合须使用原生 JSON 元数据,旧字符串元数据集合需重建后才能写入或过滤\",\n \"vecdb_invalidMetadataFilter\": \"LanceDB 元数据过滤须为普通对象,值仅支持顶层字符串、有限数值、布尔或 null;不支持嵌套对象、数组和 undefined\",\n \"vecdb_dimensionMismatch\": \"向量维度不匹配: 期望 {expected},实际 {actual}\",\n \"vecdb_insertFailed\": \"插入向量失败: {error}\",\n \"vecdb_deleteFailed\": \"删除向量失败: {error}\",\n \"vecdb_updateFailed\": \"更新向量失败: {error}\",\n \"vecdb_queryFailed\": \"查询向量失败: {error}\",\n \"vecdb_indexBuildFailed\": \"构建索引失败: {error}\",\n \"vecdb_serializationFailed\": \"序列化/反序列化失败: {error}\",\n \"vecdb_invalidDimension\": \"无效的向量维度: {dimension},必须为正整数\",\n \"vecdb_configPathRequired\": \"数据库存储路径不能为空\",\n \"vecdb_configDatabaseRequired\": \"数据库名称不能为空\",\n \"vecdb_sharedBackendRequired\": \"生产模式需要跨节点共享后端;本机文件或内存后端仅用于开发和显式端到端测试。\",\n \"vecdb_chromaEndpointInvalid\": \"Chroma 仅支持 HTTP(S) 根端点,不得包含凭据、路径前缀、query 或 fragment\",\n \"vecdb_chromaTokenInvalid\": \"Chroma Bearer token 仅支持无空白的可打印 ASCII 字符\"\n}\n","/**\n * @h-ai/vecdb — i18n\n *\n * 本文件提供向量数据库模块的 i18n 文案访问入口。\n * @module vecdb-i18n\n */\n\nimport { core } from '@h-ai/core'\nimport messagesEnUS from '../messages/en-US.json'\nimport messagesJaJP from '../messages/ja-JP.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\n// ─── i18n ───\n\n/**\n * 向量数据库模块文案 Key 类型\n * @example 模块内部上下文\n * ```ts\n * const key: VecdbMessageKey = 'vecdb_notInitialized'\n * const text = vecdbM(key)\n * void text\n * ```\n */\ntype VecdbMessageKey = keyof typeof messagesZhCN\n\n/**\n * 获取向量数据库模块文案。\n * @param key - 文案 Key\n * @param options - 插值参数与格式化选项\n * @returns 本地化后的文案字符串\n * @example 模块内部上下文\n * ```ts\n * const text = vecdbM('vecdb_notInitialized', { locale: 'en-US' })\n * void text\n * ```\n */\nexport const vecdbM = core.i18n.createMessageGetter<VecdbMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n 'ja-JP': messagesJaJP,\n})\n","/**\n * @h-ai/vecdb — 向量数据库配置 Schema\n *\n * 本文件定义向量数据库模块的 Zod Schema 和配置类型;错误码见 vecdb-types。\n * 支持 LanceDB(默认)、pgvector、Qdrant、Chroma 四种后端。\n * @module vecdb-config\n */\n\nimport { z } from 'zod'\nimport { vecdbM } from './vecdb-i18n.js'\n// ─── 向量数据库类型枚举 ───\n\n/**\n * 向量数据库类型\n * @example\n * ```ts\n * import type { VecdbType } from '@h-ai/vecdb'\n *\n * const value: VecdbType = 'qdrant'\n * void value\n * ```\n */\nexport type VecdbType = 'lancedb' | 'pgvector' | 'qdrant' | 'chroma'\n\n// ─── 距离度量 ───\n\n/**\n * 距离度量类型\n *\n * - `cosine` — 余弦相似度(默认,适用于文本嵌入)\n * - `euclidean` — 欧氏距离(L2)\n * - `dot` — 内积(点积)\n * @example\n * ```ts\n * import { DistanceMetricSchema } from '@h-ai/vecdb'\n *\n * const value = DistanceMetricSchema.parse('cosine')\n * void value\n * ```\n */\nexport const DistanceMetricSchema = z.enum(['cosine', 'euclidean', 'dot']).default('cosine')\n\n/**\n * 距离度量类型\n * @example\n * ```ts\n * import type { DistanceMetric } from '@h-ai/vecdb'\n *\n * const value: DistanceMetric = 'cosine'\n * void value\n * ```\n */\nexport type DistanceMetric = z.infer<typeof DistanceMetricSchema>\n\n/**\n * 操作日志配置;read/write 默认关闭,长度和级别由 Schema 校验。\n * @example\n * ```ts\n * import { VecdbOperationLogConfigSchema } from '@h-ai/vecdb'\n *\n * const value = VecdbOperationLogConfigSchema.parse({ read: false, write: true, maxLength: 500, level: 'debug' })\n * void value\n * ```\n */\nexport const VecdbOperationLogConfigSchema = z.object({\n read: z.boolean().default(false),\n write: z.boolean().default(false),\n maxLength: z.number().int().min(0).default(1000),\n level: z.enum(['info', 'debug', 'trace']).default('debug'),\n})\n\n/**\n * 已解析的操作日志配置,单位和默认值与 Schema 保持一致。\n * @example\n * ```ts\n * import { VecdbOperationLogConfigSchema, type VecdbOperationLogConfig } from '@h-ai/vecdb'\n *\n * const value: VecdbOperationLogConfig = VecdbOperationLogConfigSchema.parse({})\n * void value\n * ```\n */\nexport type VecdbOperationLogConfig = z.infer<typeof VecdbOperationLogConfigSchema>\n\nconst OperationLogConfigFieldSchema = {\n operationLog: VecdbOperationLogConfigSchema.optional(),\n}\n\n// ─── LanceDB 配置 ───\n\n/**\n * LanceDB 配置 Schema\n *\n */\nconst LancedbConfigSchema = z.object({\n type: z.literal('lancedb'),\n /** 持久化本地目录;独立节点的同名路径不会自动共享,分布式部署优先使用服务端后端。 */\n path: z.string().min(1, vecdbM('vecdb_configPathRequired')),\n /** 新建集合的默认距离度量;已有集合使用 Arrow schema 中的持久定义。 */\n metric: DistanceMetricSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/**\n * LanceDB 配置类型\n * @example\n * ```ts\n * import { VecdbConfigSchema, type LancedbConfig } from '@h-ai/vecdb'\n *\n * const parsed = VecdbConfigSchema.parse({ type: 'lancedb', path: './data/vecdb' })\n * if (parsed.type === 'lancedb') {\n * const config: LancedbConfig = parsed\n * void config\n * }\n * ```\n */\nexport type LancedbConfig = z.infer<typeof LancedbConfigSchema>\n\n// ─── pgvector 配置 ───\n\n/**\n * pgvector 索引类型\n *\n * - `ivfflat` — IVFFlat 索引(适合中等规模数据)\n * - `hnsw` — HNSW 索引(适合大规模数据,检索速度更快)\n */\nconst PgvectorIndexTypeSchema = z.enum(['ivfflat', 'hnsw']).default('hnsw')\n\n/**\n * pgvector 配置 Schema\n *\n */\nconst PgvectorConfigSchema = z.object({\n type: z.literal('pgvector'),\n /** 连接字符串(可选,优先使用) */\n url: z.string().optional(),\n /** 数据库主机地址(默认 localhost) */\n host: z.string().default('localhost'),\n /** 端口号(默认 5432) */\n port: z.number().int().min(1).max(65535).default(5432),\n /** 数据库名称 */\n database: z.string().min(1, vecdbM('vecdb_configDatabaseRequired')),\n /** 用户名 */\n user: z.string().optional(),\n /** 密码 */\n password: z.string().optional(),\n /** 索引类型(默认 hnsw) */\n indexType: PgvectorIndexTypeSchema.optional(),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n /** 表名前缀(默认 'vec_') */\n tablePrefix: z.string().default('vec_'),\n ...OperationLogConfigFieldSchema,\n})\n\n/**\n * pgvector 配置类型\n * @example\n * ```ts\n * import { VecdbConfigSchema, type PgvectorConfig } from '@h-ai/vecdb'\n *\n * const parsed = VecdbConfigSchema.parse({ type: 'pgvector', host: 'db', database: 'shop' })\n * if (parsed.type === 'pgvector') {\n * const config: PgvectorConfig = parsed\n * void config\n * }\n * ```\n */\nexport type PgvectorConfig = z.infer<typeof PgvectorConfigSchema>\n\n// ─── Qdrant 配置 ───\n\n/**\n * Qdrant 配置 Schema\n *\n */\nconst QdrantConfigSchema = z.object({\n type: z.literal('qdrant'),\n /** Qdrant 服务器 URL */\n url: z.string().url().default('http://localhost:6333'),\n /** API Key(可选) */\n apiKey: z.string().optional(),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/**\n * Qdrant 配置类型\n * @example\n * ```ts\n * import { VecdbConfigSchema, type QdrantConfig } from '@h-ai/vecdb'\n *\n * const parsed = VecdbConfigSchema.parse({ type: 'qdrant', url: 'http://localhost:6333' })\n * if (parsed.type === 'qdrant') {\n * const config: QdrantConfig = parsed\n * void config\n * }\n * ```\n */\nexport type QdrantConfig = z.infer<typeof QdrantConfigSchema>\n\n// ─── Chroma 配置 ───\n\n/**\n * Chroma 配置 Schema\n *\n * Chroma 在 Node 端只有 HTTP 客户端(无进程内嵌入式)。本 Provider 支持两种模式:\n * - **嵌入式**:提供 `path` 且不提供 `url` 时,init 自动拉起本地 `chroma run` 服务\n * (持久化到 `path`),close 时关闭;数据落地本地目录,无需手动启动服务。\n * - **直连**:提供 `url`(或已运行的 host:port)时,直接连接已有 Chroma 服务,不拉起进程。\n *\n */\nconst ChromaConfigSchema = z.object({\n type: z.literal('chroma'),\n /** 本地持久化路径(嵌入式模式:提供且无 url 时自动拉起本地服务) */\n path: z.string().optional(),\n /** Chroma HTTP(S) 根端点;不可包含凭据、路径前缀、query 或 fragment;提供时优先于 host/port。 */\n url: z.string().url().refine((value) => {\n try {\n const endpoint = new URL(value)\n return ['http:', 'https:'].includes(endpoint.protocol)\n && !endpoint.username && !endpoint.password && endpoint.pathname === '/'\n && !endpoint.search && !endpoint.hash\n }\n catch {\n return false\n }\n }, { error: () => vecdbM('vecdb_chromaEndpointInvalid') }).optional(),\n /** 主机(默认 localhost) */\n host: z.string().default('localhost'),\n /** 端口(默认 8000) */\n port: z.number().int().min(1).max(65535).default(8000),\n /** 可选 Bearer token,发送 Authorization 请求头;用于采用此协议的自托管服务/网关,不是 Chroma Cloud 配置。空串表示未配置。 */\n apiKey: z.string().regex(/^[\\x21-\\x7E]*$/, { error: () => vecdbM('vecdb_chromaTokenInvalid') }).optional(),\n /** 拉起本地服务的可执行命令(默认 'chroma',可指定绝对路径) */\n serverCommand: z.string().default('chroma'),\n /** 拉起本地服务的就绪等待超时(毫秒,默认 30000) */\n startupTimeout: z.number().int().positive().default(30_000),\n /** 距离度量(默认 cosine) */\n metric: DistanceMetricSchema.optional(),\n ...OperationLogConfigFieldSchema,\n})\n\n/**\n * Chroma 配置类型\n * @example\n * ```ts\n * import { VecdbConfigSchema, type ChromaConfig } from '@h-ai/vecdb'\n *\n * const parsed = VecdbConfigSchema.parse({ type: 'chroma', url: 'http://localhost:8000' })\n * if (parsed.type === 'chroma') {\n * const config: ChromaConfig = parsed\n * void config\n * }\n * ```\n */\nexport type ChromaConfig = z.infer<typeof ChromaConfigSchema>\n\n// ─── 统一配置 ───\n\n/**\n * 统一向量数据库配置 Schema(判别联合体)\n *\n * 根据 `type` 字段区分不同向量数据库类型的配置。\n * @example\n * ```ts\n * import { VecdbConfigSchema } from '@h-ai/vecdb'\n *\n * const value = VecdbConfigSchema.parse({ type: 'qdrant', url: 'http://localhost:6333' })\n * void value\n * ```\n */\nexport const VecdbConfigSchema = z.discriminatedUnion('type', [\n LancedbConfigSchema,\n PgvectorConfigSchema,\n QdrantConfigSchema,\n ChromaConfigSchema,\n])\n\n/**\n * 向量数据库配置类型(判别联合体)\n * @example\n * ```ts\n * import { VecdbConfigSchema, type VecdbConfig } from '@h-ai/vecdb'\n *\n * const parsed = VecdbConfigSchema.parse({ type: 'qdrant', url: 'http://localhost:6333' })\n * const config: VecdbConfig = parsed\n * void config\n * ```\n */\nexport type VecdbConfig = z.infer<typeof VecdbConfigSchema>\n\n/**\n * 向量数据库配置输入类型(用于 init 等入口)\n *\n * 说明:Zod 的 default 会让输入端字段可省略,但输出端字段为必填。\n * 因此对外 API(如 vecdb.init)更适合接收 VecdbConfigInput。\n * @example\n * ```ts\n * import type { VecdbConfigInput } from '@h-ai/vecdb'\n *\n * const value: VecdbConfigInput = { type: 'qdrant', url: 'http://localhost:6333' }\n * void value\n * ```\n */\nexport type VecdbConfigInput = z.input<typeof VecdbConfigSchema>\n","/**\n * @h-ai/vecdb — 类型定义\n *\n * 本文件定义向量数据库模块的核心接口和类型(非配置相关)。\n * 配置相关类型请从 vecdb-config.ts 导入。\n * @module vecdb-types\n */\n\nimport type { ErrorInfo, HaiResult } from '@h-ai/core'\nimport type { DistanceMetric, VecdbConfig, VecdbConfigInput } from './vecdb-config.js'\nimport { core } from '@h-ai/core'\n\n// ─── 错误定义(照 @h-ai/core 范式) ───\n\n/**\n * 向量数据库错误信息映射(错误码:HTTP状态码)。\n *\n * 完整错误码将自动生成为:`hai:vecdb:NNN`\n */\nconst VecdbErrorInfo = {\n CONNECTION_FAILED: '001:500',\n QUERY_FAILED: '002:500',\n COLLECTION_NOT_FOUND: '003:404',\n COLLECTION_ALREADY_EXISTS: '004:409',\n DIMENSION_MISMATCH: '005:400',\n INSERT_FAILED: '006:500',\n DELETE_FAILED: '007:500',\n UPDATE_FAILED: '008:500',\n INDEX_BUILD_FAILED: '009:500',\n NOT_INITIALIZED: '010:500',\n CONFIG_ERROR: '011:500',\n UNSUPPORTED_TYPE: '012:400',\n DRIVER_NOT_FOUND: '013:500',\n SERIALIZATION_FAILED: '014:500',\n} as const satisfies ErrorInfo\n\n/**\n * Vecdb 模块标准错误定义对象。\n * @example\n * ```ts\n * import { HaiVecdbError } from '@h-ai/vecdb'\n * import { err } from '@h-ai/core'\n *\n * const result = err(HaiVecdbError.COLLECTION_NOT_FOUND, 'Collection missing')\n * if (!result.success) void result.error.code\n * ```\n */\nexport const HaiVecdbError = core.error.buildHaiErrorsDef('vecdb', VecdbErrorInfo)\n\n// ─── 向量文档 ───\n\n/**\n * 向量文档接口\n *\n * 表示一条存入向量数据库的记录,包含向量、文本内容和元数据。\n * @example\n * ```ts\n * import type { VectorDocument } from '@h-ai/vecdb'\n *\n * const value: VectorDocument = { id: 'doc_1', vector: [0.1, 0.2, 0.3], content: 'Example text', metadata: { tenant: 'shop' } }\n * void value\n * ```\n */\nexport interface VectorDocument {\n /** 文档唯一标识 */\n id: string\n /** 向量数据(浮点数组) */\n vector: number[]\n /** 文本内容(可选,用于存储原始文本) */\n content?: string\n /** 元数据(可选,用于存储附加信息) */\n metadata?: Record<string, unknown>\n}\n\n/**\n * 向量搜索选项\n * @example\n * ```ts\n * import type { VectorSearchOptions } from '@h-ai/vecdb'\n *\n * const value: VectorSearchOptions = { topK: 5, filter: { tenant: 'shop' }, minScore: 0.7 }\n * void value\n * ```\n */\nexport interface VectorSearchOptions {\n /** 返回的最大结果数(默认 10) */\n topK?: number\n /**\n * 元数据过滤,具体能力以 Provider 为准。\n * LanceDB:顶层字面量键的 AND 精确匹配,仅支持 string、有限 number、boolean、null;\n * 类型严格区分,null 不匹配缺失字段;空对象不筛选,不支持对象/数组/undefined。\n * 条件在 topK 前执行,不支持的值返回 CONFIG_ERROR。其它后端不保证相同 null/复杂值语义。\n * @example { tenant: 'acme', active: true, page: 1, removedAt: null }\n */\n filter?: Record<string, unknown>\n /** 最低相似度阈值(0-1,低于此值的结果将被过滤) */\n minScore?: number\n}\n\n/**\n * 向量搜索结果\n *\n * 包含匹配的文档和相似度得分。\n * @example\n * ```ts\n * import type { VectorSearchResult } from '@h-ai/vecdb'\n *\n * const value: VectorSearchResult = { id: 'doc_1', score: 0.95, content: 'Example text', metadata: { tenant: 'shop' } }\n * void value\n * ```\n */\nexport interface VectorSearchResult {\n /** 文档唯一标识 */\n id: string\n /** 相似度得分(0-1,越高越相似) */\n score: number\n /** 文本内容(如果存储时包含) */\n content?: string\n /** 元数据(如果存储时包含) */\n metadata?: Record<string, unknown>\n /** 原始向量(可选,默认不返回以节省传输) */\n vector?: number[]\n}\n\n// ─── 集合信息 ───\n\n/**\n * 集合信息接口\n *\n * 描述一个向量集合的元信息。\n * @example\n * ```ts\n * import type { CollectionInfo } from '@h-ai/vecdb'\n *\n * const value: CollectionInfo = { name: 'docs', dimension: 3, metric: 'cosine', count: 1 }\n * void value\n * ```\n */\nexport interface CollectionInfo {\n /** 集合名称 */\n name: string\n /** 向量维度 */\n dimension: number\n /** 距离度量类型 */\n metric: DistanceMetric\n /** 集合中的文档数量 */\n count: number\n}\n\n// ─── 操作接口 ───\n\n/**\n * 集合管理操作接口\n *\n * 通过 `vecdb.collection` 访问,管理向量集合的创建、删除和查询。\n * @example\n * ```ts\n * import type { CollectionOperations } from '@h-ai/vecdb'\n *\n * async function read(operations: CollectionOperations) {\n * const result = await operations.list()\n * if (!result.success) return result.error.message\n * return result.data\n * }\n * ```\n */\nexport interface CollectionOperations {\n /**\n * 创建集合\n *\n * @param name - 集合名称\n * @param options - 创建选项\n * @returns 成功返回 ok(undefined);集合已存在返回 COLLECTION_ALREADY_EXISTS\n */\n create: (name: string, options: CollectionCreateOptions) => Promise<HaiResult<void>>\n\n /**\n * 删除集合\n *\n * @param name - 集合名称\n * @returns 成功返回 ok(undefined);集合不存在返回 COLLECTION_NOT_FOUND\n */\n drop: (name: string) => Promise<HaiResult<void>>\n\n /**\n * 判断集合是否存在\n *\n * @param name - 集合名称\n * @returns 存在返回 true,不存在返回 false\n */\n exists: (name: string) => Promise<HaiResult<boolean>>\n\n /**\n * 获取集合信息\n *\n * @param name - 集合名称\n * @returns 集合信息\n */\n info: (name: string) => Promise<HaiResult<CollectionInfo>>\n\n /**\n * 列出所有集合\n *\n * @returns 集合名称列表\n */\n list: () => Promise<HaiResult<string[]>>\n}\n\n/**\n * 集合创建选项\n * @example\n * ```ts\n * import type { CollectionCreateOptions } from '@h-ai/vecdb'\n *\n * const value: CollectionCreateOptions = { dimension: 3, metric: 'cosine' }\n * void value\n * ```\n */\nexport interface CollectionCreateOptions {\n /** 向量维度(必填) */\n dimension: number\n /** 距离度量(可选,默认使用全局配置中的 metric) */\n metric?: DistanceMetric\n}\n\n/**\n * 向量操作接口\n *\n * 通过 `vecdb.vector` 访问,管理向量文档的增删改查和搜索。\n * @example\n * ```ts\n * import type { VectorOperations } from '@h-ai/vecdb'\n *\n * async function read(operations: VectorOperations) {\n * const result = await operations.search('docs', [0.1, 0.2, 0.3], { topK: 5 })\n * if (!result.success) return result.error.message\n * return result.data\n * }\n * ```\n */\nexport interface VectorOperations {\n /**\n * 插入向量文档\n *\n * @param collection - 集合名称\n * @param documents - 文档列表\n * @returns 成功返回 ok(undefined);LanceDB 已有 ID 保留不覆盖,同批重复 ID 返回 CONFIG_ERROR。\n * Qdrant 成功前等待服务端应用写入。\n * @example await vecdb.vector.insert('docs', [{ id: 'doc-1', vector: [1, 0] }])\n */\n insert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n\n /**\n * 插入或更新向量文档(按 id 匹配,整体替换)\n *\n * @param collection - 集合名称\n * @param documents - 待写入文档;已有 ID 更新,不存在的 ID 插入\n * @returns 成功返回 ok(undefined);LanceDB 缺少原子主键能力或同批重复 ID 返回 CONFIG_ERROR。\n * Qdrant 成功前等待服务端应用写入。\n * @example await vecdb.vector.upsert('docs', [{ id: 'doc-1', vector: [1, 0], content: 'updated' }])\n */\n upsert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n\n /**\n * 删除向量文档\n *\n * @param collection - 集合名称\n * @param ids - 文档 ID 列表\n * @returns 成功返回 ok(undefined)\n * Qdrant 成功前等待服务端应用删除。\n */\n delete: (collection: string, ids: string[]) => Promise<HaiResult<void>>\n\n /**\n * 向量搜索\n *\n * @param collection - 集合名称\n * @param vector - 查询向量\n * @param options - 搜索选项\n * @returns 搜索结果列表(按相似度降序排列)\n * @example await vecdb.vector.search('docs', [1, 0], { topK: 5, filter: { tenant: 'acme', active: true } })\n */\n search: (\n collection: string,\n vector: number[],\n options?: VectorSearchOptions,\n ) => Promise<HaiResult<VectorSearchResult[]>>\n\n /**\n * 获取集合中的文档数量\n *\n * @param collection - 集合名称\n * @returns 文档数量\n * Qdrant 使用精确 count,不依赖集合信息的近似统计。\n */\n count: (collection: string) => Promise<HaiResult<number>>\n}\n\n// ─── VecdbFunctions 接口 ───\n\n/**\n * 向量数据库服务接口(通过 `vecdb` 对象访问)\n * @example\n * ```ts\n * import { vecdb } from '@h-ai/vecdb'\n *\n * const initialized = await vecdb.init({ type: 'qdrant', url: 'http://localhost:6333' })\n * if (!initialized.success) throw new Error(initialized.error.message)\n * try {\n * const result = await vecdb.collection.list()\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * } finally {\n * const closed = await vecdb.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * }\n * ```\n */\nexport interface VecdbFunctions {\n /** 初始化向量数据库连接 */\n init: (config: VecdbConfigInput) => Promise<HaiResult<void>>\n /** 关闭连接 */\n close: () => Promise<HaiResult<void>>\n /** 当前脱敏配置快照(未初始化时为 null) */\n readonly config: VecdbConfig | null\n /**\n * 获取底层后端的原始连接信息(含凭证,未初始化时为 null)\n *\n * 供需要直连同一向量库的外部引擎(如 mem0 OSS)复用后端。返回值包含未脱敏的凭证,\n * 仅供同进程内集成使用,禁止写入日志或返回给外部调用方。\n */\n readonly rawConnection: VecdbConnection | null\n /** 是否已初始化 */\n readonly isInitialized: boolean\n /** 集合管理操作 */\n readonly collection: CollectionOperations\n /** 向量操作 */\n readonly vector: VectorOperations\n}\n\n/**\n * 向量库原始连接信息\n *\n * 由 `vecdb.rawConnection` 暴露,字段按后端类型填充。包含凭证,仅供同进程内集成使用。\n * @example\n * ```ts\n * import type { VecdbConnection } from '@h-ai/vecdb'\n *\n * const value: VecdbConnection = { type: 'qdrant', url: 'http://localhost:6333' }\n * void value\n * ```\n */\nexport interface VecdbConnection {\n /** 后端类型 */\n type: VecdbConfig['type']\n /** 服务 URL(qdrant、chroma;Chroma 内嵌模式含实际本地端口) */\n url?: string\n /** API Key / Bearer token(qdrant、chroma) */\n apiKey?: string\n /** 主机(pgvector、chroma) */\n host?: string\n /** 端口(pgvector、chroma) */\n port?: number\n /** 数据库名(pgvector) */\n database?: string\n /** 用户名(pgvector) */\n user?: string\n /** 密码(pgvector) */\n password?: string\n /** 连接串(pgvector) */\n connectionString?: string\n /** 本地持久化路径(lancedb 或内嵌 chroma) */\n path?: string\n}\n","/**\n * @h-ai/vecdb — Provider 共享基础层\n *\n * 将各 Provider 的共性逻辑抽取为统一实现:连接守卫、运行时异常捕获、HaiResult 包装。\n *\n * 各 Provider 只需提供 CollectionDriver / VectorDriver(原始操作适配器),\n * base 层统一处理初始化检查与 catch-all 安全网。\n * @module vecdb-provider-base\n */\n\nimport type { HaiErrorDef, HaiResult } from '@h-ai/core'\nimport type { VecdbConfig, VecdbOperationLogConfig } from '../vecdb-config.js'\nimport type {\n CollectionCreateOptions,\n CollectionInfo,\n CollectionOperations,\n VectorDocument,\n VectorOperations,\n VectorSearchOptions,\n VectorSearchResult,\n} from '../vecdb-types.js'\n\nimport { err, ok } from '@h-ai/core'\n\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\n// ─── Provider 接口(内部,不暴露给模块消费者) ───\n\n/**\n * 向量数据库 Provider 接口\n *\n * 各后端实现需遵循此接口,提供统一的集合管理和向量操作能力。\n * @example 模块内部上下文\n * ```ts\n * async function list(provider: VecdbProvider, config: VecdbConfig) {\n * const connected = await provider.connect(config)\n * if (!connected.success) return connected\n * try { return await provider.collection.list() } finally {\n * const closed = await provider.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * }\n * }\n * ```\n */\nexport interface VecdbProvider {\n /** Provider 名称标识 */\n readonly name: string\n /** 连接到向量数据库 */\n connect: (config: VecdbConfig) => Promise<HaiResult<void>>\n /** 关闭连接 */\n close: () => Promise<HaiResult<void>>\n /** 是否已连接 */\n isConnected: () => boolean\n /** 集合管理操作 */\n collection: CollectionOperations\n /** 向量操作 */\n vector: VectorOperations\n}\n\n// ─── 上下文与适配器接口 ───\n\n/**\n * 操作上下文:由 Provider 在创建 ops 时传入\n * @example 模块内部上下文\n * ```ts\n * function collections(ctx: VecdbOpsContext, driver: CollectionDriver) {\n * return createBaseCollectionOps(ctx, driver)\n * }\n * ```\n */\nexport interface VecdbOpsContext {\n /** 连接状态检查 */\n isConnected: () => boolean\n /** Logger 实例(用于运行时异常的错误日志) */\n logger: {\n error: (msg: string, meta?: Record<string, unknown>) => void\n info: (msg: string, meta?: Record<string, unknown>) => void\n debug: (msg: string, meta?: Record<string, unknown>) => void\n trace: (msg: string, meta?: Record<string, unknown>) => void\n }\n /** 当前操作日志配置 */\n operationLog?: () => VecdbOperationLogConfig | undefined\n}\n\n/**\n * 集合操作原始适配器\n *\n * Provider 将引擎特定的集合管理逻辑适配为此接口。\n * 实现方返回 HaiResult 以表达业务错误(如集合已存在);\n * 未预期的运行时异常直接 throw,由 wrapOp 统一捕获。\n * @example 模块内部上下文\n * ```ts\n * function collections(ctx: VecdbOpsContext, driver: CollectionDriver) {\n * const operations = createBaseCollectionOps(ctx, driver)\n * return operations.list() // 公共包装负责连接守卫与异常转换。\n * }\n * ```\n */\nexport interface CollectionDriver {\n create: (name: string, options: CollectionCreateOptions) => Promise<HaiResult<void>>\n drop: (name: string) => Promise<HaiResult<void>>\n exists: (name: string) => Promise<HaiResult<boolean>>\n info: (name: string) => Promise<HaiResult<CollectionInfo>>\n list: () => Promise<HaiResult<string[]>>\n}\n\n/**\n * 向量操作原始适配器\n *\n * Provider 将引擎特定的向量管理逻辑适配为此接口。\n * 实现方返回 HaiResult 以表达业务错误(如集合不存在);\n * 未预期的运行时异常直接 throw,由 wrapOp 统一捕获。\n * @example 模块内部上下文\n * ```ts\n * function search(ctx: VecdbOpsContext, driver: VectorDriver) {\n * return createBaseVectorOps(ctx, driver).search('docs', [0.1, 0.2, 0.3], { topK: 5 })\n * }\n * ```\n */\nexport interface VectorDriver {\n insert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n upsert: (collection: string, documents: VectorDocument[]) => Promise<HaiResult<void>>\n delete: (collection: string, ids: string[]) => Promise<HaiResult<void>>\n search: (\n collection: string,\n vector: number[],\n options?: VectorSearchOptions,\n ) => Promise<HaiResult<VectorSearchResult[]>>\n count: (collection: string) => Promise<HaiResult<number>>\n}\n\n// ─── 内部帮助 ───\n\n/**\n * 决定操作日志是否按 read/write 开关输出的内部分类。\n * @example 模块内部上下文\n * ```ts\n * function logRead(ctx: VecdbOpsContext) {\n * const category: VecdbOperationCategory = 'read'\n * logVecdbOperation(ctx, category, 'collection.list', {})\n * }\n * ```\n */\ntype VecdbOperationCategory = 'read' | 'write'\n\nfunction stringifyOperationPayload(payload: unknown, maxLength: number): string {\n if (maxLength <= 0) {\n return ''\n }\n\n try {\n const text = JSON.stringify(payload, (_key, value: unknown) => {\n if (typeof value === 'bigint') {\n return value.toString()\n }\n if (typeof value === 'function') {\n return '[Function]'\n }\n return value\n })\n return text.length > maxLength ? `${text.slice(0, maxLength)}...` : text\n }\n catch {\n const text = String(payload)\n return text.length > maxLength ? `${text.slice(0, maxLength)}...` : text\n }\n}\n\n/**\n * 按当前 Provider 配置输出可选操作日志;长度上限控制载荷,不接管连接生命周期。\n * @param ctx - 当前 Provider 的连接状态、日志与操作日志配置。\n * @param category - read 或 write,用于选择配置开关。\n * @param operation - 稳定的操作名称,用于诊断。\n * @param payload - 待截断序列化的诊断数据;不传入原始连接凭据。\n * @example 模块内部上下文\n * ```ts\n * function logRead(ctx: VecdbOpsContext) {\n * logVecdbOperation(ctx, 'read', 'vector.count', { collection: 'docs' })\n * }\n * ```\n */\nexport function logVecdbOperation(\n ctx: VecdbOpsContext,\n category: VecdbOperationCategory,\n operation: string,\n payload: unknown,\n): void {\n const config = ctx.operationLog?.()\n if (!config?.[category]) {\n return\n }\n\n ctx.logger[config.level]('VecDB operation executed', {\n category,\n operation,\n payload: stringifyOperationPayload(payload, config.maxLength),\n })\n}\n\n/** 根据错误定义获取对应的 i18n 错误消息 */\nfunction errorMsgFromCode(def: HaiErrorDef, errorStr: string): string {\n switch (def) {\n case HaiVecdbError.DELETE_FAILED:\n return vecdbM('vecdb_deleteFailed', { params: { error: errorStr } })\n case HaiVecdbError.INSERT_FAILED:\n return vecdbM('vecdb_insertFailed', { params: { error: errorStr } })\n case HaiVecdbError.UPDATE_FAILED:\n return vecdbM('vecdb_updateFailed', { params: { error: errorStr } })\n default:\n return vecdbM('vecdb_queryFailed', { params: { error: errorStr } })\n }\n}\n\n/**\n * 统一操作包装器:guard → delegate → catch-all\n *\n * 1. 连接守卫:未初始化时直接返回 NOT_INITIALIZED\n * 2. 委托给 driver 执行(driver 内部用 HaiResult 表达业务错误)\n * 3. catch-all 安全网:捕获 driver 未预期的运行时异常\n */\nasync function wrapOp<T>(\n ctx: VecdbOpsContext,\n fn: () => Promise<HaiResult<T>>,\n errorDef: HaiErrorDef,\n errorLabel: string,\n errorMeta?: Record<string, unknown>,\n): Promise<HaiResult<T>> {\n if (!ctx.isConnected()) {\n return err(HaiVecdbError.NOT_INITIALIZED, vecdbM('vecdb_notInitialized'))\n }\n try {\n return await fn()\n }\n catch (error) {\n ctx.logger.error(errorLabel, { ...errorMeta, error })\n return err(errorDef, errorMsgFromCode(errorDef, String(error)), error)\n }\n}\n\n// ─── 集合操作工厂 ───\n\n/**\n * 创建标准集合操作\n *\n * 各 Provider 只需提供 CollectionDriver,base 层统一处理连接守卫与运行时异常。\n * @param ctx - 当前 Provider 的连接状态、日志与操作日志配置。\n * @param driver - 由引擎适配的原始集合或向量操作。\n * @returns 带连接守卫和 HaiResult 错误边界的公共操作。\n * @example 模块内部上下文\n * ```ts\n * function list(ctx: VecdbOpsContext, driver: CollectionDriver) {\n * return createBaseCollectionOps(ctx, driver).list()\n * }\n * ```\n */\nexport function createBaseCollectionOps(ctx: VecdbOpsContext, driver: CollectionDriver): CollectionOperations {\n return {\n create: async (name, options) => {\n // 参数校验:dimension 必须为正整数(防止 pgvector SQL 插值注入)\n if (!Number.isInteger(options.dimension) || options.dimension <= 0) {\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_invalidDimension', { params: { dimension: String(options.dimension) } }),\n )\n }\n logVecdbOperation(ctx, 'write', 'collection.create', { name, options })\n return wrapOp(\n ctx,\n () => driver.create(name, options),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to create collection',\n { name },\n )\n },\n drop: (name) => {\n logVecdbOperation(ctx, 'write', 'collection.drop', { name })\n return wrapOp(\n ctx,\n () => driver.drop(name),\n HaiVecdbError.DELETE_FAILED,\n 'Failed to drop collection',\n { name },\n )\n },\n exists: (name) => {\n logVecdbOperation(ctx, 'read', 'collection.exists', { name })\n return wrapOp(\n ctx,\n () => driver.exists(name),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to check collection',\n { name },\n )\n },\n info: (name) => {\n logVecdbOperation(ctx, 'read', 'collection.info', { name })\n return wrapOp(\n ctx,\n () => driver.info(name),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to get collection info',\n { name },\n )\n },\n list: () => {\n logVecdbOperation(ctx, 'read', 'collection.list', {})\n return wrapOp(\n ctx,\n () => driver.list(),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to list collections',\n )\n },\n }\n}\n// ─── 向量操作工厂 ───\n\n/**\n * 创建标准向量操作\n *\n * 各 Provider 只需提供 VectorDriver,base 层统一处理连接守卫与运行时异常。\n * @param ctx - 当前 Provider 的连接状态、日志与操作日志配置。\n * @param driver - 由引擎适配的原始集合或向量操作。\n * @returns 带连接守卫和 HaiResult 错误边界的公共操作。\n * @example 模块内部上下文\n * ```ts\n * function search(ctx: VecdbOpsContext, driver: VectorDriver) {\n * return createBaseVectorOps(ctx, driver).search('docs', [0.1, 0.2, 0.3], { topK: 5 })\n * }\n * ```\n */\nexport function createBaseVectorOps(ctx: VecdbOpsContext, driver: VectorDriver): VectorOperations {\n return {\n insert: (collection, documents) => {\n logVecdbOperation(ctx, 'write', 'vector.insert', { collection, count: documents.length, documents })\n return wrapOp(\n ctx,\n () => documents.length === 0 ? Promise.resolve(ok(undefined)) : driver.insert(collection, documents),\n HaiVecdbError.INSERT_FAILED,\n 'Failed to insert vectors',\n { collection },\n )\n },\n upsert: (collection, documents) => {\n logVecdbOperation(ctx, 'write', 'vector.upsert', { collection, count: documents.length, documents })\n return wrapOp(\n ctx,\n () => documents.length === 0 ? Promise.resolve(ok(undefined)) : driver.upsert(collection, documents),\n HaiVecdbError.UPDATE_FAILED,\n 'Failed to upsert vectors',\n { collection },\n )\n },\n delete: (collection, ids) => {\n logVecdbOperation(ctx, 'write', 'vector.delete', { collection, count: ids.length, ids })\n return wrapOp(\n ctx,\n () => ids.length === 0 ? Promise.resolve(ok(undefined)) : driver.delete(collection, ids),\n HaiVecdbError.DELETE_FAILED,\n 'Failed to delete vectors',\n { collection },\n )\n },\n search: (collection, vector, options) => {\n logVecdbOperation(ctx, 'read', 'vector.search', { collection, vector, options })\n return wrapOp(\n ctx,\n () => driver.search(collection, vector, options),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to search vectors',\n { collection },\n )\n },\n count: (collection) => {\n logVecdbOperation(ctx, 'read', 'vector.count', { collection })\n return wrapOp(\n ctx,\n () => driver.count(collection),\n HaiVecdbError.QUERY_FAILED,\n 'Failed to count vectors',\n { collection },\n )\n },\n }\n}\n","/**\n * @h-ai/vecdb — Chroma Provider\n *\n * 基于 Chroma 向量数据库的 Provider 实现。Chroma 在 Node 端只有 HTTP 客户端,\n * 本 Provider 支持两种模式:\n * - **嵌入式**:提供 `path` 且无 `url` 时,connect 自动拉起本地 `chroma run` 服务\n * (持久化到 `path`),close 时关闭进程。\n * - **直连**:提供 `url` 时直接连接已有服务,不拉起进程。\n *\n * 向量由调用方显式提供,集合不使用 Chroma 内置 embedding function。\n * @module vecdb-provider-chroma\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ChromaClient, ChromaClientArgs, Collection, EmbeddingFunction, Metadata, Where } from 'chromadb'\nimport type { ChildProcess } from 'node:child_process'\nimport type { ChromaConfig, DistanceMetric } from '../vecdb-config.js'\nimport type {\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { spawn } from 'node:child_process'\nimport { setTimeout as delay } from 'node:timers/promises'\nimport { core, err, ok } from '@h-ai/core'\n\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'chroma' })\nconst DIMENSION_METADATA_KEY = 'hai_dimension'\nconst SPACE_METADATA_KEY = 'hnsw:space'\nconst HEARTBEAT_POLL_INTERVAL = 300\n\n/**\n * 可选 SDK 的真实模块类型;type import 不会提前加载运行时驱动。\n * @example 模块内部上下文\n * ```ts\n * function client(module: ChromaModule) {\n * return new module.ChromaClient({ host: 'localhost', port: 8000, ssl: false })\n * }\n * ```\n */\ntype ChromaModule = typeof import('chromadb')\n\nfunction isChromaModule(value: unknown): value is ChromaModule {\n return typeof value === 'object' && value !== null && typeof (value as { ChromaClient?: unknown }).ChromaClient === 'function'\n}\n\n/**\n * 占位 embedding function:本 Provider 始终显式传入向量,此函数不会被调用。\n * 提供它是为了避免 Chroma 在无 embedding function 时加载默认实现(需额外依赖)。\n */\nconst NOOP_EMBEDDING_FUNCTION = {\n name: 'hai-noop',\n async generate(): Promise<number[][]> {\n throw new Error('Chroma embedding function should not be called: vectors are provided explicitly')\n },\n} satisfies EmbeddingFunction\n\n/** DistanceMetric → Chroma hnsw:space */\nfunction toChromaSpace(metric: DistanceMetric): string {\n if (metric === 'euclidean')\n return 'l2'\n if (metric === 'dot')\n return 'ip'\n return 'cosine'\n}\n\n/** Chroma hnsw:space → DistanceMetric */\nfunction fromChromaSpace(space: unknown): DistanceMetric {\n if (space === 'l2')\n return 'euclidean'\n if (space === 'ip')\n return 'dot'\n return 'cosine'\n}\n\n/** 将 Chroma 距离转换为相似度分数 [0, 1] */\nfunction distanceToScore(distance: number, metric: DistanceMetric): number {\n if (metric === 'cosine')\n return Math.max(0, Math.min(1, 1 - distance))\n return 1 / (1 + Math.max(0, distance))\n}\n\n/** 构建 Chroma where 过滤条件(单键直接匹配,多键用 $and) */\nfunction buildWhere(filter?: Record<string, unknown>): Where | undefined {\n if (!filter)\n return undefined\n const entries = Object.entries(filter)\n if (entries.length === 0)\n return undefined\n const where = entries.length === 1\n ? { [entries[0][0]]: entries[0][1] }\n : { $and: entries.map(([key, value]) => ({ [key]: value })) }\n // 公共 filter 保留各后端的原生能力;query 会先调用 SDK validateWhere 校验,不复制上游规则。\n return where as Where\n}\n\n/**\n * 创建 Chroma Provider\n * @returns 尚未连接的 Provider;connect 成功后可用,close 失败时保留资源供重试。\n * @example 模块内部上下文\n * ```ts\n * const provider = createChromaProvider()\n * // 连接由模块 init 发布;独立内部调用者必须检查 connect 并回收 close。\n * const closed = await provider.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * ```\n */\nexport function createChromaProvider(): VecdbProvider {\n let client: ChromaClient | null = null\n let config: ChromaConfig | null = null\n let serverProcess: ChildProcess | null = null\n let spawnFailed = false\n let closing: Promise<HaiResult<void>> | null = null\n\n function isMissingModuleError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes('chromadb')\n }\n\n /** 动态加载 Chroma JS 客户端 */\n async function loadChromaModule(): Promise<HaiResult<ChromaModule>> {\n try {\n const mod = await import('chromadb')\n if (!isChromaModule(mod)) {\n const error = new Error('chromadb driver module does not export ChromaClient')\n logger.error('Failed to load Chroma driver', { error: error.message })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'chromadb' } }), error)\n }\n return ok(mod)\n }\n catch (error) {\n if (isMissingModuleError(error)) {\n logger.error('Failed to load Chroma driver', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'chromadb' } }), error)\n }\n throw error\n }\n }\n\n /** 拉起本地 Chroma 服务(嵌入式模式) */\n async function startEmbeddedServer(chromaConfig: ChromaConfig): Promise<void> {\n const args = ['run', '--path', chromaConfig.path ?? './data/chroma', '--host', chromaConfig.host, '--port', String(chromaConfig.port)]\n logger.info('Starting embedded Chroma server', { command: chromaConfig.serverCommand, host: chromaConfig.host, port: chromaConfig.port })\n spawnFailed = false\n const proc = spawn(chromaConfig.serverCommand, args, { stdio: 'ignore' })\n proc.on('error', (error: Error) => {\n spawnFailed = proc.pid === undefined\n logger.error('Chroma server process error', { error: error.message })\n })\n serverProcess = proc\n await new Promise<void>((resolve, reject) => {\n proc.once('spawn', resolve)\n proc.once('error', reject)\n })\n }\n\n /** 终止本模块直接启动的服务器并等待 exit;失败保留句柄,不能用 killed 充当退出证明。 */\n async function stopEmbeddedServer(): Promise<void> {\n const owned = serverProcess\n if (!owned)\n return\n const hasExited = () => owned.exitCode !== null || owned.signalCode !== null || (spawnFailed && owned.pid === undefined)\n if (!hasExited()) {\n const child: ChildProcess = owned\n await new Promise<void>((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout> | undefined\n let settled = false\n function cleanup(): void {\n clearTimeout(timer)\n child.removeListener('exit', exited)\n child.removeListener('error', failed)\n }\n function exited(): void {\n if (settled)\n return\n settled = true\n cleanup()\n resolve()\n }\n function failed(cause: Error): void {\n if (settled)\n return\n if (hasExited()) {\n exited()\n return\n }\n settled = true\n cleanup()\n reject(cause)\n }\n function signal(name: 'SIGTERM' | 'SIGKILL'): void {\n try {\n if (!child.kill(name))\n failed(new Error('Chroma child termination signal was rejected'))\n }\n catch (cause) {\n failed(cause instanceof Error ? cause : new Error(String(cause)))\n }\n }\n child.once('exit', exited)\n child.once('error', failed)\n timer = setTimeout(() => {\n timer = setTimeout(() => failed(new Error('Chroma child exit was not confirmed')), 1500)\n signal('SIGKILL')\n }, 1500)\n if (hasExited())\n exited()\n else signal('SIGTERM')\n })\n }\n if (serverProcess === owned)\n serverProcess = null\n }\n\n /** 关闭立即停止业务发布;退出确认失败时仅保留清理所有权,允许同一实例重试。 */\n async function closeResources(): Promise<HaiResult<void>> {\n if (!closing) {\n client = null\n config = null\n closing = (async () => {\n try {\n await stopEmbeddedServer()\n logger.info('Chroma connection closed')\n return ok(undefined)\n }\n catch (cause) {\n return err({ ...HaiVecdbError.CONNECTION_FAILED, message: vecdbM('vecdb_closeFailed', { params: { error: cause instanceof Error ? cause.message : String(cause) } }), cause, ext: { cleanupPending: true } })\n }\n })().finally(() => { closing = null })\n }\n return await closing\n }\n\n /** 轮询心跳直至就绪或超时 */\n async function waitForHeartbeat(chromaClient: ChromaClient, timeout: number): Promise<void> {\n const deadline = Date.now() + timeout\n let lastError: unknown\n while (Date.now() < deadline) {\n try {\n await chromaClient.heartbeat()\n return\n }\n catch (error) {\n lastError = error\n await delay(HEARTBEAT_POLL_INTERVAL)\n }\n }\n throw new Error(`Chroma heartbeat timed out after ${timeout}ms: ${lastError instanceof Error ? lastError.message : String(lastError)}`)\n }\n\n /** 获取集合(含维度校验所需的 metadata) */\n async function getCollection(name: string): Promise<Collection> {\n return client!.getCollection({ name, embeddingFunction: NOOP_EMBEDDING_FUNCTION })\n }\n\n /** 读取集合存储的维度 */\n function readDimension(collection: Collection): number {\n const value = collection.metadata?.[DIMENSION_METADATA_KEY]\n return typeof value === 'number' ? value : 0\n }\n\n function validateDimension<T>(expected: number, actual: number): HaiResult<T> | null {\n if (expected === 0 || expected === actual)\n return null\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', { params: { expected: String(expected), actual: String(actual) } }),\n )\n }\n\n const ctx = { isConnected: () => client !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n logger.debug('Creating collection', { name, dimension: options.dimension, metric: options.metric })\n\n const existing = await client!.listCollections()\n const exists = existing.some(item => item.name === name)\n if (exists)\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n\n const metric = options.metric ?? config?.metric ?? 'cosine'\n await client!.getOrCreateCollection({\n name,\n metadata: { [SPACE_METADATA_KEY]: toChromaSpace(metric), [DIMENSION_METADATA_KEY]: options.dimension },\n embeddingFunction: NOOP_EMBEDDING_FUNCTION,\n })\n\n logger.info('Collection created', { name, dimension: options.dimension, metric })\n return ok(undefined)\n },\n\n async drop(name) {\n logger.debug('Dropping collection', { name })\n const existing = await client!.listCollections()\n const exists = existing.some(item => item.name === name)\n if (!exists)\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n\n await client!.deleteCollection({ name })\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n const existing = await client!.listCollections()\n return ok(existing.some(item => item.name === name))\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n const existing = await client!.listCollections()\n if (!existing.some(item => item.name === name))\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n\n const collection = await getCollection(name)\n const count = await collection.count()\n return ok({\n name,\n dimension: readDimension(collection),\n metric: fromChromaSpace(collection.metadata?.[SPACE_METADATA_KEY]),\n count,\n })\n },\n\n async list() {\n logger.debug('Listing collections')\n const existing = await client!.listCollections()\n return ok(existing.map(item => item.name))\n },\n }\n\n // ─── 向量操作适配器 ───\n\n function toWriteParams(documents: { id: string, vector: number[], content?: string, metadata?: Record<string, unknown> }[]): Parameters<Collection['add']>[0] {\n return {\n ids: documents.map(doc => doc.id),\n embeddings: documents.map(doc => doc.vector),\n documents: documents.map(doc => doc.content ?? ''),\n // 统一 API 的 metadata 更宽;SDK 在 add/upsert 中先执行 validateMetadata,再发送请求。\n // 使用上游 Metadata 类型跨越此边界,避免复制其标量、数组及稀疏向量规则;原生拒绝会由 base 转为 HaiResult。\n metadatas: documents.map(doc => ({ ...doc.metadata, _content: doc.content ?? '' })) as Metadata[],\n }\n }\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n logger.debug('Inserting vectors', { collection, count: documents.length })\n const target = await getCollection(collection)\n const expected = readDimension(target)\n for (const doc of documents) {\n const validation = validateDimension<void>(expected, doc.vector.length)\n if (validation)\n return validation\n }\n await target.add(toWriteParams(documents))\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n logger.debug('Upserting vectors', { collection, count: documents.length })\n const target = await getCollection(collection)\n const expected = readDimension(target)\n for (const doc of documents) {\n const validation = validateDimension<void>(expected, doc.vector.length)\n if (validation)\n return validation\n }\n await target.upsert(toWriteParams(documents))\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n logger.debug('Deleting vectors', { collection, count: ids.length })\n const target = await getCollection(collection)\n await target.delete({ ids })\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n logger.debug('Searching vectors', { collection, topK, hasFilter: !!options?.filter })\n\n const target = await getCollection(collection)\n const expected = readDimension(target)\n const validation = validateDimension<VectorSearchResult[]>(expected, vector.length)\n if (validation)\n return validation\n\n const metric = fromChromaSpace(target.metadata?.[SPACE_METADATA_KEY])\n const response = await target.query({ queryEmbeddings: [vector], nResults: topK, where: buildWhere(options?.filter) })\n\n const ids = response.ids[0] ?? []\n const distances = response.distances?.[0] ?? []\n const metadatas = response.metadatas?.[0] ?? []\n\n const results: VectorSearchResult[] = []\n for (let i = 0; i < ids.length; i++) {\n const score = distanceToScore(distances[i] ?? 0, metric)\n if (score < minScore)\n continue\n const metadata = metadatas[i] ?? {}\n const { _content, ...rest } = metadata\n results.push({\n id: ids[i],\n score,\n content: typeof _content === 'string' && _content.length > 0 ? _content : undefined,\n metadata: Object.keys(rest).length > 0 ? rest : undefined,\n })\n }\n return ok(results)\n },\n\n async count(collection) {\n logger.debug('Counting vectors', { collection })\n const target = await getCollection(collection)\n return ok(await target.count())\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'chroma',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'chroma')\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n\n if (serverProcess || client || closing) {\n const cleaned = await closeResources()\n if (!cleaned.success)\n return cleaned\n }\n const chromaConfig = cfg\n const embedded = !!chromaConfig.path && !chromaConfig.url\n\n const loadResult = await loadChromaModule()\n if (!loadResult.success)\n return loadResult\n\n const startupAbort = new AbortController()\n const startupTimeout = embedded ? chromaConfig.startupTimeout : 5000\n const startupTimer = setTimeout(() => startupAbort.abort(), startupTimeout)\n try {\n if (embedded)\n await startEmbeddedServer(chromaConfig)\n\n const endpoint = chromaConfig.url ? new URL(chromaConfig.url) : undefined\n const clientParams: ChromaClientArgs = endpoint\n ? { host: endpoint.hostname, port: Number(endpoint.port || (endpoint.protocol === 'https:' ? 443 : 80)), ssl: endpoint.protocol === 'https:' }\n : { host: chromaConfig.host, port: chromaConfig.port, ssl: false }\n if (chromaConfig.apiKey)\n clientParams.headers = { Authorization: `Bearer ${chromaConfig.apiKey}` }\n // SDK 的所有候选连接请求共享初始化截止;成功后清除 timer,不使后续业务请求自动失效。\n clientParams.fetchOptions = { signal: startupAbort.signal }\n\n const chromaClient = new loadResult.data.ChromaClient(clientParams)\n await waitForHeartbeat(chromaClient, startupTimeout)\n // 心跳可能公开;发布连接前必须确认默认 tenant/database 的数据端点也允许当前凭据访问。\n await chromaClient.countCollections()\n\n startupAbort.signal.throwIfAborted()\n if (embedded && (spawnFailed || !serverProcess || serverProcess.exitCode !== null || serverProcess.signalCode !== null))\n throw new Error('Chroma child exited before readiness was confirmed')\n client = chromaClient\n config = chromaConfig\n logger.info('Chroma connected', { embedded, host: clientParams.host, port: clientParams.port, ssl: clientParams.ssl })\n return ok(undefined)\n }\n catch (error) {\n startupAbort.abort()\n const cleanup = await closeResources()\n logger.error('Failed to connect to Chroma', { error: error instanceof Error ? error.message : String(error) })\n const failure = err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: String(error) } }), error)\n return !failure.success && !cleanup.success\n ? err({ ...failure.error, ext: { cleanupPending: true, cleanupError: cleanup.error } })\n : failure\n }\n finally {\n clearTimeout(startupTimer)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n return await closeResources()\n },\n\n isConnected(): boolean {\n return client !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — LanceDB Provider\n *\n * 基于 LanceDB 的向量数据库 Provider 实现。\n * LanceDB 为嵌入式向量数据库,数据存储在本地文件系统中。\n * @module vecdb-provider-lancedb\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { Connection, Table } from '@lancedb/lancedb'\nimport type { DistanceMetric, LancedbConfig } from '../vecdb-config.js'\nimport type {\n VectorDocument,\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { createRequire } from 'node:module'\nimport { core, err, ok } from '@h-ai/core'\nimport { DistanceMetricSchema } from '../vecdb-config.js'\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\n// @lancedb/lancedb 为可选原生依赖,用 require 运行时加载(见 loadLancedb)\nconst require = createRequire(import.meta.url)\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'lancedb' })\n\n/** 集合 metric 与 Arrow schema 原子持久化;禁止按连接默认值猜测已有集合。 */\nconst COLLECTION_METRIC_KEY = 'hai.vecdb.metric'\n/** Lance 13 公布的主键字段 metadata;merge 的 ON 字段匹配主键时启用严格键冲突检测。 */\nconst PRIMARY_KEY_FLAG = 'lance-schema:unenforced-primary-key'\nconst PRIMARY_KEY_POSITION = 'lance-schema:unenforced-primary-key:position'\n\n/** SQL 字符串字面量使用单引号,ID 中的引号按标准 SQL 转义,保留其他字符。 */\nfunction escapeLanceSqlValue(value: string): string {\n return value.replace(/'/g, '\\'\\'')\n}\n\n/** 仅支持顶层 JSON 标量的 AND 精确匹配;未知类型不能静默丢弃过滤条件。 */\nfunction buildMetadataPredicate(filter: Record<string, unknown>): HaiResult<string> {\n if (typeof filter !== 'object' || filter === null || Array.isArray(filter)\n || ![Object.prototype, null].includes(Object.getPrototypeOf(filter))\n || Reflect.ownKeys(filter).some(key => typeof key !== 'string')) {\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_invalidMetadataFilter'))\n }\n const predicates: string[] = []\n for (const [key, value] of Object.entries(filter)) {\n if (value !== null && typeof value !== 'string' && typeof value !== 'boolean'\n && !(typeof value === 'number' && Number.isFinite(value))) {\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_invalidMetadataFilter'))\n }\n // json_get 只接受字面量顶层键(包括空键);不把用户键解释为 JSONPath。\n const extracted = `json_extract(json_get(metadata, '${escapeLanceSqlValue(key)}'), '$')`\n // JSON 字符串仍含引号,TRY_CAST 不会把字符串/布尔/null 强转成数字。\n // 两侧均按 JS number 的 IEEE-754 比较,避免 JSON 指数/小数文本规范化造成误拒。\n predicates.push(typeof value === 'number'\n ? `TRY_CAST(${extracted} AS DOUBLE) = CAST(${value} AS DOUBLE)`\n : `${extracted} = '${escapeLanceSqlValue(JSON.stringify(value))}'`)\n }\n return ok(predicates.join(' AND '))\n}\n\n/**\n * 从持久化 Arrow schema 读取的集合定义,不在进程内缓存。\n * @example 模块内部上下文\n * ```ts\n * function metric(meta: CollectionMeta) {\n * if (!meta.atomicWrites) throw new Error('Atomic merge required')\n * return { dimension: meta.dimension, metric: meta.metric }\n * }\n * ```\n */\ninterface CollectionMeta {\n /** 向量维度 */\n dimension: number\n /** 距离度量 */\n metric: DistanceMetric\n /** id 必须是不可空的唯一主键字段,且引擎支持原子 merge。 */\n atomicWrites: boolean\n /** 原生 JSONB 需以 Arrow JSON 文本 schema 输入,不能把字符串按二进制原样写入。 */\n inputSchema?: Awaited<ReturnType<Table['schema']>>\n}\n\n/**\n * 创建 LanceDB Provider\n *\n * @returns VecdbProvider 实例\n * @example 模块内部上下文\n * ```ts\n * const provider = createLancedbProvider()\n * // 连接由模块 init 发布;独立内部调用者必须检查 connect 并回收 close。\n * const closed = await provider.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * ```\n */\nexport function createLancedbProvider(): VecdbProvider {\n let connection: Connection | null = null\n let config: LancedbConfig | null = null\n\n // ─── 辅助函数 ───\n\n /**\n * 加载 @lancedb/lancedb。\n *\n * 用 require 而非 import():import() 会被打包器(如 SvelteKit adapter-node)静态跟随并尝试\n * 内联原生 .node 二进制导致构建失败;require 为运行时调用,打包器不跟随,消费方无需将\n * @lancedb/lancedb 声明为直接依赖(与 @h-ai/reldb 加载 better-sqlite3 的方式一致)。\n */\n function loadLancedb(): HaiResult<typeof import('@lancedb/lancedb')> {\n try {\n const mod = require('@lancedb/lancedb') as typeof import('@lancedb/lancedb')\n return ok(mod)\n }\n catch (error) {\n logger.error('Failed to load @lancedb/lancedb', { error })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: '@lancedb/lancedb' } }), error)\n }\n }\n\n /** 每次读取最新表定义;空表、外部重建与其它连接写入都不依赖进程缓存。 */\n async function withCollection<T>(name: string, action: (table: Table, meta: CollectionMeta) => Promise<HaiResult<T>>): Promise<HaiResult<T>> {\n if (!(await connection!.tableNames()).includes(name))\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n const table = await connection!.openTable(name)\n try {\n const schema = await table.schema()\n const vectorType = schema.fields.find(field => field.name === 'vector')?.type\n const metric = DistanceMetricSchema.safeParse(schema.metadata.get(COLLECTION_METRIC_KEY) ?? null)\n if (!vectorType || !('listSize' in vectorType) || typeof vectorType.listSize !== 'number'\n || !Number.isInteger(vectorType.listSize) || vectorType.listSize <= 0 || !metric.success) {\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_invalidCollectionSchema', { params: { name } }))\n }\n const primaryKeys = schema.fields.filter(field => field.metadata.has(PRIMARY_KEY_POSITION)\n || ['true', '1', 'yes'].includes(field.metadata.get(PRIMARY_KEY_FLAG)?.toLowerCase() ?? ''))\n const idField = primaryKeys[0]\n // position 只表示排序,不能替代官方的主键参与标志;缺失/false 必须失败关闭。\n const atomicWrites = primaryKeys.length === 1 && idField.name === 'id' && !idField.nullable\n && ['true', '1', 'yes'].includes(idField.metadata.get(PRIMARY_KEY_FLAG)?.toLowerCase() ?? '')\n && idField.metadata.get(PRIMARY_KEY_POSITION) === '1' && typeof table.mergeInsert === 'function'\n const driver = loadLancedb()\n if (!driver.success)\n return driver\n const jsonMetadata = schema.fields.find(field => field.name === 'metadata')?.metadata.get('ARROW:extension:name') === 'lance.json'\n const inputSchema = jsonMetadata ? schema.assign([driver.data.makeJsonField('metadata', false)]) : undefined\n return await action(table, { dimension: vectorType.listSize, metric: metric.data, atomicWrites, inputSchema })\n }\n finally {\n table.close()\n }\n }\n\n /** 创建统一的维度不匹配错误结果 */\n function createDimensionMismatchResult<T>(expected: number, actual: number): HaiResult<T> {\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', {\n params: { expected: String(expected), actual: String(actual) },\n }),\n )\n }\n\n /** 校验查询向量维度 */\n function validateVectorDimension<T>(expected: number, vector: number[]): HaiResult<T> | null {\n if (vector.length === expected) {\n return null\n }\n\n return createDimensionMismatchResult<T>(expected, vector.length)\n }\n\n /** 校验批量文档维度 */\n function validateDocumentsDimension(expected: number, documents: VectorDocument[]): HaiResult<void> | null {\n for (const document of documents) {\n if (document.vector.length !== expected) {\n return createDimensionMismatchResult<void>(expected, document.vector.length)\n }\n }\n\n return null\n }\n\n /** 所有新增写入都参与原生主键冲突检测;源批内重复 ID 的 merge 语义未定义,必须先拒绝。 */\n function validateAtomicWrite(meta: CollectionMeta, documents: VectorDocument[]): HaiResult<void> | null {\n if (!meta.inputSchema)\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_jsonMetadataRequired'))\n if (!meta.atomicWrites)\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_atomicUpsertUnavailable'))\n if (new Set(documents.map(document => document.id)).size !== documents.length)\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_duplicateDocumentIds'))\n return null\n }\n\n // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => connection !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n logger.debug('Creating collection', { name, dimension: options.dimension, metric: options.metric })\n\n const tableNames = await connection!.tableNames()\n if (tableNames.includes(name)) {\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n }\n\n const dimension = options.dimension\n const parsedMetric = DistanceMetricSchema.safeParse(options.metric ?? config?.metric)\n if (!parsedMetric.success)\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_invalidCollectionSchema', { params: { name } }))\n const metric = parsedMetric.data\n const driver = loadLancedb()\n if (!driver.success)\n return driver\n // 仅在内存推导 Arrow 字段;空表与 metric 一次创建,没有占位记录可见窗口。\n const inferred = driver.data.makeArrowTable([{\n id: '',\n vector: Array.from({ length: dimension }).fill(0),\n content: '',\n metadata: '{}',\n }], {}, new Map([[COLLECTION_METRIC_KEY, metric]])).schema\n // 官方 Arrow 字段 metadata 可在初始 manifest 声明主键,避免 create/setPK 的可见窗口。\n const schema = inferred.assign(inferred.fields.map(field => field.name === 'id'\n ? field.clone({ nullable: false, metadata: new Map([...field.metadata, [PRIMARY_KEY_FLAG, 'true'], [PRIMARY_KEY_POSITION, '1']]) })\n : field.name === 'metadata' ? driver.data.makeJsonField('metadata', false) : field))\n const table = await connection!.createEmptyTable(name, schema)\n table.close()\n\n logger.info('Collection created', { name, dimension, metric })\n return ok(undefined)\n },\n\n async drop(name) {\n logger.debug('Dropping collection', { name })\n\n const tableNames = await connection!.tableNames()\n if (!tableNames.includes(name)) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n await connection!.dropTable(name)\n\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n\n const tableNames = await connection!.tableNames()\n return ok(tableNames.includes(name))\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n return withCollection(name, async (table, meta) => ok({ name, dimension: meta.dimension, metric: meta.metric, count: await table.countRows() }))\n },\n\n async list() {\n logger.debug('Listing collections')\n\n const tableNames = await connection!.tableNames()\n return ok(tableNames)\n },\n }\n\n // ─── 向量操作适配器 ───\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n logger.debug('Inserting vectors', { collection, count: documents.length })\n\n return withCollection(collection, async (table, meta) => {\n const atomicValidation = validateAtomicWrite(meta, documents)\n if (atomicValidation)\n return atomicValidation\n const dimensionValidation = validateDocumentsDimension(meta.dimension, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const records = documents.map(doc => ({\n id: doc.id,\n vector: doc.vector,\n content: doc.content ?? '',\n metadata: JSON.stringify(doc.metadata ?? {}),\n }))\n\n // insert 保留已有 ID,不覆盖;不得用 add 绕过并发键冲突检测。\n const driver = loadLancedb()\n if (!driver.success)\n return driver\n await table.mergeInsert('id').whenNotMatchedInsertAll().execute(driver.data.makeArrowTable(records, { schema: meta.inputSchema }))\n\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n })\n },\n\n async upsert(collection, documents) {\n logger.debug('Upserting vectors', { collection, count: documents.length })\n\n return withCollection(collection, async (table, meta) => {\n const atomicValidation = validateAtomicWrite(meta, documents)\n if (atomicValidation)\n return atomicValidation\n const dimensionValidation = validateDocumentsDimension(meta.dimension, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const records = documents.map(doc => ({\n id: doc.id,\n vector: doc.vector,\n content: doc.content ?? '',\n metadata: JSON.stringify(doc.metadata ?? {}),\n }))\n\n const driver = loadLancedb()\n if (!driver.success)\n return driver\n await table\n .mergeInsert('id')\n .whenMatchedUpdateAll()\n .whenNotMatchedInsertAll()\n .execute(driver.data.makeArrowTable(records, { schema: meta.inputSchema }))\n\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n })\n },\n\n async delete(collection, ids) {\n logger.debug('Deleting vectors', { collection, count: ids.length })\n\n return withCollection(collection, async (table) => {\n const idList = ids.map(id => `'${escapeLanceSqlValue(id)}'`).join(', ')\n await table.delete(`id IN (${idList})`)\n\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n })\n },\n\n async search(collection, vector, options) {\n logger.debug('Searching vectors', { collection, topK: options?.topK, hasFilter: !!options?.filter })\n\n return withCollection(collection, async (table, meta) => {\n const dimensionValidation = validateVectorDimension<VectorSearchResult[]>(meta.dimension, vector)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n\n let query = table.vectorSearch(vector).distanceType(meta.metric === 'euclidean' ? 'l2' : meta.metric).limit(topK)\n\n if (options?.filter !== undefined) {\n if (!meta.inputSchema)\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_jsonMetadataRequired'))\n const predicate = buildMetadataPredicate(options.filter)\n if (!predicate.success)\n return predicate\n // LanceDB 默认 prefilter:先限定候选集合,再求 topK,禁止改成后过滤。\n if (predicate.data)\n query = query.where(predicate.data)\n }\n\n const results = await query.toArray()\n\n const searchResults: VectorSearchResult[] = results\n .map((row: Record<string, unknown>) => {\n // 距离按集合 metric 解释;dot 距离为 1 - 内积,不能套用 L2 公式。\n const distance = (row._distance as number) ?? 0\n const score = meta.metric === 'cosine'\n ? Math.max(0, Math.min(1, 1 - distance / 2))\n : meta.metric === 'dot' ? 1 / (1 + Math.exp(distance - 1)) : 1 / (1 + Math.max(0, distance))\n\n return {\n id: row.id as string,\n score,\n content: (row.content as string) || undefined,\n metadata: row.metadata ? JSON.parse(row.metadata as string) as Record<string, unknown> : undefined,\n }\n })\n .filter((r: VectorSearchResult) => r.score >= minScore)\n\n return ok(searchResults)\n })\n },\n\n async count(collection) {\n logger.debug('Counting vectors', { collection })\n\n return withCollection(collection, async (table) => {\n const count = await table.countRows()\n return ok(count)\n })\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'lancedb',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'lancedb') {\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n }\n\n const lanceConfig = cfg\n const loadResult = loadLancedb()\n if (!loadResult.success)\n return loadResult\n\n const lancedb = loadResult.data\n\n try {\n // 每次读检查最新 manifest;仅共享相同持久路径的连接能看到彼此的提交。\n connection = await lancedb.connect(lanceConfig.path, { readConsistencyInterval: 0 })\n config = lanceConfig\n\n logger.info('LanceDB connected', { path: lanceConfig.path })\n return ok(undefined)\n }\n catch (error) {\n connection?.close()\n connection = null\n config = null\n logger.error('Failed to connect to LanceDB', { error })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n connection?.close()\n connection = null\n config = null\n logger.info('LanceDB connection closed')\n return ok(undefined)\n },\n\n isConnected(): boolean {\n return connection !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — pgvector Provider\n *\n * 基于 PostgreSQL + pgvector 扩展的向量数据库 Provider 实现。\n * 使用 pg 驱动连接,支持 IVFFlat 和 HNSW 索引。\n * @module vecdb-provider-pgvector\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { PgvectorConfig } from '../vecdb-config.js'\nimport type {\n VectorDocument,\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'pgvector' })\n\n/**\n * pg Pool 的最小接口定义(避免强依赖可选包)\n * @example 模块内部上下文\n * ```ts\n * async function ready(pool: PgPool) {\n * const result = await pool.query('SELECT $1 AS value', [1])\n * return result.rows.length > 0\n * }\n * ```\n */\ninterface PgPool {\n query: (text: string, params?: unknown[]) => Promise<{ rows: Record<string, unknown>[] }>\n end: () => Promise<void>\n}\n\n/**\n * pg 模块的最小接口定义(避免强依赖可选包)\n * @example 模块内部上下文\n * ```ts\n * async function ready(module: PgModule) {\n * const pool = new module.Pool({ host: 'db', database: 'shop' })\n * try { return await pool.query('SELECT 1') } finally { await pool.end() }\n * }\n * ```\n */\ninterface PgModule {\n Pool: new (config: unknown) => PgPool\n}\n\nfunction isPgModule(value: unknown): value is PgModule {\n if (typeof value !== 'object' || value === null) {\n return false\n }\n\n const maybeModule = value as { Pool?: unknown }\n return typeof maybeModule.Pool === 'function'\n}\n\n/**\n * 创建 pgvector Provider\n *\n * @returns VecdbProvider 实例\n * @example 模块内部上下文\n * ```ts\n * const provider = createPgvectorProvider()\n * // 连接由模块 init 发布;独立内部调用者必须检查 connect 并回收 close。\n * const closed = await provider.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * ```\n */\nexport function createPgvectorProvider(): VecdbProvider {\n let pool: PgPool | null = null\n let config: PgvectorConfig | null = null\n\n // ─── 辅助函数 ───\n\n /** 获取完整表名(带前缀) */\n function tableName(collection: string): string {\n return `${config?.tablePrefix ?? 'vec_'}${collection}`\n }\n\n /** 双引号转义 SQL 标识符,支持含特殊字符的表名 */\n function quoteIdent(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`\n }\n\n /** 获取距离算符(pgvector 语法) */\n function distanceOp(): string {\n const metric = config?.metric ?? 'cosine'\n switch (metric) {\n case 'cosine': return '<=>'\n case 'euclidean': return '<->'\n case 'dot': return '<#>'\n default: return '<=>'\n }\n }\n\n /** 将距离转换为相似度得分 [0, 1] */\n function distanceToScore(distance: number): number {\n const metric = config?.metric ?? 'cosine'\n switch (metric) {\n case 'cosine':\n // cosine distance ∈ [0, 2],相似度 = 1 - distance/2 → [0, 1]\n return 1 - distance / 2\n case 'euclidean':\n return 1 / (1 + distance)\n case 'dot':\n // 内积距离为负内积,得分 = -distance\n return -distance\n default:\n return 1 / (1 + distance)\n }\n }\n\n /** 判断动态 import 是否因缺少驱动失败 */\n function isMissingModuleError(error: unknown, packageName: string): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes(`'${packageName}'`) || message.includes(`\\\"${packageName}\\\"`) || message.includes(packageName)\n }\n\n /** 动态加载 pg 驱动 */\n async function loadPg(): Promise<HaiResult<PgModule>> {\n try {\n const mod = await import('pg')\n if (!isPgModule(mod)) {\n const error = new Error('pg driver module does not export Pool')\n logger.error('Failed to load pg driver', { error: error.message })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'pg' } }), error)\n }\n\n return ok(mod)\n }\n catch (error) {\n if (isMissingModuleError(error, 'pg')) {\n logger.error('Failed to load pg driver', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: 'pg' } }), error)\n }\n throw error\n }\n }\n\n /** 获取集合维度;集合不存在时返回 COLLECTION_NOT_FOUND */\n async function getCollectionDimension(name: string): Promise<HaiResult<number>> {\n const table = tableName(name)\n\n const existsResult = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [table],\n )\n if (!existsResult.rows[0].exists) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n const dimResult = await pool!.query(`\n SELECT atttypmod FROM pg_attribute\n WHERE attrelid = $1::regclass AND attname = 'vector'\n `, [quoteIdent(table)])\n\n return ok(dimResult.rows.length > 0 ? Number(dimResult.rows[0].atttypmod) : 0)\n }\n\n /** 校验查询向量维度 */\n function validateVectorDimension<T>(expected: number, actual: number): HaiResult<T> | null {\n if (expected === actual) {\n return null\n }\n\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', {\n params: { expected: String(expected), actual: String(actual) },\n }),\n )\n }\n\n /** 校验批量文档维度 */\n function validateDocumentsDimension(expected: number, documents: VectorDocument[]): HaiResult<void> | null {\n for (const document of documents) {\n const validation = validateVectorDimension<void>(expected, document.vector.length)\n if (validation) {\n return validation\n }\n }\n\n return null\n }\n\n // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => pool !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n const table = tableName(name)\n const dimension = options.dimension\n const metric = options.metric ?? config?.metric ?? 'cosine'\n const indexType = config?.indexType ?? 'hnsw'\n\n logger.debug('Creating collection', { name, dimension, metric, indexType })\n\n // 检查表是否已存在\n const checkResult = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [table],\n )\n if (checkResult.rows[0].exists) {\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n }\n\n // 创建表\n const qi = quoteIdent(table)\n await pool!.query(`\n CREATE TABLE ${qi} (\n id TEXT PRIMARY KEY,\n vector vector(${dimension}),\n content TEXT,\n metadata JSONB DEFAULT '{}'::jsonb\n )\n `)\n\n // 创建向量索引\n const distOp = distanceOp()\n const opsClass = distOp === '<=>'\n ? 'vector_cosine_ops'\n : distOp === '<->'\n ? 'vector_l2_ops'\n : 'vector_ip_ops'\n\n if (indexType === 'hnsw') {\n await pool!.query(`\n CREATE INDEX ON ${qi}\n USING hnsw (vector ${opsClass})\n `)\n }\n else {\n // IVFFlat lists 参数:建表时数据为空,使用 100 作为通用默认值\n // 适用于 100 万行以内的数据集;超大数据集应在数据增长后重建索引\n await pool!.query(`\n CREATE INDEX ON ${qi}\n USING ivfflat (vector ${opsClass})\n WITH (lists = 100)\n `)\n }\n\n logger.info('Collection created', { name, dimension, metric, indexType })\n return ok(undefined)\n },\n\n async drop(name) {\n const table = tableName(name)\n\n logger.debug('Dropping collection', { name })\n\n const checkResult = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [table],\n )\n if (!checkResult.rows[0].exists) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n\n await pool!.query(`DROP TABLE ${quoteIdent(table)}`)\n\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n\n const result = await pool!.query(\n `SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = $1)`,\n [tableName(name)],\n )\n return ok(result.rows[0].exists as boolean)\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n const table = tableName(name)\n const dimensionResult = await getCollectionDimension(name)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n // 获取文档数量\n const countResult = await pool!.query(`SELECT COUNT(*) as count FROM ${quoteIdent(table)}`)\n const count = Number.parseInt(String(countResult.rows[0].count), 10)\n\n return ok({\n name,\n dimension: dimensionResult.data,\n metric: config?.metric ?? 'cosine',\n count,\n })\n },\n\n async list() {\n const prefix = config?.tablePrefix ?? 'vec_'\n\n logger.debug('Listing collections')\n\n const result = await pool!.query(\n `SELECT table_name FROM information_schema.tables WHERE table_name LIKE $1 AND table_schema = 'public'`,\n [`${prefix}%`],\n )\n const names = result.rows.map((row: Record<string, unknown>) =>\n String(row.table_name).slice(prefix.length),\n )\n return ok(names)\n },\n }\n\n // ─── 向量操作适配器 ───\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n const table = tableName(collection)\n\n logger.debug('Inserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateDocumentsDimension(dimensionResult.data, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n // 构建多值 INSERT(单条 SQL,避免 await-in-loop N+1 问题)\n // 注意:PostgreSQL 参数上限为 65535,每条文档占 4 个参数,单批最多 ~16383 条\n const qi = quoteIdent(table)\n const values: string[] = []\n const params: unknown[] = []\n for (let i = 0; i < documents.length; i++) {\n const base = i * 4\n values.push(`($${base + 1}, $${base + 2}::vector, $${base + 3}, $${base + 4}::jsonb)`)\n const doc = documents[i]\n params.push(doc.id, `[${doc.vector.join(',')}]`, doc.content ?? '', JSON.stringify(doc.metadata ?? {}))\n }\n\n await pool!.query(\n `INSERT INTO ${qi} (id, vector, content, metadata) VALUES ${values.join(', ')}`,\n params,\n )\n\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n const table = tableName(collection)\n\n logger.debug('Upserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateDocumentsDimension(dimensionResult.data, documents)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const qi = quoteIdent(table)\n // 构建多值 INSERT ON CONFLICT(单条 SQL,避免 await-in-loop N+1 问题)\n const values: string[] = []\n const params: unknown[] = []\n for (let i = 0; i < documents.length; i++) {\n const base = i * 4\n values.push(`($${base + 1}, $${base + 2}::vector, $${base + 3}, $${base + 4}::jsonb)`)\n const doc = documents[i]\n params.push(doc.id, `[${doc.vector.join(',')}]`, doc.content ?? '', JSON.stringify(doc.metadata ?? {}))\n }\n\n await pool!.query(\n `INSERT INTO ${qi} (id, vector, content, metadata) VALUES ${values.join(', ')}\n ON CONFLICT (id) DO UPDATE SET\n vector = EXCLUDED.vector,\n content = EXCLUDED.content,\n metadata = EXCLUDED.metadata`,\n params,\n )\n\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n const table = tableName(collection)\n\n logger.debug('Deleting vectors', { collection, count: ids.length })\n\n const placeholders = ids.map((_, i) => `$${i + 1}`).join(', ')\n await pool!.query(`DELETE FROM ${quoteIdent(table)} WHERE id IN (${placeholders})`, ids)\n\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n const table = tableName(collection)\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n const op = distanceOp()\n\n logger.debug('Searching vectors', { collection, topK, hasFilter: !!options?.filter })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateVectorDimension<VectorSearchResult[]>(dimensionResult.data, vector.length)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n const vectorStr = `[${vector.join(',')}]`\n\n // 构建过滤条件\n let filterSQL = ''\n const filterParams: unknown[] = [vectorStr, topK]\n let paramIndex = 3\n\n if (options?.filter) {\n const filterParts: string[] = []\n for (const [key, value] of Object.entries(options.filter)) {\n filterParts.push(`metadata->>$${paramIndex} = $${paramIndex + 1}`)\n filterParams.push(key, String(value))\n paramIndex += 2\n }\n if (filterParts.length > 0) {\n filterSQL = `WHERE ${filterParts.join(' AND ')}`\n }\n }\n\n const result = await pool!.query(\n `SELECT id, content, metadata, vector ${op} $1::vector AS distance\n FROM ${quoteIdent(table)}\n ${filterSQL}\n ORDER BY vector ${op} $1::vector\n LIMIT $2`,\n filterParams,\n )\n\n const searchResults: VectorSearchResult[] = result.rows\n .map((row: Record<string, unknown>) => {\n const score = distanceToScore(row.distance as number)\n return {\n id: row.id as string,\n score,\n content: (row.content as string) || undefined,\n metadata: row.metadata as Record<string, unknown> | undefined,\n }\n })\n .filter((r: VectorSearchResult) => r.score >= minScore)\n\n return ok(searchResults)\n },\n\n async count(collection) {\n const table = tableName(collection)\n\n logger.debug('Counting vectors', { collection })\n\n const result = await pool!.query(`SELECT COUNT(*) as count FROM ${quoteIdent(table)}`)\n return ok(Number.parseInt(String(result.rows[0].count), 10))\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'pgvector',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'pgvector') {\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n }\n\n const pgConfig = cfg as PgvectorConfig\n\n try {\n const loadResult = await loadPg()\n if (!loadResult.success) {\n return loadResult\n }\n\n const { Pool } = loadResult.data\n\n const poolConfig = pgConfig.url\n ? { connectionString: pgConfig.url }\n : {\n host: pgConfig.host,\n port: pgConfig.port,\n database: pgConfig.database,\n user: pgConfig.user,\n password: pgConfig.password,\n }\n\n pool = new Pool(poolConfig)\n\n // 确保 pgvector 扩展已启用\n await pool.query('CREATE EXTENSION IF NOT EXISTS vector')\n\n config = pgConfig\n\n logger.info('pgvector connected', { host: pgConfig.host, database: pgConfig.database })\n return ok(undefined)\n }\n catch (error) {\n // 仅提取错误消息,避免 error 对象中的连接字符串泄漏密码\n logger.error('Failed to connect to pgvector', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n try {\n if (pool) {\n await pool.end()\n }\n pool = null\n config = null\n logger.info('pgvector connection closed')\n return ok(undefined)\n }\n catch (error) {\n logger.error('Failed to close pgvector connection', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_closeFailed', { params: { error: String(error) } }), error)\n }\n },\n\n isConnected(): boolean {\n return pool !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — Qdrant Provider\n *\n * 基于 Qdrant 向量搜索引擎的 Provider 实现。\n * 使用 @qdrant/js-client-rest 客户端连接。\n * @module vecdb-provider-qdrant\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { QdrantClient, Schemas } from '@qdrant/js-client-rest'\nimport type { DistanceMetric, QdrantConfig } from '../vecdb-config.js'\nimport type {\n CollectionInfo,\n VectorSearchResult,\n} from '../vecdb-types.js'\nimport type { CollectionDriver, VecdbProvider, VectorDriver } from './vecdb-provider-base.js'\n\nimport { createHash } from 'node:crypto'\nimport { core, err, ok } from '@h-ai/core'\nimport { vecdbM } from '../vecdb-i18n.js'\nimport { HaiVecdbError } from '../vecdb-types.js'\n\nimport { createBaseCollectionOps, createBaseVectorOps } from './vecdb-provider-base.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'qdrant' })\n\n/**\n * 可选 SDK 的真实模块类型;type import 不会提前加载运行时驱动。\n * @example 模块内部上下文\n * ```ts\n * function client(module: QdrantModule) {\n * return new module.QdrantClient({ url: 'http://localhost:6333' })\n * }\n * ```\n */\ntype QdrantModule = typeof import('@qdrant/js-client-rest')\n\nfunction isQdrantModule(value: unknown): value is QdrantModule {\n if (typeof value !== 'object' || value === null) {\n return false\n }\n\n const maybeModule = value as { QdrantClient?: unknown }\n return typeof maybeModule.QdrantClient === 'function'\n}\n\n/**\n * 将字符串 ID 转换为 UUID 格式(Qdrant 要求 UUID 或无符号整数作为 point ID)\n *\n * @param id - 原始字符串 ID\n * @returns UUID 格式字符串\n */\nfunction hashToUuid(id: string): string {\n const hash = createHash('sha256').update(id).digest('hex')\n return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-${hash.slice(12, 16)}-${hash.slice(16, 20)}-${hash.slice(20, 32)}`\n}\n\n/**\n * 将 DistanceMetric 转换为 Qdrant 距离类型名称\n */\nfunction toQdrantDistance(metric: DistanceMetric): Schemas['Distance'] {\n switch (metric) {\n case 'cosine': return 'Cosine'\n case 'euclidean': return 'Euclid'\n case 'dot': return 'Dot'\n }\n}\n\n/**\n * 创建 Qdrant Provider\n *\n * @returns VecdbProvider 实例\n * @example 模块内部上下文\n * ```ts\n * const provider = createQdrantProvider()\n * // 连接由模块 init 发布;独立内部调用者必须检查 connect 并回收 close。\n * const closed = await provider.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * ```\n */\nexport function createQdrantProvider(): VecdbProvider {\n let client: QdrantClient | null = null\n let config: QdrantConfig | null = null\n\n // ─── 辅助函数 ───\n\n /** 判断动态 import 是否因缺少驱动失败 */\n function isMissingModuleError(error: unknown, packageName: string): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes(`'${packageName}'`) || message.includes(`\\\"${packageName}\\\"`) || message.includes(packageName)\n }\n\n /** 动态加载 Qdrant JS 客户端 */\n async function loadQdrantClient(): Promise<HaiResult<QdrantModule>> {\n try {\n const mod = await import('@qdrant/js-client-rest')\n if (!isQdrantModule(mod)) {\n const error = new Error('@qdrant/js-client-rest driver module does not export QdrantClient')\n logger.error('Failed to load Qdrant driver', { error: error.message })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: '@qdrant/js-client-rest' } }), error)\n }\n\n return ok(mod)\n }\n catch (error) {\n if (isMissingModuleError(error, '@qdrant/js-client-rest')) {\n logger.error('Failed to load Qdrant driver', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.DRIVER_NOT_FOUND, vecdbM('vecdb_driverNotFound', { params: { driver: '@qdrant/js-client-rest' } }), error)\n }\n throw error\n }\n }\n\n /** 判断 Qdrant 错误是否为 404(集合不存在) */\n function isQdrantNotFoundError(error: unknown): boolean {\n // Qdrant REST SDK 的 ApiError 携带顶层 status;不猜测其它 SDK 的异常形态。\n return typeof error === 'object' && error !== null && 'status' in error && error.status === 404\n }\n\n /** 获取集合信息;集合不存在时返回 COLLECTION_NOT_FOUND,其余异常继续抛出 */\n async function getCollectionInfo(name: string): Promise<HaiResult<Schemas['CollectionInfo']>> {\n try {\n return ok(await client!.getCollection(name))\n }\n catch (error) {\n if (isQdrantNotFoundError(error)) {\n return err(HaiVecdbError.COLLECTION_NOT_FOUND, vecdbM('vecdb_collectionNotFound', { params: { name } }))\n }\n throw error\n }\n }\n\n /** 本模块使用单个未命名向量字段,不将外部 named/Manhattan 集合猜测为默认 cosine。 */\n function readVectorDefinition(info: Schemas['CollectionInfo']): Pick<CollectionInfo, 'dimension' | 'metric'> | undefined {\n const vectors = info.config.params.vectors\n if (!vectors || !('size' in vectors) || typeof vectors.size !== 'number' || !Number.isSafeInteger(vectors.size) || vectors.size <= 0)\n return undefined\n if (!('distance' in vectors))\n return undefined\n const metric = vectors.distance === 'Cosine' ? 'cosine' : vectors.distance === 'Euclid' ? 'euclidean' : vectors.distance === 'Dot' ? 'dot' : undefined\n return metric ? { dimension: vectors.size, metric } : undefined\n }\n\n /** 获取集合维度 */\n async function getCollectionDimension(name: string): Promise<HaiResult<number>> {\n const infoResult = await getCollectionInfo(name)\n if (!infoResult.success) {\n return infoResult\n }\n\n const definition = readVectorDefinition(infoResult.data)\n return definition\n ? ok(definition.dimension)\n : err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_invalidCollectionSchema', { params: { name } }))\n }\n\n /** 校验查询向量维度 */\n function validateVectorDimension<T>(expected: number, actual: number): HaiResult<T> | null {\n if (expected === actual) {\n return null\n }\n\n return err(\n HaiVecdbError.DIMENSION_MISMATCH,\n vecdbM('vecdb_dimensionMismatch', {\n params: { expected: String(expected), actual: String(actual) },\n }),\n )\n }\n\n // ─── 操作上下文 ───\n\n const ctx = { isConnected: () => client !== null, logger, operationLog: () => config?.operationLog }\n\n // ─── 集合操作适配器 ───\n\n const collectionDriver: CollectionDriver = {\n async create(name, options) {\n logger.debug('Creating collection', { name, dimension: options.dimension, metric: options.metric })\n\n // 检查集合是否已存在\n const collections = await client!.getCollections()\n const exists = collections.collections.some(c => c.name === name)\n if (exists) {\n return err(HaiVecdbError.COLLECTION_ALREADY_EXISTS, vecdbM('vecdb_collectionAlreadyExists', { params: { name } }))\n }\n\n const metric = options.metric ?? config?.metric ?? 'cosine'\n\n await client!.createCollection(name, {\n vectors: {\n size: options.dimension,\n distance: toQdrantDistance(metric),\n },\n })\n\n logger.info('Collection created', { name, dimension: options.dimension, metric })\n return ok(undefined)\n },\n\n async drop(name) {\n logger.debug('Dropping collection', { name })\n\n const infoResult = await getCollectionInfo(name)\n if (!infoResult.success) {\n return infoResult\n }\n\n await client!.deleteCollection(name)\n\n logger.info('Collection dropped', { name })\n return ok(undefined)\n },\n\n async exists(name) {\n logger.debug('Checking collection exists', { name })\n\n try {\n await client!.getCollection(name)\n return ok(true)\n }\n catch (error) {\n if (isQdrantNotFoundError(error)) {\n return ok(false)\n }\n throw error\n }\n },\n\n async info(name) {\n logger.debug('Getting collection info', { name })\n\n const infoResult = await getCollectionInfo(name)\n if (!infoResult.success) {\n return infoResult\n }\n\n const collectionInfo = infoResult.data\n\n const definition = readVectorDefinition(collectionInfo)\n if (!definition)\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_invalidCollectionSchema', { params: { name } }))\n\n return ok({\n name,\n ...definition,\n count: collectionInfo.points_count ?? 0,\n })\n },\n\n async list() {\n logger.debug('Listing collections')\n\n const collections = await client!.getCollections()\n const names = collections.collections.map(c => c.name)\n return ok(names)\n },\n }\n\n // ─── 向量操作适配器 ───\n\n const vectorDriver: VectorDriver = {\n async insert(collection, documents) {\n logger.debug('Inserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n for (const document of documents) {\n const validation = validateVectorDimension<void>(dimensionResult.data, document.vector.length)\n if (validation) {\n return validation\n }\n }\n\n // 内部保留字段 _id / _content 放在展开之后,防止被 metadata 同名字段覆盖\n const points = documents.map(doc => ({\n id: hashToUuid(doc.id),\n vector: doc.vector,\n payload: {\n ...doc.metadata,\n _id: doc.id,\n _content: doc.content ?? '',\n },\n }))\n\n // 限制:Qdrant API 仅提供 upsert,无原生 strict insert;\n // ID 已存在时会静默覆盖而非报错,行为等同于 upsert。\n // 返回成功前等待索引写入应用;上层知识版本只有此后才可发布。\n await client!.upsert(collection, { points, wait: true })\n\n logger.info('Vectors inserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async upsert(collection, documents) {\n logger.debug('Upserting vectors', { collection, count: documents.length })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n for (const document of documents) {\n const validation = validateVectorDimension<void>(dimensionResult.data, document.vector.length)\n if (validation) {\n return validation\n }\n }\n\n // 内部保留字段 _id / _content 放在展开之后,防止被 metadata 同名字段覆盖\n const points = documents.map(doc => ({\n id: hashToUuid(doc.id),\n vector: doc.vector,\n payload: {\n ...doc.metadata,\n _id: doc.id,\n _content: doc.content ?? '',\n },\n }))\n\n await client!.upsert(collection, { points, wait: true })\n\n logger.info('Vectors upserted', { collection, count: documents.length })\n return ok(undefined)\n },\n\n async delete(collection, ids) {\n logger.debug('Deleting vectors', { collection, count: ids.length })\n\n const uuids = ids.map(hashToUuid)\n await client!.delete(collection, { points: uuids, wait: true })\n\n logger.info('Vectors deleted', { collection, count: ids.length })\n return ok(undefined)\n },\n\n async search(collection, vector, options) {\n const topK = options?.topK ?? 10\n const minScore = options?.minScore ?? 0\n\n logger.debug('Searching vectors', { collection, topK, hasFilter: !!options?.filter })\n\n const dimensionResult = await getCollectionDimension(collection)\n if (!dimensionResult.success) {\n return dimensionResult\n }\n\n const dimensionValidation = validateVectorDimension<VectorSearchResult[]>(dimensionResult.data, vector.length)\n if (dimensionValidation) {\n return dimensionValidation\n }\n\n // 构建过滤条件\n let filter: Schemas['Filter'] | undefined\n if (options?.filter && Object.keys(options.filter).length > 0) {\n const mustConditions = Object.entries(options.filter).map(([key, value]) => ({\n key,\n match: { value },\n }))\n filter = { must: mustConditions }\n }\n\n const searchResult = await client!.query(collection, {\n query: vector,\n limit: topK,\n score_threshold: minScore > 0 ? minScore : undefined,\n filter,\n with_payload: true,\n })\n\n const results: VectorSearchResult[] = searchResult.points.map((point) => {\n const payload = point.payload ?? {}\n const { _id, _content, ...metadata } = payload\n return {\n id: typeof _id === 'string' ? _id : '',\n score: point.score,\n content: typeof _content === 'string' && _content.length > 0 ? _content : undefined,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n }\n })\n\n return ok(results)\n },\n\n async count(collection) {\n logger.debug('Counting vectors', { collection })\n\n // 集合信息中的 points_count 是近似统计,不能用作版本过滤扩大候选数的终止依据。\n const count = await client!.count(collection, { exact: true })\n return ok(count.count)\n },\n }\n\n // ─── Provider 接口 ───\n\n return {\n name: 'qdrant',\n\n async connect(cfg): Promise<HaiResult<void>> {\n if (cfg.type !== 'qdrant') {\n return err(HaiVecdbError.UNSUPPORTED_TYPE, vecdbM('vecdb_unsupportedType', { params: { type: cfg.type } }))\n }\n\n const qdrantConfig = cfg\n\n try {\n const loadResult = await loadQdrantClient()\n if (!loadResult.success) {\n return loadResult\n }\n\n const { QdrantClient: QdrantClientClass } = loadResult.data\n\n const qdrantClient = new QdrantClientClass({\n url: qdrantConfig.url,\n apiKey: qdrantConfig.apiKey,\n })\n\n // 验证连接\n await qdrantClient.getCollections()\n\n client = qdrantClient\n\n config = qdrantConfig\n logger.info('Qdrant connected', { url: core.sanitize.sanitizeUrl(qdrantConfig.url) })\n return ok(undefined)\n }\n catch (error) {\n // 仅提取错误消息,避免 error 对象中的 URL 或连接信息泄漏\n logger.error('Failed to connect to Qdrant', { error: error instanceof Error ? error.message : String(error) })\n return err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_connectionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async close(): Promise<HaiResult<void>> {\n client = null\n config = null\n logger.info('Qdrant connection closed')\n return ok(undefined)\n },\n\n isConnected(): boolean {\n return client !== null\n },\n\n collection: createBaseCollectionOps(ctx, collectionDriver),\n vector: createBaseVectorOps(ctx, vectorDriver),\n }\n}\n","/**\n * @h-ai/vecdb — 向量数据库服务主入口\n *\n * 本文件提供统一的 `vecdb` 对象,聚合所有向量数据库操作功能。\n * @module vecdb-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { VecdbProvider } from './providers/vecdb-provider-base.js'\nimport type { VecdbConfig, VecdbConfigInput } from './vecdb-config.js'\nimport type {\n CollectionOperations,\n VecdbConnection,\n VecdbFunctions,\n VectorOperations,\n} from './vecdb-types.js'\n\nimport process from 'node:process'\nimport { core, err, ok } from '@h-ai/core'\n\nimport { createChromaProvider } from './providers/vecdb-provider-chroma.js'\nimport { createLancedbProvider } from './providers/vecdb-provider-lancedb.js'\nimport { createPgvectorProvider } from './providers/vecdb-provider-pgvector.js'\nimport { createQdrantProvider } from './providers/vecdb-provider-qdrant.js'\nimport { VecdbConfigSchema } from './vecdb-config.js'\nimport { vecdbM } from './vecdb-i18n.js'\nimport { HaiVecdbError } from './vecdb-types.js'\n\nconst logger = core.logger.child({ module: 'vecdb', scope: 'main' })\n\n// ─── 内部状态 ───\n\n/** 当前活跃的向量数据库 Provider(未初始化时为 null) */\nlet currentProvider: VecdbProvider | null = null\n\n/** 当前向量数据库配置(未初始化时为 null) */\nlet currentConfig: VecdbConfig | null = null\n\n/** init() 是否正在执行(并发防护) */\nlet initInProgress = false\n\n/** 未发布或关闭失败的唯一资源所有权;不暴露给业务,close/init 必须先清理它。 */\nlet pendingProvider: VecdbProvider | null = null\n/** close 等待初始化确定资源归属,并合并并发关闭。 */\nlet initCompletion: Promise<void> | null = null\nlet closingPromise: Promise<HaiResult<void>> | null = null\n\n/**\n * 停止业务发布,只有清理确认成功才释放所有权;失败可由同一模块重试。\n * @returns 清理结果;失败保留 cleanupPending 与资源句柄。\n * @example 模块内部上下文\n * ```ts\n * const closed = await vecdb.close()\n * if (!closed.success && closed.error.ext?.cleanupPending) {\n * const retried = await vecdb.close()\n * if (!retried.success) throw new Error(retried.error.message)\n * }\n * ```\n */\nasync function closeOwnedProvider(): Promise<HaiResult<void>> {\n if (currentProvider) {\n pendingProvider = currentProvider\n currentProvider = null\n }\n currentConfig = null\n if (!pendingProvider)\n return ok(undefined)\n try {\n const result = await pendingProvider.close()\n if (!result.success)\n return err({ ...result.error, ext: { ...result.error.ext, cleanupPending: true } })\n pendingProvider = null\n return result\n }\n catch (cause) {\n return err({ ...HaiVecdbError.CONNECTION_FAILED, message: vecdbM('vecdb_closeFailed', { params: { error: cause instanceof Error ? cause.message : String(cause) } }), cause, ext: { cleanupPending: true } })\n }\n}\n\n/**\n * 初始化失败保留原始业务错误,并说明候选清理是否需要重试。\n * @param result - 候选初始化的失败结果。\n * @returns 原始失败;清理已确认时移除过期 cleanup 标记。\n * @example 模块内部上下文\n * ```ts\n * const failure = err(HaiVecdbError.CONNECTION_FAILED, 'Controlled startup failure')\n * const result = await failInitialization(failure)\n * if (!result.success) void result.error.ext?.cleanupPending\n * ```\n */\nasync function failInitialization(result: HaiResult<void>): Promise<HaiResult<void>> {\n const cleanup = await closeOwnedProvider()\n if (result.success)\n return result\n if (!cleanup.success)\n return err({ ...result.error, ext: { ...result.error.ext, cleanupPending: true, cleanupError: cleanup.error } })\n const ext = { ...result.error.ext }\n delete ext.cleanupPending\n delete ext.cleanupError\n return err({ ...result.error, ext: Object.keys(ext).length ? ext : undefined })\n}\n\n// ─── Provider 工厂 ───\n\n/**\n * 根据配置创建对应的向量数据库 Provider\n *\n * @param config - 向量数据库配置(已校验、默认值补齐)\n * @returns Provider 实例\n */\nfunction createProvider(config: VecdbConfig): VecdbProvider {\n switch (config.type) {\n case 'lancedb':\n return createLancedbProvider()\n case 'pgvector':\n return createPgvectorProvider()\n case 'qdrant':\n return createQdrantProvider()\n case 'chroma':\n return createChromaProvider()\n }\n}\n\n// ─── 未初始化时的占位操作 ───\n\n/** 未初始化工具集 */\nconst notInitialized = core.module.createNotInitializedKit(\n HaiVecdbError.NOT_INITIALIZED,\n () => vecdbM('vecdb_notInitialized'),\n)\n\n/** 未初始化时的集合操作占位对象 */\nconst notInitializedCollection = notInitialized.proxy<CollectionOperations>()\n\n/** 未初始化时的向量操作占位对象 */\nconst notInitializedVector = notInitialized.proxy<VectorOperations>()\n\n/** 稳定转发层不泄漏 Provider 引用;旧调用方持有的操作在关闭期间同样停止服务。 */\nconst collectionOps: CollectionOperations = {\n create: (name, options) => currentProvider && !closingPromise ? currentProvider.collection.create(name, options) : notInitializedCollection.create(name, options),\n drop: name => currentProvider && !closingPromise ? currentProvider.collection.drop(name) : notInitializedCollection.drop(name),\n exists: name => currentProvider && !closingPromise ? currentProvider.collection.exists(name) : notInitializedCollection.exists(name),\n info: name => currentProvider && !closingPromise ? currentProvider.collection.info(name) : notInitializedCollection.info(name),\n list: () => currentProvider && !closingPromise ? currentProvider.collection.list() : notInitializedCollection.list(),\n}\nconst vectorOps: VectorOperations = {\n insert: (collection, documents) => currentProvider && !closingPromise ? currentProvider.vector.insert(collection, documents) : notInitializedVector.insert(collection, documents),\n upsert: (collection, documents) => currentProvider && !closingPromise ? currentProvider.vector.upsert(collection, documents) : notInitializedVector.upsert(collection, documents),\n delete: (collection, ids) => currentProvider && !closingPromise ? currentProvider.vector.delete(collection, ids) : notInitializedVector.delete(collection, ids),\n search: (collection, vector, options) => currentProvider && !closingPromise ? currentProvider.vector.search(collection, vector, options) : notInitializedVector.search(collection, vector, options),\n count: collection => currentProvider && !closingPromise ? currentProvider.vector.count(collection) : notInitializedVector.count(collection),\n}\n\n// ─── 统一向量数据库服务对象 ───\n\n/**\n * 向量数据库服务对象\n *\n * 统一的向量数据库访问入口,提供以下功能:\n * - `vecdb.init()` - 初始化连接\n * - `vecdb.close()` - 关闭连接\n * - `vecdb.collection` - 集合管理(创建/删除/查询)\n * - `vecdb.vector` - 向量操作(插入/搜索/删除)\n * - `vecdb.config` - 当前配置\n * - `vecdb.isInitialized` - 初始化状态\n * @example\n * ```ts\n * import { vecdb } from '@h-ai/vecdb'\n *\n * const initialized = await vecdb.init({ type: 'qdrant', url: 'http://localhost:6333' })\n * if (!initialized.success) throw new Error(initialized.error.message)\n * try {\n * const result = await vecdb.collection.list()\n * if (!result.success) throw new Error(result.error.message)\n * void result.data\n * } finally {\n * const closed = await vecdb.close()\n * if (!closed.success) throw new Error(closed.error.message)\n * }\n * ```\n */\nexport const vecdb: VecdbFunctions = {\n /**\n * 初始化向量数据库连接\n *\n * @param config - 向量数据库配置(允许部分字段,内部会补齐默认值)\n * @returns 初始化结果,失败时包含错误信息\n */\n async init(config: VecdbConfigInput): Promise<HaiResult<void>> {\n // 并发防护:防止多次同时调用导致 Provider/连接泄漏\n if (initInProgress || closingPromise) {\n logger.warn('Vecdb init already in progress, skipping concurrent call')\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_initInProgress'))\n }\n initInProgress = true\n let resolveInit!: () => void\n initCompletion = new Promise<void>((resolve) => {\n resolveInit = resolve\n })\n\n try {\n const cleanup = await closeOwnedProvider()\n if (!cleanup.success)\n return cleanup\n\n logger.info('Initializing vecdb module')\n\n const parseResult = VecdbConfigSchema.safeParse(config)\n if (!parseResult.success) {\n logger.error('Vecdb config validation failed', { error: parseResult.error.message })\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_configError', { params: { error: parseResult.error.message } }), parseResult.error)\n }\n const parsed = parseResult.data\n if (core.module.requiresSharedState(process.env) && (parsed.type === 'lancedb' || (parsed.type === 'chroma' && !!parsed.path && !parsed.url)))\n return err(HaiVecdbError.CONFIG_ERROR, vecdbM('vecdb_sharedBackendRequired'))\n\n try {\n const provider = createProvider(parsed)\n pendingProvider = provider\n const connectResult = await provider.connect(parsed)\n if (!connectResult.success) {\n logger.error('Vecdb module initialization failed', {\n code: connectResult.error.code,\n message: connectResult.error.message,\n })\n return await failInitialization(connectResult)\n }\n pendingProvider = null\n currentProvider = provider\n currentConfig = parsed\n logger.info('Vecdb module initialized', { type: parsed.type })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Vecdb module initialization failed', { error })\n return await failInitialization(err(HaiVecdbError.CONNECTION_FAILED, vecdbM('vecdb_initFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error))\n }\n }\n finally {\n initInProgress = false\n initCompletion = null\n resolveInit()\n }\n },\n\n /**\n * 获取集合管理操作接口\n *\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get collection(): CollectionOperations {\n return collectionOps\n },\n\n /**\n * 获取向量操作接口\n *\n * 未初始化时返回占位对象(所有调用返回 NOT_INITIALIZED)。\n */\n get vector(): VectorOperations {\n return vectorOps\n },\n\n /** 获取当前脱敏配置快照(未初始化时为 null) */\n get config(): VecdbConfig | null {\n return currentConfig && !closingPromise ? core.sanitize.sanitizeSensitiveFields(currentConfig) : null\n },\n\n /** 获取底层后端的原始连接信息(含凭证,未初始化时为 null;仅供同进程内集成使用) */\n get rawConnection(): VecdbConnection | null {\n if (!currentConfig || closingPromise)\n return null\n if (currentConfig.type === 'qdrant')\n return { type: 'qdrant', url: currentConfig.url, apiKey: currentConfig.apiKey }\n if (currentConfig.type === 'pgvector') {\n return {\n type: 'pgvector',\n connectionString: currentConfig.url,\n host: currentConfig.host,\n port: currentConfig.port,\n database: currentConfig.database,\n user: currentConfig.user,\n password: currentConfig.password,\n }\n }\n if (currentConfig.type === 'chroma') {\n return {\n type: 'chroma',\n url: currentConfig.url,\n host: currentConfig.host,\n port: currentConfig.port,\n apiKey: currentConfig.apiKey,\n path: currentConfig.path,\n }\n }\n return { type: currentConfig.type, path: currentConfig.path }\n },\n\n /** 检查是否已初始化 */\n get isInitialized(): boolean {\n return currentProvider !== null && !closingPromise && currentProvider.isConnected()\n },\n\n /**\n * 关闭向量数据库连接\n *\n * 多次调用安全,未初始化时直接返回。\n */\n async close(): Promise<HaiResult<void>> {\n if (!closingPromise) {\n closingPromise = (async () => {\n if (initCompletion)\n await initCompletion\n return closeOwnedProvider()\n })().finally(() => { closingPromise = null })\n }\n return await closingPromise\n },\n}\n"]}