@h-ai/ai 0.1.0-alpha.37 → 0.1.0-alpha.39
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/{ai-audio-ws-protocol-BK5753o1.d.ts → ai-audio-ws-protocol-DbZZvH52.d.ts} +1 -1
- package/dist/{ai-reasoning-types-CslaY4xX.d.ts → ai-reasoning-types-B8PH0w2_.d.ts} +2 -0
- package/dist/browser.d.ts +2 -2
- package/dist/browser.js +1 -1
- package/dist/{chunk-5XL4QDIJ.js → chunk-OZYROB52.js} +2 -2
- package/dist/chunk-OZYROB52.js.map +1 -0
- package/dist/client/index.d.ts +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +10 -6
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/dist/chunk-5XL4QDIJ.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/a2a/ai-a2a-server.ts","../src/a2a/ai-a2a-functions.ts","../src/audio/providers/ai-audio-provider.ts","../src/audio/providers/ai-audio-provider-doubao.ts","../src/llm/ai-llm-stream.ts","../src/audio/providers/ai-audio-provider-mimo.ts","../src/audio/providers/ai-audio-provider-openai.ts","../src/audio/providers/ai-audio-provider-qwen.ts","../src/audio/ai-audio-functions.ts","../src/compress/ai-compress-functions.ts","../src/store/ai-store-key.ts","../src/context/ai-context-functions.ts","../src/embedding/ai-embedding-functions.ts","../src/file/ai-file-functions.ts","../src/knowledge/ai-knowledge-entity.ts","../src/knowledge/ai-knowledge-functions.ts","../src/llm/ai-llm-tool.ts","../src/llm/providers/ai-llm-provider-anthropic.ts","../src/llm/providers/ai-llm-provider-openai-responses.ts","../src/llm/providers/ai-llm-provider-openai.ts","../src/llm/providers/ai-llm-provider-router.ts","../src/llm/ai-llm-functions.ts","../src/mcp/ai-mcp-functions.ts","../src/memory/ai-memory-facade.ts","../src/memory/ai-memory-extractor.ts","../src/memory/ai-memory-injection.ts","../src/memory/providers/ai-memory-provider-mem0-oss.ts","../src/memory/ai-memory-consolidation.ts","../src/memory/providers/ai-memory-provider-native.ts","../src/persona/ai-persona-functions.ts","../src/rag/ai-rag-functions.ts","../src/reasoning/ai-reasoning-functions.ts","../src/rerank/ai-rerank-functions.ts","../src/retrieval/ai-retrieval-functions.ts","../src/summary/ai-summary-functions.ts","../src/token/ai-token-functions.ts","../src/ai-functions.ts","../src/store/providers/ai-store-provider-db.ts","../src/store/providers/ai-store-provider-memory.ts","../src/ai-main.ts","../src/mcp/ai-mcp-server.ts"],"names":["ServerCallContextImpl","options","core","logger","Buffer","size","ok","err","resolveSynthesisOutput","OpenAI","systemMessages","nonSystem","toSummarize","combineSignal","fullReply","model","usage","result","datapipe","nanoid","zod","contentToText","isRecord","process","response","LEADING_MARKDOWN_FENCE_REGEX","TRAILING_MARKDOWN_FENCE_REGEX","extractMemories","DEFAULT_IMPORTANCE","MEMORY_TYPES","normalizeType","normalizeImportance","matchScope","DEFAULT_OBJECT_ID","topK","countResult","count","vecdb","cosineSimilarity"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA8CO,SAAS,eAAe,MAAA,EAAuC;AACpE,EAAA,MAAM,IAAA,GAAkB;AAAA,IACtB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,WAAA,EAAa,OAAO,WAAA,IAAe,EAAA;AAAA,IACnC,KAAK,MAAA,CAAO,GAAA;AAAA,IACZ,OAAA,EAAS,OAAO,OAAA,IAAW,OAAA;AAAA,IAC3B,eAAA,EAAiB,OAAA;AAAA,IACjB,iBAAA,EAAmB,CAAC,MAAM,CAAA;AAAA,IAC1B,kBAAA,EAAoB,CAAC,MAAM,CAAA;AAAA,IAC3B,cAAc,EAAC;AAAA,IACf,SAAS,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG,IAAI,CAAA,CAAA,MAAM;AAAA,MACtC,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,WAAA,EAAa,EAAE,WAAA,IAAe,EAAA;AAAA,MAC9B,IAAA,EAAM,CAAA,CAAE,IAAA,IAAQ;AAAC,KACnB,CAAE;AAAA,GACJ;AAGA,EAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAQ;AAC3B,IAAA,MAAM,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAK,GAAI,OAAO,QAAA,CAAS,MAAA;AAC/C,IAAA,IAAA,CAAK,eAAA,GAAkB;AAAA,MACrB,QAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,UAAU,IAAA;AAAK,KAC/C;AACA,IAAA,IAAA,CAAK,WAAW,CAAC,EAAE,MAAA,EAAQ,IAAI,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,IAAA;AACT;;;ACzCA,IAAM,MAAA,GAAS,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,CAAA;AAC/D,IAAM,2BAAA,GAA8B,GAAA;AAcpC,SAAS,kBAAkB,SAAA,EAAuC;AAChE,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,SAAS,CAAA;AAChC,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,OAAA,IAAW,MAAA,CAAO,QAAA,KAAa,QAAA;AACrD,IAAA,MAAM,IAAI,MAAM,uCAAuC,CAAA;AACzD,EAAA,IAAI,MAAA,CAAO,YAAY,MAAA,CAAO,QAAA;AAC5B,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAE/D,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,OAAO,QAAA,EAAS;AAAA,IAC5B,WAAW,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,EAAG,OAAO,QAAQ,CAAA;AAAA,GAC/C;AACF;AAEA,SAAS,SAAS,KAAA,EAAqD;AACrE,EAAA,OAAO,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAmC,MAAA;AACjF;AAEA,SAAS,oBAAoB,KAAA,EAA+D;AAC1F,EAAA,MAAM,MAAA,GAAS,SAAS,KAAK,CAAA;AAC7B,EAAA,OAAO,MAAA,EAAQ,SAAS,OAAA,KAAY,MAAA,CAAO,UAAU,MAAA,IAAa,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,CAAA;AAC9F;AAEA,SAAS,aAAa,KAAA,EAA+B;AACnD,EAAA,OAAO,QAAA,CAAS,KAAK,CAAA,EAAG,MAAA,KAAW,MAAA;AACrC;AAEA,SAAS,gBAAgB,KAAA,EAAkC;AACzD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,GAAG,KAAK,CAAA;AAC7C;AAEA,SAAS,YAAY,IAAA,EAAmC;AACtD,EAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,EAAA,OAAO,OAAO,MAAA,EAAQ,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,MAAA;AAC1D;AAEA,SAAS,aAAa,KAAA,EAAiD;AACrE,EAAA,OAAO,KAAA,EAAO,GAAA,CAAI,WAAW,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAyB,IAAA,IAAQ,IAAI,CAAA,IAAK,EAAC;AACpF;AAEA,eAAe,sBAAA,CACb,SAAA,EACA,OAAA,EACA,OAAA,EACmC;AACnC,EAAA,IAAI,SAAA,GAAY,8BAAA;AAChB,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,kBAAkB,SAAS,CAAA;AAChD,IAAA,MAAM,aAAa,YAAA,CAAa,UAAA;AAChC,IAAA,SAAA,GAAY,YAAA,CAAa,SAAA;AACzB,IAAA,MAAM,gBAAgB,OAAA,EAAS,OAAA;AAC/B,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,EAAS,WAAW,2BAA2B,CAAA;AAC7E,IAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,UAAA,EAAY;AAAA,MACvC,SAAA,GAAY,CAAC,KAAA,EAA0B,IAAA,KAAuB;AAC5D,QAAA,MAAM,eAAA,GAAkB,IAAA,EAAM,OAAA,GAC1B,MAAA,CAAO,WAAA,CAAY,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAsB,CAAA,CAAE,OAAA,EAAS,IACrE,EAAC;AACL,QAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,YAAY,OAAA,CAAQ,SAAS,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,MAAA,KAAkC,OAAA,CAAQ,MAAM,CAAC,CAAA;AACxH,QAAA,MAAM,SAAA,GAAyB;AAAA,UAC7B,GAAG,IAAA;AAAA,UACH,OAAA,EAAS,EAAE,GAAG,eAAA,EAAiB,GAAG,aAAA,EAAc;AAAA,UAChD,MAAA,EAAQ,QAAQ,MAAA,GAAS,CAAA,GAAI,YAAY,GAAA,CAAI,OAAO,CAAA,GAAI,OAAA,CAAQ,CAAC;AAAA,SACnE;AACA,QAAA,OAAO,UAAA,CAAW,KAAA,CAAM,KAAA,EAAO,SAAS,CAAA;AAAA,MAC1C,CAAA;AAAA,KACD,CAAA;AACD,IAAA,MAAM,MAAA,GAA+B;AAAA,MACnC,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,SAAA;AAAA,QACN,SAAA,EAAW,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,QACvE,IAAA,EAAM,MAAA;AAAA,QACN,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,SAAS;AAAA;AACzC,KACF;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA;AAChD,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,OAAO,GAAA,CAAI,UAAA,CAAW,sBAAA,EAAwB,GAAA,CAAI,0BAA0B,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,gCAAA,EAAiC,EAAG,CAAC,CAAA;AAAA,IACtJ;AAEA,IAAA,MAAM,eAAe,QAAA,CAAS,MAAA;AAC9B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,YAAA,CAAa,YAAY,CAAA,EAAG;AAC9B,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,SAAA,EAAW,OAAA,CAAQ,CAAA,QAAA,KAAY,aAAa,QAAA,CAAS,KAAK,CAAC,CAAA,IAAK,EAAC;AAChG,MAAA,MAAA,GAAS;AAAA,QACP,QAAQ,YAAA,CAAa,EAAA;AAAA,QACrB,SAAA,EAAW,aAAa,MAAA,EAAQ,KAAA;AAAA,QAChC,YAAA,EAAc,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA,CAAA;AAAA,QACtC,aAAA,EAAe,aAAa,SAAA,EAAW,OAAA,CAAQ,cAAY,QAAA,CAAS,KAAA,IAAS,EAAE;AAAA,OACjF;AAAA,IACF,CAAA,MAAA,IACS,eAAA,CAAgB,YAAY,CAAA,EAAG;AACtC,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,YAAA,CAAa,KAAK,CAAA;AACjD,MAAA,MAAA,GAAS;AAAA,QACP,YAAA,EAAc,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA,CAAA;AAAA,QACtC,eAAe,YAAA,CAAa;AAAA,OAC9B;AAAA,IACF,CAAA,MACK;AACH,MAAA,MAAA,GAAS,EAAC;AAAA,IACZ;AAEA,IAAA,OAAO,GAAG,MAAM,CAAA;AAAA,EAClB,SACO,KAAA,EAAO;AACZ,IAAA,MAAM,SAAA,GAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,cAAA;AACxD,IAAA,OAAO,GAAA,CAAI,UAAA,CAAW,sBAAA,EAAwB,GAAA,CAAI,0BAA0B,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU,EAAG,CAAC,CAAA;AAAA,EAC/H;AACF;AAUO,IAAM,oBAAN,MAA6C;AAAA,EAClD,YAA6B,KAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAA0B;AAAA,EAEvD,MAAM,IAAA,CAAK,IAAA,EAAY,QAAA,EAA6C;AAClE,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,IAAI,IAAA,EAAM;AAAA,MACnC,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,MAAA,EAAQ,KAAK,MAAA,EAAQ,KAAA;AAAA,MACrB,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,IAAA,CAAK,MAAA,EAAgB,QAAA,EAAyD;AAClF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AAAA,EAC9B;AACF,CAAA;AASA,SAAS,uBAAA,CACP,UACA,YAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,CAAQ,cAAA,EAAgB,QAAA,EAAU;AAEtC,MAAA,MAAM,aAAA,GAAkC;AAAA,QACtC,EAAA,EAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,QAChE,QAAQ,cAAA,CAAe,MAAA;AAAA,QACvB,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,cAAA,CAAe,WAAA,CAAY,KAAA,IAAS,EAAC;AAAA,QAC5C,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AACA,MAAA,YAAA,CAAa,IAAA,CAAK,cAAc,EAAA,EAAI,aAAA,EAAe,EAAE,QAAA,EAAU,cAAA,CAAe,QAAQ,MAAA,EAAQ,MAAA,EAAQ,CAAA,CACnG,KAAA,CAAM,OAAK,MAAA,CAAO,IAAA,CAAK,sCAAsC,EAAE,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAG7E,MAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AACtD,MAAA,MAAM,UAAA,GAAgC,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AAC5D,MAAA,UAAA,CAAW,OAAA,GAAU,CAAC,KAAA,KAAU;AAE9B,QAAA,IAAI,mBAAA,CAAoB,KAAK,CAAA,EAAG;AAC9B,UAAA,MAAM,cAAA,GAAmC;AAAA,YACvC,EAAA,EAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,YAChE,QAAQ,cAAA,CAAe,MAAA;AAAA,YACvB,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,EAAC;AAAA,YACvB,SAAA,EAAW,KAAK,GAAA;AAAI,WACtB;AACA,UAAA,YAAA,CAAa,IAAA,CAAK,eAAe,EAAA,EAAI,cAAA,EAAgB,EAAE,QAAA,EAAU,cAAA,CAAe,QAAQ,MAAA,EAAQ,OAAA,EAAS,CAAA,CACtG,KAAA,CAAM,OAAK,MAAA,CAAO,IAAA,CAAK,uCAAuC,EAAE,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAAA,QAChF;AACA,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB,CAAA;AAEA,MAAA,MAAM,QAAA,CAAS,OAAA,CAAQ,cAAA,EAAgB,UAAU,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,MAAM,UAAA,CAAW,MAAA,EAAQ,QAAA,EAAU;AACjC,MAAA,MAAM,QAAA,CAAS,UAAA,CAAW,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAC5C;AAAA,GACF;AACF;AAsBO,SAAS,mBAAA,CACd,SACA,IAAA,EACe;AACf,EAAA,MAAM,EAAE,eAAc,GAAI,IAAA;AAC1B,EAAA,MAAM,kBAAkB,OAAA,CAAQ,SAAA;AAGhC,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,cAAA,CAAqB,kBAAA,EAAoB;AAAA,IACvE,WAAA,EAAa,IAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU;AAAA,GACX,CAAA;AACD,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,cAAA,CAAiC,qBAAA,EAAuB;AAAA,IACzF,WAAA,EAAa,IAAA;AAAA,IACb,SAAA,EAAW;AAAA,GACZ,CAAA;AAGD,EAAA,MAAM,SAAA,GAAY,eAAe,eAAe,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,IAAI,iBAAA,CAAkB,SAAS,CAAA;AACpD,EAAA,MAAM,eAAA,GAAkB,uBAAA,CAAwB,OAAA,CAAQ,QAAA,EAAU,YAAY,CAAA;AAC9E,EAAA,MAAM,eAAA,GAAkB,IAAI,+BAAA,EAAgC;AAC5D,EAAA,MAAM,iBAAiB,IAAI,qBAAA,CAAsB,SAAA,EAAW,YAAA,EAAc,iBAAiB,eAAe,CAAA;AAC1G,EAAA,MAAM,gBAAA,GAAmB,IAAI,uBAAA,CAAwB,cAAc,CAAA;AAEnE,EAAA,OAAO;AAAA,IACL,gBAAA,GAAmB;AACjB,MAAA,MAAA,CAAO,KAAK,2EAA2E,CAAA;AACvF,MAAA,OAAO,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,YAAA,GAAe;AACb,MAAA,OAAO,GAAG,eAAe,CAAA;AAAA,IAC3B,CAAA;AAAA,IAEA,MAAM,aAAA,CAAc,WAAA,EAAsB,QAAA,EAA8D;AACtG,MAAA,MAAM,aAAA,GAAgB,IAAIA,iBAAA,EAAsB;AAEhD,MAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,MAAA,CAAO,aAAa,aAAa,CAAA;AAGvE,MAAA,IAAI,UAAU,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,iBAAiB,MAAA,EAAQ;AAC1E,QAAA,OAAO;AAAA,UACL,SAAA,EAAW,IAAA;AAAA,UACX,MAAA,EAAQ;AAAA,SACV;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,KAAA;AAAA,QACX,IAAA,EAAM;AAAA,OACR;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,aAAa,MAAA,EAAuB;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,SAAA;AAAA,UAC9B;AAAA,YACE,QAAA,EAAU,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,QAAA;AAAA,YACrC,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAuC,WAAW,MAAA;AAAO,WAC7E;AAAA,UACA,EAAE,QAAQ,MAAA,CAAO,MAAA,IAAU,GAAG,KAAA,EAAO,MAAA,CAAO,SAAS,EAAA;AAAG,SAC1D;AACA,QAAA,OAAO,GAAG,IAAI,CAAA;AAAA,MAChB,SACO,KAAA,EAAO;AACZ,QAAA,OAAO,GAAA,CAAI,UAAA,CAAW,YAAA,EAAc,GAAA,CAAI,4BAA4B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAClH;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,eAAA,CAAgB,SAAA,EAAmB,OAAA,EAAiBC,QAAAA,EAA0B;AAClF,MAAA,OAAO,sBAAA,CAAuB,SAAA,EAAW,OAAA,EAASA,QAAO,CAAA;AAAA,IAC3D;AAAA,GACF;AACF;AA6BO,SAAS,mBAAmB,IAAA,EAAuC;AACxE,EAAA,OAAO;AAAA,IACL,iBAAiB,QAAA,EAA0C;AACzD,MAAA,IAAI,CAAC,IAAA,CAAK,aAAA,EAAc,EAAG;AACzB,QAAA,OAAO,KAAK,oBAAA,EAAqB;AAAA,MACnC;AACA,MAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO,GAAA,CAAI,UAAA,CAAW,kBAAA,EAAoB,GAAA,CAAI,qBAAqB,CAAC,CAAA;AAAA,MACtE;AACA,MAAA,IAAI,IAAA,CAAK,YAAW,EAAG;AACrB,QAAA,MAAA,CAAO,KAAK,iDAAiD,CAAA;AAAA,MAC/D;AACA,MAAA,MAAM,aAAA,GAAgB,KAAK,gBAAA,EAAiB;AAC5C,MAAA,IAAI,CAAC,aAAA,EAAe;AAClB,QAAA,OAAO,GAAA,CAAI,UAAA,CAAW,YAAA,EAAc,GAAA,CAAI,kBAAA,EAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,6BAAA,EAA8B,EAAG,CAAC,CAAA;AAAA,MACnH;AACA,MAAA,MAAM,wBAAwB,EAAE,GAAG,UAAU,SAAA,EAAW,QAAA,EAAU,UAAU,QAAA,EAAS;AACrF,MAAA,MAAM,IAAA,GAAO,mBAAA;AAAA,QACX,EAAE,SAAA,EAAW,qBAAA,EAAuB,QAAA,EAAS;AAAA,QAC7C,EAAE,aAAA;AAAc,OAClB;AACA,MAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AACpB,MAAA,MAAA,CAAO,KAAK,yBAAA,EAA2B,EAAE,WAAW,SAAA,CAAU,SAAA,CAAU,MAAM,CAAA;AAC9E,MAAA,OAAO,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,YAAA,GAAe;AACb,MAAA,MAAM,IAAA,GAAO,KAAK,UAAA,EAAW;AAC7B,MAAA,IAAI,IAAA;AACF,QAAA,OAAO,KAAK,YAAA,EAAa;AAC3B,MAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,MAAA,IAAI,SAAA;AACF,QAAA,OAAO,EAAA,CAAG,EAAE,GAAG,SAAA,CAAU,WAAW,QAAA,EAAU,SAAA,CAAU,UAAgC,CAAA;AAC1F,MAAA,IAAI,CAAC,KAAK,aAAA,EAAc;AACtB,QAAA,OAAO,KAAK,oBAAA,EAAqB;AACnC,MAAA,OAAO,GAAA,CAAI,UAAA,CAAW,kBAAA,EAAoB,GAAA,CAAI,qBAAqB,CAAC,CAAA;AAAA,IACtE,CAAA;AAAA,IAEA,MAAM,aAAA,CAAc,WAAA,EAAsB,OAAA,EAAmC;AAC3E,MAAA,MAAM,IAAA,GAAO,KAAK,UAAA,EAAW;AAC7B,MAAA,IAAI,IAAA;AACF,QAAA,OAAO,IAAA,CAAK,aAAA,CAAc,WAAA,EAAa,OAAO,CAAA;AAChD,MAAA,IAAI,CAAC,KAAK,aAAA,EAAc;AACtB,QAAA,OAAO,KAAK,oBAAA,EAAqB;AACnC,MAAA,OAAO,GAAA,CAAI,UAAA,CAAW,kBAAA,EAAoB,GAAA,CAAI,qBAAqB,CAAC,CAAA;AAAA,IACtE,CAAA;AAAA,IAEA,MAAM,aAAa,MAAA,EAAQ;AACzB,MAAA,MAAM,IAAA,GAAO,KAAK,UAAA,EAAW;AAC7B,MAAA,IAAI,IAAA;AACF,QAAA,OAAO,IAAA,CAAK,aAAa,MAAM,CAAA;AACjC,MAAA,IAAI,CAAC,KAAK,aAAA,EAAc;AACtB,QAAA,OAAO,KAAK,oBAAA,EAAqB;AACnC,MAAA,OAAO,GAAA,CAAI,UAAA,CAAW,kBAAA,EAAoB,GAAA,CAAI,qBAAqB,CAAC,CAAA;AAAA,IACtE,CAAA;AAAA,IAEA,MAAM,eAAA,CAAgB,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS;AACjD,MAAA,MAAM,IAAA,GAAO,KAAK,UAAA,EAAW;AAC7B,MAAA,IAAI,IAAA;AACF,QAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,SAAA,EAAW,OAAA,EAAS,OAAO,CAAA;AACzD,MAAA,IAAI,CAAC,KAAK,aAAA,EAAc;AACtB,QAAA,OAAO,KAAK,oBAAA,EAAqB;AACnC,MAAA,OAAO,sBAAA,CAAuB,SAAA,EAAW,OAAA,EAAS,OAAO,CAAA;AAAA,IAC3D;AAAA,GACF;AACF;AC9RA,IAAM,uBAAA,GAA0B,wBAAA;AAQhC,gBAAuB,gBAAgB,MAAA,EAAsD;AAC3F,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,WAAA,MAAiB,QAAQ,MAAA,EAAQ;AAC/B,IAAA,MAAA,IAAU,IAAA;AACV,IAAA,IAAI,KAAA,GAAQ,uBAAA,CAAwB,IAAA,CAAK,MAAM,CAAA;AAC/C,IAAA,OAAO,UAAU,IAAA,EAAM;AACrB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AACnC,MAAA,MAAM,WAAW,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AAC3C,MAAA,MAAA,GAAS,MAAA,CAAO,MAAM,GAAG,CAAA;AACzB,MAAA,IAAI,QAAA;AACF,QAAA,MAAM,QAAA;AACR,MAAA,KAAA,GAAQ,uBAAA,CAAwB,KAAK,MAAM,CAAA;AAAA,IAC7C;AAAA,EACF;AACA,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAK;AACzB,EAAA,IAAI,IAAA;AACF,IAAA,MAAM,IAAA;AACV;AAKO,SAAS,SAAS,IAAA,EAA0B;AACjD,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,QAAQ,CAAA;AAC5C;AAGO,SAAS,WAAW,MAAA,EAA4B;AACrD,EAAA,OAAO,IAAI,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAC,CAAA;AACrD;AAGO,SAAS,aAAa,MAAA,EAAkC;AAC7D,EAAA,OAAO,IAAI,UAAA,CAAW,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACtE;AAGO,SAAS,aAAa,KAAA,EAAwB;AACnD,EAAA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC9D;AAOO,SAAS,UAAA,CAAW,GAAA,EAAkB,OAAA,EAAiB,KAAA,EAA2B;AACvF,EAAA,OAAOC,IAAAA,CAAK,KAAA,CAAM,iBAAA,CAAkB,GAAA,EAAK,SAAS,KAAK,CAAA;AACzD;AAUO,SAAS,gBAAgB,MAAA,EAAgC;AAC9D,EAAA,MAAM,SAAS,MAAA,EAAQ,MAAA;AACvB,EAAA,IAAI,QAAQ,IAAA,KAAS,cAAA;AACnB,IAAA,OAAO,UAAA,CAAW,UAAA,CAAW,aAAA,EAAe,GAAA,CAAI,iBAAiB,CAAC,CAAA;AACpE,EAAA,OAAO,UAAA,CAAW,UAAA,CAAW,eAAA,EAAiB,GAAA,CAAI,mBAAmB,CAAC,CAAA;AACxE;AAWO,SAAS,cAAA,CAAe,OAAgB,MAAA,EAAgC;AAC7E,EAAA,MAAM,KAAA,GAAQ,KAAA;AACd,EAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,YAAY,KAAA,CAAM,IAAA,CAAK,WAAW,SAAS,CAAA;AACnE,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,YAAA,IAAgB,KAAA,CAAM,IAAA,KAAS,cAAA;AAChD,IAAA,OAAO,gBAAgB,MAAM,CAAA;AAC/B,EAAA,OAAO,UAAA,CAAW,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,aAAa,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AACpI;AAOO,SAAS,kBAAA,CAAsB,OAAgB,MAAA,EAAoC;AACxF,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAO,cAAA,CAAe,KAAA,EAAO,MAAM,CAAA,EAAE;AAChE;AAwBA,IAAMC,OAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,CAAA;AAU7D,SAAS,kBAAA,CACd,GAAA,EACA,OAAA,EACA,OAAA,EAC4B;AAC5B,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,EAAA,GAAK,IAAI,SAAA,CAAU,GAAA,EAAK,EAAE,SAAS,gBAAA,EAAkB,OAAA,EAAS,OAAA,IAAW,IAAA,EAAO,CAAA;AACtF,IAAA,EAAA,CAAG,UAAA,GAAa,aAAA;AAGhB,IAAA,MAAM,QAA0B,EAAC;AACjC,IAAA,IAAI,OAAA,GAAqE,IAAA;AACzE,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,OAAA,GAAwB,IAAA;AAE5B,IAAA,MAAM,gBAAgB,MAAY;AAChC,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,KAAA,EAAM;AAAA,MACX,CAAA,CAAA,MACM;AAAA,MAAW;AAAA,IACnB,CAAA;AAEA,IAAA,SAAS,YAAA,GAAqB;AAC5B,MAAA,IAAI,MAAA;AACF,QAAA;AACF,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,IAAI,OAAA,EAAS,MAAA;AACX,QAAA,OAAA,CAAQ,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,aAAa,CAAA;AAC3D,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,CAAA,GAAI,OAAA;AACV,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,CAAA,CAAE,EAAE,KAAA,EAAO,MAAA,EAAW,IAAA,EAAM,MAAM,CAAA;AAAA,MACpC;AAAA,IACF;AAEA,IAAA,SAAS,YAAY,GAAA,EAA2B;AAC9C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,CAAA,GAAI,OAAA;AACV,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,CAAA,CAAE,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,OAAO,CAAA;AAAA,MAC/B,CAAA,MACK;AACH,QAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,EAAA,CAAG,EAAA,CAAG,SAAA,EAAW,CAAC,IAAA,EAA4B,QAAA,KAAsB;AAClE,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,GAAA,GAAM,OAAO,QAAA,CAAS,IAAI,IAAI,IAAA,GAAO,MAAA,CAAO,KAAK,IAAmB,CAAA;AAC1E,QAAA,WAAA,CAAY,EAAE,UAAU,IAAA,EAAM,MAAA,EAAQ,IAAI,UAAA,CAAW,GAAG,GAAG,CAAA;AAAA,MAC7D,CAAA,MACK;AACH,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,IAAI,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,IAAmB,CAAA,CAAE,SAAS,MAAM,CAAA;AAC7G,QAAA,WAAA,CAAY,EAAE,QAAA,EAAU,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,MACvC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,EAAA,CAAG,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAiB;AAE/B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,YAAA,EAAa;AACb,QAAA,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,4BAA4B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAM,OAAA,EAAQ,EAAG,CAAA,EAAG,KAAK,CAAC,CAAA;AACnI,QAAA;AAAA,MACF;AACA,MAAA,OAAA,GAAU,KAAA;AACV,MAAAC,QAAO,KAAA,CAAM,uBAAA,EAAyB,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAC9D,MAAA,YAAA,EAAa;AAAA,IACf,CAAC,CAAA;AAED,IAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM;AACnB,MAAA,YAAA,EAAa;AAAA,IACf,CAAC,CAAA;AAED,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,IAAI,QAAQ,MAAA,CAAO,OAAA;AACjB,QAAA,aAAA,EAAc;AAAA;AAEd,QAAA,OAAA,CAAQ,OAAO,gBAAA,CAAiB,OAAA,EAAS,eAAe,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IAC1E;AAEA,IAAA,EAAA,CAAG,EAAA,CAAG,QAAQ,MAAM;AAClB,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,MAAM,UAAA,GAAgC;AAAA,QACpC,KAAK,IAAA,EAAM;AACT,UAAA,EAAA,CAAG,KAAK,IAAI,CAAA;AAAA,QACd,CAAA;AAAA,QACA,OAAO,QAAA,GAAW;AAChB,UAAA,OAAO,IAAA,EAAM;AACX,YAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,cAAA,MAAM,MAAM,KAAA,EAAM;AAClB,cAAA;AAAA,YACF;AACA,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,IAAI,OAAA;AACF,gBAAA,MAAM,eAAA,CAAgB,SAAS,MAAM,CAAA;AACvC,cAAA,IAAI,OAAA;AACF,gBAAA,MAAM,UAAA,CAAW,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,4BAA4B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAA,EAAQ,EAAG,GAAG,OAAO,CAAA;AACvI,cAAA;AAAA,YACF;AACA,YAAA,MAAM,IAAA,GAAO,MAAM,IAAI,OAAA,CAAwC,CAAC,GAAA,KAAQ;AACtE,cAAA,OAAA,GAAU,GAAA;AAAA,YACZ,CAAC,CAAA;AACD,YAAA,IAAI,KAAK,IAAA,EAAM;AACb,cAAA,IAAI,OAAA;AACF,gBAAA,MAAM,eAAA,CAAgB,SAAS,MAAM,CAAA;AACvC,cAAA,IAAI,OAAA;AACF,gBAAA,MAAM,UAAA,CAAW,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,4BAA4B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAA,EAAQ,EAAG,GAAG,OAAO,CAAA;AACvI,cAAA;AAAA,YACF;AACA,YAAA,MAAM,IAAA,CAAK,KAAA;AAAA,UACb;AAAA,QACF,CAAA;AAAA,QACA,KAAA,GAAQ;AACN,UAAA,IAAI;AACF,YAAA,EAAA,CAAG,KAAA,EAAM;AAAA,UACX,CAAA,CAAA,MACM;AAAA,UAAW;AAAA,QACnB;AAAA,OACF;AACA,MAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,IACpB,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;;;ACzWA,IAAMA,OAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,cAAA,EAAgB,CAAA;AAGxE,IAAM,mBAAA,GAA8C;AAAA,EAClD,UAAA,EAAY,EAAE,SAAA,EAAW,IAAA,EAAM,oBAAoB,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAO,yBAAA,EAA2B,IAAA,EAAK;AAAA,EACtH,YAAY,EAAE,SAAA,EAAW,MAAM,oBAAA,EAAsB,IAAA,EAAM,sBAAsB,IAAA;AACnF,CAAA;AAIA,IAAM,gBAAA,GAAmB,CAAA;AACzB,IAAM,WAAA,GAAc,CAAA;AAGpB,IAAM,eAAA,GAAkB,CAAA;AACxB,IAAM,qBAAA,GAAwB,CAAA;AAC9B,IAAM,eAAA,GAAkB,CAAA;AACxB,IAAM,qBAAA,GAAwB,EAAA;AAC9B,IAAM,gBAAA,GAAmB,EAAA;AAGzB,IAAM,WAAA,GAAc,CAAA;AACpB,IAAM,gBAAA,GAAmB,CAAA;AACzB,IAAM,eAAA,GAAkB,CAAA;AAGxB,IAAM,WAAA,GAAc,CAAA;AACpB,IAAM,WAAA,GAAc,CAAA;AAGpB,IAAM,aAAA,GAAgB,CAAA;AACtB,IAAM,aAAA,GAAgB,CAAA;AAGtB,IAAM,sBAAA,GAAyB,CAAA;AAC/B,IAAM,uBAAA,GAA0B,CAAA;AAChC,IAAM,wBAAA,GAA2B,EAAA;AACjC,IAAM,uBAAA,GAA0B,EAAA;AAChC,IAAM,mBAAA,GAAsB,GAAA;AAC5B,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,sBAAA,GAAyB,GAAA;AAC/B,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,kBAAA,GAAqB,GAAA;AAG3B,IAAM,iBAAA,uBAAwB,GAAA,CAAY;AAAA,EACxC,sBAAA;AAAA,EACA,uBAAA;AAAA,EACA,wBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAM,aAAA,GAA6C;AAAA,EACjD,KAAA,EAAO,KAAA;AAAA,EACP,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAKA,SAAS,WAAA,CAAY,WAAA,EAAqB,KAAA,EAAe,aAAA,EAAuB,WAAA,EAA6B;AAC3G,EAAA,OAAOE,OAAO,IAAA,CAAK;AAAA,IAChB,oBAAoB,CAAA,GAAK,WAAA;AAAA,IACzB,eAAe,CAAA,GAAK,KAAA;AAAA,IACpB,iBAAiB,CAAA,GAAK,WAAA;AAAA,IACvB;AAAA,GACD,CAAA;AACH;AAGA,SAAS,SAAS,KAAA,EAAuB;AACvC,EAAA,MAAM,CAAA,GAAIA,MAAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AACxB,EAAA,CAAA,CAAE,aAAA,CAAc,KAAA,KAAU,CAAA,EAAG,CAAC,CAAA;AAC9B,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,QAAQ,KAAA,EAAuB;AACtC,EAAA,MAAM,CAAA,GAAIA,MAAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AACxB,EAAA,CAAA,CAAE,YAAA,CAAa,OAAO,CAAC,CAAA;AACvB,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,gBAAgB,MAAA,EAA4B;AACnD,EAAA,MAAM,UAAUA,MAAAA,CAAO,IAAA,CAAK,KAAK,SAAA,CAAU,MAAM,GAAG,MAAM,CAAA;AAC1D,EAAA,OAAO,IAAI,UAAA,CAAWA,MAAAA,CAAO,MAAA,CAAO;AAAA,IAClC,WAAA,CAAY,eAAA,EAAiB,WAAA,EAAa,WAAA,EAAa,aAAa,CAAA;AAAA,IACpE,QAAA,CAAS,QAAQ,MAAM,CAAA;AAAA,IACvB;AAAA,GACD,CAAC,CAAA;AACJ;AAGA,SAAS,cAAA,CAAe,OAAmB,IAAA,EAA2B;AACpE,EAAA,OAAO,IAAI,UAAA,CAAWA,MAAAA,CAAO,MAAA,CAAO;AAAA,IAClC,YAAY,qBAAA,EAAuB,IAAA,GAAO,gBAAA,GAAmB,WAAA,EAAa,aAAa,aAAa,CAAA;AAAA,IACpG,QAAA,CAAS,MAAM,MAAM,CAAA;AAAA,IACrBA,MAAAA,CAAO,KAAK,KAAK;AAAA,GAClB,CAAC,CAAA;AACJ;AAGA,SAAS,cAAA,CAAe,KAAA,EAAe,OAAA,EAAiB,SAAA,EAAgC;AACtF,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,WAAA,CAAY,eAAA,EAAiB,eAAA,EAAiB,WAAA,EAAa,aAAa,CAAA;AAAA,IACxE,QAAQ,KAAK;AAAA,GACf;AACA,EAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,IAAK,cAAc,MAAA,EAAW;AAC5D,IAAA,MAAM,GAAA,GAAMA,MAAAA,CAAO,IAAA,CAAK,SAAA,EAAW,MAAM,CAAA;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,GAAG,GAAG,CAAA;AAAA,EACtC;AACA,EAAA,MAAM,OAAOA,MAAAA,CAAO,IAAA,CAAK,KAAK,SAAA,CAAU,OAAO,GAAG,MAAM,CAAA;AACxD,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,GAAG,IAAI,CAAA;AACtC,EAAA,OAAO,IAAI,UAAA,CAAWA,MAAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAC5C;AAoBA,SAAS,WAAA,CAAY,SAAiB,WAAA,EAA6B;AACjE,EAAA,OAAO,WAAA,KAAgB,aAAA,GAAgB,UAAA,CAAW,OAAO,CAAA,GAAI,OAAA;AAC/D;AAGA,SAAS,YAAY,IAAA,EAAgC;AACnD,EAAA,MAAM,GAAA,GAAMA,MAAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC5B,EAAA,MAAM,WAAA,GAAe,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,GAAK,EAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA;AACvB,EAAA,MAAM,aAAA,GAAiB,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,GAAK,EAAA;AACtC,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA;AAC7B,EAAA,IAAI,MAAA,GAAS,CAAA;AAEb,EAAA,IAAI,gBAAgB,gBAAA,EAAkB;AACpC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,YAAA,CAAa,MAAM,CAAA;AACzC,IAAA,MAAA,IAAU,CAAA;AACV,IAAA,MAAMC,KAAAA,GAAO,GAAA,CAAI,YAAA,CAAa,MAAM,CAAA;AACpC,IAAA,MAAA,IAAU,CAAA;AACV,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ,MAAA,GAASA,KAAI,CAAA,EAAG,WAAW,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA;AACzF,IAAA,OAAO,EAAE,WAAA,EAAa,SAAA,EAAW,YAAA,EAAc,GAAA,EAAI;AAAA,EACrD;AAEA,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,IAAA,KAAA,GAAQ,GAAA,CAAI,YAAY,MAAM,CAAA;AAC9B,IAAA,MAAA,IAAU,CAAA;AAEV,IAAA,IAAI,UAAU,MAAA,IAAa,CAAC,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACxD,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,YAAA,CAAa,MAAM,CAAA;AACvC,MAAA,MAAA,IAAU,CAAA,GAAI,OAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,EAAE,KAAA,GAAQ,eAAA,CAAA,IAAoB,WAAA,KAAgB,eAAA,EAAiB;AAEjE,IAAA,QAAA,GAAW,GAAA,CAAI,YAAY,MAAM,CAAA;AACjC,IAAA,MAAA,IAAU,CAAA;AAAA,EACZ;AAEA,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,YAAA,CAAa,MAAM,CAAA;AACpC,EAAA,MAAA,IAAU,CAAA;AACV,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,QAAA,CAAS,MAAA,EAAQ,SAAS,IAAI,CAAA;AAElD,EAAA,IAAI,WAAA,KAAgB,qBAAA;AAClB,IAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,OAAO,IAAI,UAAA,CAAW,OAAO,CAAA,EAAE;AAE9D,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,OAAA,EAAS,WAAW,CAAA;AACrD,EAAA,IAAI,kBAAkB,WAAA,EAAa;AACjC,IAAA,IAAI;AACF,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,QAAA,CAAS,MAAM,CAAC,CAAA,EAA6B;AAAA,IACpH,CAAA,CAAA,MACM;AACJ,MAAA,OAAO,EAAE,WAAA,EAAa,KAAA,EAAO,QAAA,EAAS;AAAA,IACxC;AAAA,EACF;AACA,EAAA,OAAO,EAAE,aAAa,KAAA,EAAO,QAAA,EAAU,OAAO,IAAI,UAAA,CAAW,YAAY,CAAA,EAAE;AAC7E;AASO,SAAS,yBAAA,GAA2C;AACzD,EAAA,SAAS,gBAAA,CAAiB,OAA2B,KAAA,EAAwC;AAC3F,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,qBAAqB,KAAA,CAAM,UAAA;AAAA,MAC3B,kBAAA,EAAoB,UAAA,CAAW,MAAA,CAAO,UAAA;AAAW,KACnD;AACA,IAAA,IAAI,KAAA,CAAM,MAAA;AACR,MAAA,OAAA,CAAQ,WAAW,IAAI,KAAA,CAAM,MAAA;AAE/B,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,IAAU,MAAM,SAAA,EAAW;AAC7C,MAAA,OAAA,CAAQ,eAAe,IAAI,KAAA,CAAM,MAAA;AACjC,MAAA,OAAA,CAAQ,kBAAkB,IAAI,KAAA,CAAM,SAAA;AAAA,IACtC;AACA,IAAA,OAAA,CAAQ,kBAAkB,CAAA,GAAI,UAAA,CAAW,MAAA,CAAO,UAAA,EAAW;AAC3D,IAAA,OAAO,OAAA;AAAA,EACT;AAIA,EAAA,eAAe,WAAW,OAAA,EAAgF;AACxG,IAAA,IAAI;AACF,MAAA,IAAI,SAAA,GAAY,EAAA;AAChB,MAAA,WAAA,MAAiB,SAAS,gBAAA,CAAiB,EAAE,OAAO,OAAA,CAAQ,KAAA,EAAO,OAAO,OAAA,CAAQ,KAAA,EAAO,UAAU,OAAA,CAAQ,QAAA,EAAU,cAAc,OAAA,CAAQ,YAAA,EAAc,QAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA,EAAG;AAClL,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,YAAA,IAAgB,KAAA,CAAM,KAAA;AACvC,UAAA,SAAA,GAAY,KAAA,CAAM,IAAA;AAAA,MACtB;AACA,MAAA,OAAOC,EAAAA,CAAG,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,IAC/B,SACO,KAAA,EAAO;AACZ,MAAAH,OAAAA,CAAO,MAAM,0BAAA,EAA4B,EAAE,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AACvE,MAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,gBAAgB,iBAAiB,OAAA,EAAgF;AAC/G,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,YAAA,EAAc,QAAO,GAAI,OAAA;AACzD,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,qBAAA,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,GAAA,EAAK,gBAAA,CAAiB,KAAA,EAAO,KAAK,CAAA,EAAG,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AAC7G,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,UAAA,IAAc,IAAA;AACvC,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,CAAA;AACnC,MAAA,IAAA,CAAK,KAAK,eAAA,CAAgB;AAAA,QACxB,IAAA,EAAM,EAAE,GAAA,EAAK,KAAA,EAAM;AAAA,QACnB,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA;AAAA,UAClC,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,EAAA;AAAA,UACN,OAAA,EAAS,QAAA;AAAA,UACT,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa;AAAC,SACjC;AAAA,QACA,OAAA,EAAS;AAAA,UACP,UAAA,EAAY,UAAA;AAAA,UACZ,UAAA,EAAY,IAAA;AAAA,UACZ,WAAA,EAAa,IAAA;AAAA,UACb,WAAA,EAAa,MAAA;AAAA;AAAA,UAEb,GAAI,YAAA,EAAc,MAAA,GAAS,EAAE,OAAA,EAAS,IAAA,CAAK,UAAU,EAAE,QAAA,EAAU,aAAa,GAAA,CAAI,CAAA,IAAA,MAAS,EAAE,IAAA,EAAK,CAAE,GAAG,CAAA,KAAM;AAAC;AAChH,OACD,CAAC,CAAA;AAEF,MAAA,MAAM,aAAa,YAAY;AAC7B,QAAA,IAAI,YAAY,KAAA,EAAO;AAErB,UAAA,IAAI,IAAA;AACJ,UAAA,WAAA,MAAiB,IAAA,IAAQ,MAAM,MAAA,EAAQ;AACrC,YAAA,IAAI,IAAA,KAAS,KAAA,CAAA;AACX,cAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,KAAK,CAAC,CAAA;AACvC,YAAA,IAAA,GAAO,IAAA;AAAA,UACT;AACA,UAAA,IAAA,CAAK,IAAA,CAAK,eAAe,IAAA,IAAQ,IAAI,WAAW,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,QAC3D,CAAA,MACK;AACH,UAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,QAC5C;AAAA,MACF,CAAA,GAAG;AACH,MAAA,IAAI,SAAA;AACJ,MAAA,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,KAAe;AAC9B,QAAA,SAAA,GAAY,CAAA;AAAA,MACd,CAAC,CAAA;AAED,MAAA,WAAA,MAAiB,OAAA,IAAW,IAAA,CAAK,QAAA,EAAS,EAAG;AAC3C,QAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,IAAY,CAAC,OAAA,CAAQ,MAAA;AAChC,UAAA;AACF,QAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAA;AACxC,QAAA,IAAI,MAAM,WAAA,KAAgB,gBAAA;AACxB,UAAA,MAAM,UAAA,CAAW,WAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,EAAG,MAAM,SAAS,CAAA,CAAA,EAAI,MAAM,YAAA,IAAgB,EAAE,GAAG,IAAA,EAAK,EAAE,EAAG,CAAC,CAAA;AAEhK,QAAA,MAAM,IAAA,GAAO,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA;AACtC,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,KAAa,KAAA,CAAA,IAAa,MAAM,QAAA,GAAW,CAAA;AAChE,QAAA,IAAI,IAAA,KAAS,KAAA,CAAA;AACX,UAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,OAAO,MAAA,EAAO;AAClD,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,IAAI,SAAA;AACF,YAAA,MAAM,SAAA;AACR,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,SAAA;AACF,QAAA,MAAM,SAAA;AAAA,IACV,CAAA,SACA;AACE,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAIA,EAAA,eAAe,WAAW,OAAA,EAAwE;AAChG,IAAA,MAAM,GAAA,GAAM,uBAAuB,EAAE,MAAA,EAAQ,QAAQ,MAAA,EAAQ,UAAA,EAAY,OAAA,CAAQ,UAAA,EAAY,CAAA;AAC7F,IAAA,IAAI;AACF,MAAA,MAAM,SAAuB,EAAC;AAC9B,MAAA,WAAA,MAAiB,KAAA,IAAS,iBAAiB,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAA,EAAM,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,IAAI,MAAA,EAAQ,UAAA,EAAY,QAAQ,UAAA,EAAY,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AACvL,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACnB,MAAA,OAAOG,EAAAA,CAAG,EAAE,IAAA,EAAM,YAAA,CAAa,MAAM,CAAA,EAAG,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,YAAY,GAAA,CAAI,UAAA,EAAY,QAAA,EAAU,GAAA,CAAI,UAAU,CAAA;AAAA,IAClH,SACO,KAAA,EAAO;AACZ,MAAAH,OAAAA,CAAO,MAAM,0BAAA,EAA4B,EAAE,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AACvE,MAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,gBAAgB,iBAAiB,OAAA,EAAoE;AACnG,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,OAAO,MAAA,EAAQ,UAAA,EAAY,QAAO,GAAI,OAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA;AACrD,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,uBAAA,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,GAAA,EAAK,gBAAA,CAAiB,KAAA,EAAO,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AAC5G,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,MAAA,CAAO,UAAA,EAAW;AAE/C,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,SAAS,KAAA,IAAS,EAAA;AAAA,MAClB,YAAA,EAAc,EAAE,MAAA,EAAQ,aAAA,CAAc,SAAS,CAAA,EAAG,WAAA,EAAa,cAAc,IAAA;AAAM,KACrF;AAEA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,sBAAA,EAAwB,EAAE,CAAC,CAAA;AACpD,MAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,mBAAA,EAAqB,EAAE,KAAA,EAAO,qBAAqB,UAAA,EAAY,SAAA,EAAU,EAAG,SAAS,CAAC,CAAA;AAE/G,MAAA,MAAM,YAAY,YAAY;AAC5B,QAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,UAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,kBAAA,EAAoB,EAAE,OAAO,kBAAA,EAAoB,UAAA,EAAY,EAAE,GAAG,SAAA,EAAW,IAAA,EAAK,EAAE,EAAG,SAAS,CAAC,CAAA;AAAA,QAC5H,CAAA,MACK;AACH,UAAA,WAAA,MAAiB,IAAA,IAAQ,IAAA;AACvB,YAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,kBAAA,EAAoB,EAAE,OAAO,kBAAA,EAAoB,UAAA,EAAY,EAAE,GAAG,WAAW,IAAA,EAAM,IAAA,EAAK,EAAE,EAAG,SAAS,CAAC,CAAA;AAAA,QACpI;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,eAAe,oBAAA,EAAsB,EAAE,OAAO,oBAAA,EAAqB,EAAG,SAAS,CAAC,CAAA;AAC1F,QAAA,IAAA,CAAK,KAAK,cAAA,CAAe,uBAAA,EAAyB,EAAE,KAAA,EAAO,uBAAA,EAAyB,CAAC,CAAA;AAAA,MACvF,CAAA,GAAG;AACH,MAAA,IAAI,SAAA;AACJ,MAAA,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,KAAe;AAC7B,QAAA,SAAA,GAAY,CAAA;AAAA,MACd,CAAC,CAAA;AAED,MAAA,WAAA,MAAiB,OAAA,IAAW,IAAA,CAAK,QAAA,EAAS,EAAG;AAC3C,QAAA,MAAM,KAAA,GAAQ,oBAAoB,OAAO,CAAA;AACzC,QAAA,IAAI,CAAC,KAAA;AACH,UAAA;AACF,QAAA,IAAI,MAAM,WAAA,KAAgB,gBAAA,IAAoB,MAAM,KAAA,KAAU,oBAAA,IAAwB,MAAM,KAAA,KAAU,uBAAA;AACpG,UAAA,MAAM,UAAA,CAAW,WAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,CAAM,aAAa,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,KAAA,CAAM,YAAA,IAAgB,EAAE,GAAG,IAAA,EAAK,EAAE,EAAG,CAAC,CAAA;AAE/K,QAAA,IAAI,KAAA,CAAM,KAAA,KAAU,kBAAA,IAAsB,KAAA,CAAM,KAAA,EAAO;AACrD,UAAA,MAAM,KAAA,CAAM,KAAA;AAAA,QACd,CAAA,MAAA,IACS,KAAA,CAAM,KAAA,KAAU,sBAAA,EAAwB;AAC/C,UAAA,IAAI,SAAA;AACF,YAAA,MAAM,SAAA;AACR,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,SAAA;AACF,QAAA,MAAM,SAAA;AAAA,IACV,CAAA,SACA;AACE,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,UAAA,EAAY,gBAAA,EAAkB,YAAY,gBAAA,EAAkB,sBAAA,EAAwB,cAAc,mBAAA,EAAoB;AACjI;AAGA,SAAS,uBAAuB,OAAA,EAA6E;AAC3G,EAAA,MAAM,MAAA,GAAsB,QAAQ,MAAA,IAAU,OAAA;AAC9C,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,MAAA,KAAW,OAAA,GAAW,QAAQ,UAAA,IAAc,IAAA,GAAS,MAAA,EAAW,QAAA,EAAU,CAAA,EAAE;AAC3G;AAKA,SAAS,eAAe,IAAA,EAA+D;AACrF,EAAA,IAAI,CAAC,IAAA;AACH,IAAA,OAAO,MAAA;AACT,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,OAAO,MAAA,EAAQ,IAAA;AACjB;AAGA,SAAS,oBAAoB,OAAA,EAAmD;AAC9E,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,IAAY,CAAC,OAAA,CAAQ,MAAA;AAChC,IAAA,OAAO,MAAA;AACT,EAAA,OAAO,WAAA,CAAY,QAAQ,MAAM,CAAA;AACnC;;;ACtZO,SAAS,qBAAA,GAAyC;AAEvD,EAAA,IAAI,OAAA,GAAU,EAAA;AAEd,EAAA,IAAI,gBAAA,GAAmB,EAAA;AAEvB,EAAA,IAAI,SAAA,uBAA8E,GAAA,EAAI;AAEtF,EAAA,IAAI,YAAA,GAA8B,IAAA;AAElC,EAAA,OAAO;AAAA;AAAA,IAEL,QAAQ,KAAA,EAAwD;AAC9D,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAC9B,MAAA,IAAI,CAAC,MAAA;AACH,QAAA,OAAO,IAAA;AAET,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,OAAA,IAAW,KAAA,CAAM,OAAA;AAAA,MACnB;AAEA,MAAA,MAAM,cAAA,GAAiB,uBAAuB,KAAA,IAAS,OAAO,MAAM,iBAAA,KAAsB,QAAA,GACtF,MAAM,iBAAA,GACN,EAAA;AACJ,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,gBAAA,IAAoB,cAAA;AAAA,MACtB;AAEA,MAAA,IAAI,MAAM,UAAA,EAAY;AACpB,QAAA,KAAA,MAAW,EAAA,IAAM,MAAM,UAAA,EAAY;AACjC,UAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA;AACvC,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,IAAI,EAAA,CAAG,UAAU,IAAA,EAAM;AACrB,cAAA,QAAA,CAAS,IAAA,IAAQ,GAAG,QAAA,CAAS,IAAA;AAAA,YAC/B;AACA,YAAA,IAAI,EAAA,CAAG,UAAU,SAAA,EAAW;AAC1B,cAAA,QAAA,CAAS,SAAA,IAAa,GAAG,QAAA,CAAS,SAAA;AAAA,YACpC;AAAA,UACF,CAAA,MAAA,IACS,GAAG,EAAA,EAAI;AACd,YAAA,SAAA,CAAU,GAAA,CAAI,GAAG,KAAA,EAAO;AAAA,cACtB,IAAI,EAAA,CAAG,EAAA;AAAA,cACP,IAAA,EAAM,EAAA,CAAG,QAAA,EAAU,IAAA,IAAQ,EAAA;AAAA,cAC3B,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,SAAA,IAAa;AAAA,aACtC,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,OAAO,aAAA,EAAe;AACxB,QAAA,YAAA,GAAe,MAAA,CAAO,aAAA;AAAA,MACxB;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA;AAAA,IAGA,SAAA,GAA0B;AACxB,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,gBAAA;AAAA,QACA,SAAA,EAAW,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,IAAI,CAAA,EAAA,MAAO;AAAA,UACnD,IAAI,EAAA,CAAG,EAAA;AAAA,UACP,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,MAAM,EAAA,CAAG,IAAA;AAAA,YACT,WAAW,EAAA,CAAG;AAAA;AAChB,SACF,CAAE,CAAA;AAAA,QACF;AAAA,OACF;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,kBAAA,GAAuC;AACrC,MAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,MAAA,MAAM,OAAA,GAA4B;AAAA,QAChC,IAAA,EAAM,WAAA;AAAA,QACN,SAAS,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,OAAO,MAAA,CAAO;AAAA,OACvD;AACA,MAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,QAAA,OAAA,CAAQ,oBAAoB,MAAA,CAAO,gBAAA;AAAA,MACrC;AACA,MAAA,IAAI,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC/B,QAAA,OAAA,CAAQ,aAAa,MAAA,CAAO,SAAA;AAAA,MAC9B;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA;AAAA,IAGA,KAAA,GAAc;AACZ,MAAA,OAAA,GAAU,EAAA;AACV,MAAA,gBAAA,GAAmB,EAAA;AACnB,MAAA,SAAA,uBAAgB,GAAA,EAAI;AACpB,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AAAA,GACF;AACF;AAgBA,eAAsB,cACpB,MAAA,EACuB;AACvB,EAAA,MAAM,YAAY,qBAAA,EAAsB;AACxC,EAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,IAAA,SAAA,CAAU,QAAQ,KAAK,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,UAAU,SAAA,EAAU;AAC7B;AAoBO,SAAS,gBAAA,GAA+B;AAC7C,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,OAAO;AAAA,IACL,CAAE,OAAO,IAAA,EAAkC;AACzC,MAAA,MAAA,IAAU,IAAA;AAEV,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AACjC,MAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,CAAC,KAAK,IAAA,EAAK;AACb,UAAA;AAEF,QAAA,MAAM,QAAkB,EAAC;AACzB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,QAAA,MAAM,YAAsB,EAAC;AAE7B,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,YAAA,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAAA,UACnC,CAAA,MAAA,IACS,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AAC/B,YAAA,KAAA,CAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAAA,UAChC,CAAA,MAAA,IACS,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAClC,YAAA,KAAA,CAAM,KAAA,GAAQ,OAAO,QAAA,CAAS,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,IAAA,EAAK,EAAG,EAAE,CAAA;AAAA,UACxD,CAAA,MAAA,IACS,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AACjC,YAAA,SAAA,CAAU,KAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,UACrC,CAAA,MAAA,IACS,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AACjC,YAAA,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,UAC9B;AAAA,QACF;AAEA,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,KAAA,CAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,QAClC;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IAEA,KAAA,GAAc;AACZ,MAAA,MAAA,GAAS,EAAA;AAAA,IACX;AAAA,GACF;AACF;AAgBO,SAAS,UAAU,KAAA,EAAyB;AACjD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,EACpC;AACA,EAAA,IAAI,MAAM,EAAA,EAAI;AACZ,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,KAAA,CAAM,EAAE,CAAA,CAAE,CAAA;AAAA,EAC9B;AACA,EAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAU,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,EACpC;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACvC,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE,CAAA;AAAA,IAC5B;AAAA,EACF;AACA,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;;AAAA,CAAA;AAC5B;;;ACrOA,IAAMA,OAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,YAAA,EAAc,CAAA;AAGtE,IAAM,iBAAA,GAA4C;AAAA,EAChD,UAAA,EAAY,EAAE,SAAA,EAAW,IAAA,EAAM,oBAAoB,KAAA,EAAO,oBAAA,EAAsB,KAAA,EAAO,yBAAA,EAA2B,IAAA,EAAK;AAAA,EACvH,YAAY,EAAE,SAAA,EAAW,MAAM,oBAAA,EAAsB,KAAA,EAAO,sBAAsB,IAAA;AACpF,CAAA;AAGA,IAAM,aAAA,GAAsD;AAAA,EAC1D,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AAqBO,SAAS,uBAAA,GAAyC;AACvD,EAAA,eAAe,WAAW,OAAA,EAAgF;AACxG,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,OAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,KAAA,CAAM,MAAM,CAAA;AACvC,IAAA,IAAI,CAAC,IAAA;AACH,MAAA,OAAOK,IAAI,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAA,OAAA,EAAU,KAAA,CAAM,MAAM,CAAA,eAAA,CAAA,EAAkB,EAAG,CAAC,CAAA;AAEnK,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,MAAM,MAAA,EAAQ;AAAA,QAC3D,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAC,EAAE,IAAA,EAAM,aAAA,EAAe,WAAA,EAAa,EAAE,MAAM,CAAA,KAAA,EAAQ,IAAI,CAAA,QAAA,EAAW,QAAA,CAAS,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,EAAG,EAAG,CAAA,EAAG,CAAA;AAAA,QACrI,WAAA,EAAa,EAAE,QAAA,EAAU,QAAA,IAAY,MAAA;AAAO,OAC9C,EAAG,KAAA,CAAM,OAAA,EAAS,MAAM,CAAA;AACxB,MAAA,IAAI,CAAC,QAAA,CAAS,EAAA;AACZ,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAM,iBAAA,CAAkB,QAAQ,CAAA,EAAE,EAAG,CAAC,CAAA;AAEpI,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,OAAO,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AACpD,MAAA,OAAOD,EAAAA,CAAG,EAAE,IAAA,EAAM,CAAA;AAAA,IACpB,SACO,KAAA,EAAO;AACZ,MAAAH,OAAAA,CAAO,MAAM,wBAAA,EAA0B,EAAE,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AACrE,MAAA,OAAO,kBAAA,CAAmB,OAAO,MAAM,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,gBAAgB,iBAAiB,OAAA,EAAgF;AAC/G,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,OAAA;AAC3C,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,MAAM,UAAA,CAAW,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,4BAA4B,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,uBAAA,EAAwB,EAAG,CAAC,CAAA;AAAA,IACzJ;AACA,IAAA,MAAM,OAAA,GAAU,KAAA;AAChB,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,IAAA;AACH,MAAA,MAAM,WAAW,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAA,OAAA,EAAU,OAAA,CAAQ,MAAM,CAAA,eAAA,CAAA,EAAkB,EAAG,CAAC,CAAA;AAE3K,IAAA,MAAM,WAAW,MAAM,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,MAAM,MAAA,EAAQ;AAAA,MAC3D,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAC,EAAE,IAAA,EAAM,aAAA,EAAe,WAAA,EAAa,EAAE,MAAM,CAAA,KAAA,EAAQ,IAAI,CAAA,QAAA,EAAW,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAG,EAAG,CAAA,EAAG,CAAA;AAAA,MACvI,WAAA,EAAa,EAAE,QAAA,EAAU,QAAA,IAAY,MAAA,EAAO;AAAA,MAC5C,MAAA,EAAQ;AAAA,KACV,EAAG,KAAA,CAAM,OAAA,EAAS,MAAM,CAAA;AACxB,IAAA,IAAI,CAAC,QAAA,CAAS,EAAA;AACZ,MAAA,MAAM,UAAA,CAAW,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAM,iBAAA,CAAkB,QAAQ,CAAA,EAAE,EAAG,CAAC,CAAA;AAE1I,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,WAAA,MAAiB,KAAA,IAAS,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9C,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,CAAC,GAAG,KAAA,EAAO,OAAA;AACzC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAA,IAAQ,KAAA;AACR,QAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,MACjD;AAAA,IACF;AACA,IAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,EAChD;AAEA,EAAA,eAAe,WAAW,OAAA,EAAwE;AAChG,IAAA,MAAM,EAAE,OAAO,IAAA,EAAM,KAAA,EAAO,aAAa,MAAA,EAAQ,UAAA,EAAY,QAAO,GAAI,OAAA;AAExE,IAAA,MAAM,GAAA,GAAMK,uBAAAA,CAAuB,EAAE,MAAA,EAAQ,YAAY,CAAA;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,MAAM,MAAA,EAAQ;AAAA,QAC3D,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,QAAA,EAAU,gBAAA,CAAiB,IAAA,EAAM,WAAW,CAAA;AAAA,QAC5C,KAAA,EAAO,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,GAAI,KAAA,GAAQ,EAAE,KAAA,EAAM,GAAI,EAAC;AAAG,OAC3D,EAAG,KAAA,CAAM,OAAA,EAAS,MAAM,CAAA;AACxB,MAAA,IAAI,CAAC,QAAA,CAAS,EAAA;AACZ,QAAA,OAAOD,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAM,iBAAA,CAAkB,QAAQ,CAAA,EAAE,EAAG,CAAC,CAAA;AAEpI,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,SAAS,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA,EAAG,SAAS,KAAA,EAAO,IAAA;AAClD,MAAA,IAAI,CAAC,MAAA;AACH,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,oBAAA,EAAqB,EAAG,CAAC,CAAA;AAEvH,MAAA,OAAOD,EAAAA,CAAG,EAAE,IAAA,EAAM,UAAA,CAAW,MAAM,CAAA,EAAG,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,YAAY,GAAA,CAAI,UAAA,EAAY,QAAA,EAAU,GAAA,CAAI,UAAU,CAAA;AAAA,IAChH,SACO,KAAA,EAAO;AACZ,MAAAH,OAAAA,CAAO,MAAM,wBAAA,EAA0B,EAAE,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AACrE,MAAA,OAAO,kBAAA,CAAmB,OAAO,MAAM,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,gBAAgB,iBAAiB,OAAA,EAAoE;AACnG,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,OAAO,WAAA,EAAa,MAAA,EAAQ,QAAO,GAAI,OAAA;AAC5D,IAAA,MAAM,SAAA,GAAYK,uBAAAA,CAAuB,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA;AAGrD,IAAA,MAAM,QAAA,GAAW,OAAO,IAAA,KAAS,QAAA,GAAW,CAAC,IAAI,CAAA,GAAI,gBAAgB,IAAI,CAAA;AACzE,IAAA,WAAA,MAAiB,WAAW,QAAA,EAAU;AACpC,MAAA,IAAI,CAAC,OAAA;AACH,QAAA;AACF,MAAA,MAAM,WAAW,MAAM,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,MAAM,MAAA,EAAQ;AAAA,QAC3D,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,QAAA,EAAU,gBAAA,CAAiB,OAAA,EAAS,WAAW,CAAA;AAAA,QAC/C,KAAA,EAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,GAAI,QAAQ,EAAE,KAAA,EAAM,GAAI,EAAC,EAAG;AAAA,QACxD,MAAA,EAAQ;AAAA,OACV,EAAG,KAAA,CAAM,OAAA,EAAS,MAAM,CAAA;AACxB,MAAA,IAAI,CAAC,QAAA,CAAS,EAAA;AACZ,QAAA,MAAM,UAAA,CAAW,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAM,iBAAA,CAAkB,QAAQ,CAAA,EAAE,EAAG,CAAC,CAAA;AAE1I,MAAA,WAAA,MAAiB,KAAA,IAAS,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9C,QAAA,MAAM,SAAS,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA,EAAG,OAAO,KAAA,EAAO,IAAA;AACjD,QAAA,IAAI,MAAA;AACF,UAAA,MAAM,WAAW,MAAM,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,YAAY,gBAAA,EAAkB,UAAA,EAAY,kBAAkB,sBAAA,EAAAA,uBAAAA,EAAwB,cAAc,iBAAA,EAAkB;AAC/H;AAGA,SAASA,wBAAuB,OAAA,EAA6E;AAC3G,EAAA,MAAM,MAAA,GAAsB,OAAA,CAAQ,MAAA,KAAW,KAAA,GAAQ,KAAA,GAAQ,OAAA;AAC/D,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,MAAA,KAAW,OAAA,GAAW,QAAQ,UAAA,IAAc,IAAA,GAAS,MAAA,EAAW,QAAA,EAAU,CAAA,EAAE;AAC3G;AAKA,SAAS,gBAAA,CAAiB,MAAc,WAAA,EAAgE;AACtG,EAAA,MAAM,WAAqD,EAAC;AAC5D,EAAA,IAAI,WAAA;AACF,IAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,aAAa,CAAA;AACtD,EAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,MAAM,CAAA;AAClD,EAAA,OAAO,QAAA;AACT;AAGA,SAAS,QAAA,CAAS,OAAA,EAAiB,MAAA,EAA4B,IAAA,EAA+B,SAAiB,MAAA,EAAyC;AACtJ,EAAA,MAAM,MAAM,CAAA,EAAG,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,iBAAA,CAAA;AACzC,EAAA,MAAM,OAAA,GAAkC,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAC7E,EAAA,IAAI,MAAA;AACF,IAAA,OAAA,CAAQ,aAAA,GAAgB,UAAU,MAAM,CAAA,CAAA;AAC1C,EAAA,OAAO,MAAM,GAAA,EAAK;AAAA,IAChB,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,IACzB,MAAA,EAAQ,aAAA,CAAc,MAAA,EAAQ,OAAO;AAAA,GACtC,CAAA;AACH;AAGA,gBAAgB,WAAW,QAAA,EAA8C;AACvE,EAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,EAAA,IAAI,CAAC,IAAA;AACH,IAAA;AACF,EAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,MAAM,gBAAA,EAAiB;AAC7B,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA;AACF,QAAA;AACF,MAAA,MAAM,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AACnD,MAAA,KAAA,MAAW,KAAA,IAAS,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACpC,QAAA,IAAI,CAAC,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,KAAS,QAAA;AAChC,UAAA;AACF,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,QAC7B,CAAA,CAAA,MACM;AAAA,QAEN;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,SACA;AACE,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAGA,SAAS,aAAA,CAAc,QAAiC,OAAA,EAA8B;AACpF,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA;AACjD,EAAA,OAAO,SAAS,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA,GAAI,aAAA;AAC7D;AAGA,eAAe,kBAAkB,QAAA,EAAqC;AACpE,EAAA,MAAM,OAAO,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACjD,EAAA,OAAO,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,CAAG,IAAA,EAAK;AAC9D;ACxNA,IAAML,OAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,cAAA,EAAgB,CAAA;AAGxE,IAAM,mBAAA,GAA8C;AAAA,EAClD,UAAA,EAAY,EAAE,SAAA,EAAW,IAAA,EAAM,oBAAoB,KAAA,EAAO,oBAAA,EAAsB,KAAA,EAAO,yBAAA,EAA2B,KAAA,EAAM;AAAA,EACxH,YAAY,EAAE,SAAA,EAAW,MAAM,oBAAA,EAAsB,KAAA,EAAO,sBAAsB,IAAA;AACpF,CAAA;AAGA,IAAM,oBAAA,GAA4E;AAAA,EAChF,KAAA,EAAO,KAAA;AAAA,EACP,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAGA,IAAM,sBAAA,GAAsD;AAAA,EAC1D,KAAA,EAAO,WAAA;AAAA,EACP,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAOO,SAAS,yBAAA,GAA2C;AACzD,EAAA,SAAS,YAAA,CAAa,MAAA,EAAgB,OAAA,EAAiB,OAAA,EAAyB;AAC9E,IAAA,OAAO,IAAIO,OAAA,CAAO,EAAE,QAAQ,OAAA,EAAS,OAAA,EAAS,SAAS,CAAA;AAAA,EACzD;AAEA,EAAA,eAAe,WAAW,OAAA,EAAgF;AACxG,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,YAAA,EAAc,QAAO,GAAI,OAAA;AACzD,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA;AACT,MAAA,OAAOF,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAU,QAAA,EAAS,EAAG,CAAC,CAAA;AAE7G,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,YAAA,CAAa,KAAA,CAAM,QAAQ,KAAA,CAAM,OAAA,EAAS,MAAM,OAAO,CAAA;AACtE,MAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,KAAK,CAAA;AACrC,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM,eAAe,MAAA,CAAO;AAAA,QACtD,IAAA;AAAA,QACA,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,QAAA;AAAA,QACA,GAAI,YAAA,EAAc,MAAA,GAAS,EAAE,MAAA,EAAQ,aAAa,IAAA,CAAK,IAAI,CAAA,EAAE,GAAI;AAAC,OACpE,EAAG,EAAE,MAAA,EAAQ,CAAA;AACb,MAAA,OAAOD,EAAAA,CAAG,EAAE,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AAAA,IACjC,SACO,KAAA,EAAO;AACZ,MAAAH,OAAAA,CAAO,MAAM,0BAAA,EAA4B,EAAE,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AACvE,MAAA,OAAO,kBAAA,CAAmB,OAAO,MAAM,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,gBAAgB,iBAAiB,OAAA,EAAgF;AAC/G,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,YAAA,EAAc,QAAO,GAAI,OAAA;AACzD,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA;AACT,MAAA,MAAM,UAAA,CAAW,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAU,QAAA,EAAS,EAAG,CAAC,CAAA;AAGnH,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,MAAM,UAAA;AAAA,QACJ,UAAA,CAAW,uBAAA;AAAA,QACX,GAAA,CAAI,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,UAAU,QAAA,EAAU,MAAA,EAAQ,uBAAA,EAAwB,EAAG;AAAA,OACrG;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,YAAA,CAAa,KAAA,CAAM,QAAQ,KAAA,CAAM,OAAA,EAAS,MAAM,OAAO,CAAA;AACtE,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,KAAK,CAAA;AACrC,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,KAAA,CAAM,eAAe,MAAA,CAAO;AAAA,MACtD,IAAA;AAAA,MACA,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAA;AAAA,MACA,MAAA,EAAQ,IAAA;AAAA,MACR,GAAI,YAAA,EAAc,MAAA,GAAS,EAAE,MAAA,EAAQ,aAAa,IAAA,CAAK,IAAI,CAAA,EAAE,GAAI;AAAC,KACpE,EAAG,EAAE,MAAA,EAAQ,CAAA;AAEb,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,MAAA,IAAI,KAAA,CAAM,SAAS,uBAAA,EAAyB;AAC1C,QAAA,IAAA,IAAQ,KAAA,CAAM,KAAA;AACd,QAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,MACjD,CAAA,MAAA,IACS,KAAA,CAAM,IAAA,KAAS,sBAAA,EAAwB;AAC9C,QAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,KAAA,CAAM,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,eAAe,WAAW,OAAA,EAAwE;AAChG,IAAA,MAAM,EAAE,OAAO,IAAA,EAAM,KAAA,EAAO,aAAa,MAAA,EAAQ,UAAA,EAAY,QAAO,GAAI,OAAA;AACxE,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA;AACT,MAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAU,QAAA,EAAS,EAAG,CAAC,CAAA;AAE7G,IAAA,MAAM,GAAA,GAAMC,uBAAAA,CAAuB,EAAE,MAAA,EAAQ,YAAY,CAAA;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,YAAA,CAAa,KAAA,CAAM,QAAQ,KAAA,CAAM,OAAA,EAAS,MAAM,OAAO,CAAA;AACtE,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,OAAO,MAAA,CAAO;AAAA,QAChD,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,OAAO,KAAA,IAAS,OAAA;AAAA,QAChB,KAAA,EAAO,IAAA;AAAA,QACP,eAAA,EAAiB,oBAAA,CAAqB,GAAA,CAAI,MAAM,CAAA;AAAA,QAChD,GAAI,WAAA,GAAc,EAAE,YAAA,EAAc,WAAA,KAAgB;AAAC,OACrD,EAAG,EAAE,MAAA,EAAQ,CAAA;AACb,MAAA,MAAM,OAAO,IAAI,UAAA,CAAW,MAAM,QAAA,CAAS,aAAa,CAAA;AACxD,MAAA,OAAOF,EAAAA,CAAG,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,UAAA,EAAY,GAAA,CAAI,UAAA,EAAY,QAAA,EAAU,GAAA,CAAI,QAAA,EAAU,CAAA;AAAA,IAC5F,SACO,KAAA,EAAO;AACZ,MAAAH,OAAAA,CAAO,MAAM,0BAAA,EAA4B,EAAE,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AACvE,MAAA,OAAO,kBAAA,CAAmB,OAAO,MAAM,CAAA;AAAA,IACzC;AAAA,EACF;AAEA,EAAA,gBAAgB,iBAAiB,OAAA,EAAoE;AACnG,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,OAAO,WAAA,EAAa,MAAA,EAAQ,QAAO,GAAI,OAAA;AAC5D,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA;AACT,MAAA,MAAM,UAAA,CAAW,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAU,QAAA,EAAS,EAAG,CAAC,CAAA;AAEnH,IAAA,MAAM,SAAA,GAAYK,uBAAAA,CAAuB,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA;AACrD,IAAA,MAAM,SAAS,YAAA,CAAa,KAAA,CAAM,QAAQ,KAAA,CAAM,OAAA,EAAS,MAAM,OAAO,CAAA;AAGtE,IAAA,MAAM,QAAA,GAAW,OAAO,IAAA,KAAS,QAAA,GAAW,CAAC,IAAI,CAAA,GAAI,gBAAgB,IAAI,CAAA;AACzE,IAAA,WAAA,MAAiB,WAAW,QAAA,EAAU;AACpC,MAAA,IAAI,CAAC,OAAA;AACH,QAAA;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,OAAO,MAAA,CAAO;AAAA,QAChD,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,OAAO,KAAA,IAAS,OAAA;AAAA,QAChB,KAAA,EAAO,OAAA;AAAA,QACP,eAAA,EAAiB,qBAAqB,SAAS,CAAA;AAAA,QAC/C,GAAI,WAAA,GAAc,EAAE,YAAA,EAAc,WAAA,KAAgB;AAAC,OACrD,EAAG,EAAE,MAAA,EAAQ,CAAA;AAEb,MAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAI,UAAA,CAAW,MAAM,QAAA,CAAS,aAAa,CAAA;AACjD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,EAAM;AACX,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,UAAA,IAAI,IAAA;AACF,YAAA;AACF,UAAA,IAAI,KAAA;AACF,YAAA,MAAM,KAAA;AAAA,QACV;AAAA,MACF,CAAA,SACA;AACE,QAAA,MAAA,CAAO,WAAA,EAAY;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,YAAY,gBAAA,EAAkB,UAAA,EAAY,kBAAkB,sBAAA,EAAAA,uBAAAA,EAAwB,cAAc,mBAAA,EAAoB;AACjI;AAGA,SAASA,wBAAuB,OAAA,EAA6E;AAC3G,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,KAAA;AACjC,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,MAAA,KAAW,OAAA,GAAW,QAAQ,UAAA,IAAc,IAAA,GAAS,MAAA,EAAW,QAAA,EAAU,CAAA,EAAE;AAC3G;AAGA,eAAe,aAAa,KAAA,EAAkE;AAC5F,EAAA,IAAI,KAAA,CAAM,WAAW,OAAA,EAAS;AAC5B,IAAA,MAAM,GAAA,GAAM,aAAa,KAAA,CAAM,IAAA,EAAM,MAAM,UAAA,IAAc,IAAA,EAAO,KAAA,CAAM,QAAA,IAAY,CAAC,CAAA;AACnF,IAAA,OAAO,MAAA,CAAOJ,MAAAA,CAAO,IAAA,CAAK,GAAG,GAAG,WAAW,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,MAAA,CAAOA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG,sBAAA,CAAuB,KAAA,CAAM,MAAM,CAAC,CAAA;AAC7E;AAGA,SAAS,YAAA,CAAa,GAAA,EAAiB,UAAA,EAAoB,QAAA,EAA8B;AACvF,EAAA,MAAM,aAAA,GAAgB,EAAA;AACtB,EAAA,MAAM,QAAA,GAAY,UAAA,GAAa,QAAA,GAAW,aAAA,GAAiB,CAAA;AAC3D,EAAA,MAAM,UAAA,GAAc,WAAW,aAAA,GAAiB,CAAA;AAChD,EAAA,MAAM,WAAW,GAAA,CAAI,MAAA;AACrB,EAAA,MAAM,MAAA,GAASA,MAAAA,CAAO,KAAA,CAAM,EAAA,GAAK,QAAQ,CAAA;AACzC,EAAA,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AACtB,EAAA,MAAA,CAAO,aAAA,CAAc,EAAA,GAAK,QAAA,EAAU,CAAC,CAAA;AACrC,EAAA,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAC,CAAA;AACtB,EAAA,MAAA,CAAO,KAAA,CAAM,QAAQ,EAAE,CAAA;AACvB,EAAA,MAAA,CAAO,aAAA,CAAc,IAAI,EAAE,CAAA;AAC3B,EAAA,MAAA,CAAO,aAAA,CAAc,GAAG,EAAE,CAAA;AAC1B,EAAA,MAAA,CAAO,aAAA,CAAc,UAAU,EAAE,CAAA;AACjC,EAAA,MAAA,CAAO,aAAA,CAAc,YAAY,EAAE,CAAA;AACnC,EAAA,MAAA,CAAO,aAAA,CAAc,UAAU,EAAE,CAAA;AACjC,EAAA,MAAA,CAAO,aAAA,CAAc,YAAY,EAAE,CAAA;AACnC,EAAA,MAAA,CAAO,aAAA,CAAc,eAAe,EAAE,CAAA;AACtC,EAAA,MAAA,CAAO,KAAA,CAAM,QAAQ,EAAE,CAAA;AACvB,EAAA,MAAA,CAAO,aAAA,CAAc,UAAU,EAAE,CAAA;AACjC,EAAAA,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK,QAAQ,EAAE,CAAA;AAChC,EAAA,OAAO,IAAI,WAAW,MAAM,CAAA;AAC9B;ACrMA,IAAMD,OAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,YAAA,EAAc,CAAA;AAGtE,IAAM,iBAAA,GAA4C;AAAA,EAChD,UAAA,EAAY,EAAE,SAAA,EAAW,IAAA,EAAM,oBAAoB,IAAA,EAAM,oBAAA,EAAsB,IAAA,EAAM,yBAAA,EAA2B,IAAA,EAAK;AAAA,EACrH,YAAY,EAAE,SAAA,EAAW,MAAM,oBAAA,EAAsB,IAAA,EAAM,sBAAsB,IAAA;AACnF,CAAA;AAGA,IAAM,WAAA,GAA2C;AAAA,EAC/C,KAAA,EAAO,KAAA;AAAA,EACP,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAgBO,SAAS,uBAAA,GAAyC;AACvD,EAAA,SAAS,OAAA,CAAQ,OAA2B,MAAA,EAAkD;AAC5F,IAAA,MAAM,GAAA,GAAM,GAAG,KAAA,CAAM,OAAO,UAAU,kBAAA,CAAmB,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AACrE,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,IAAI,KAAA,CAAM,MAAA;AACR,MAAA,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,KAAA,CAAM,MAAM,CAAA,CAAA;AAChD,IAAA,IAAI,KAAA,CAAM,WAAA;AACR,MAAA,OAAA,CAAQ,uBAAuB,IAAI,KAAA,CAAM,WAAA;AAC3C,IAAA,OAAO,kBAAA,CAAmB,KAAK,OAAA,EAAS,EAAE,QAAQ,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AAAA,EAC5E;AAEA,EAAA,SAAS,UAAA,GAAqB;AAC5B,IAAA,OAAO,CAAA,MAAA,EAAS,QAAQ,CAAA,CAAA;AAAA,EAC1B;AAEA,EAAA,eAAe,WAAW,OAAA,EAAgF;AACxG,IAAA,IAAI;AACF,MAAA,IAAI,SAAA,GAAY,EAAA;AAChB,MAAA,WAAA,MAAiB,SAAS,gBAAA,CAAiB,EAAE,OAAO,OAAA,CAAQ,KAAA,EAAO,OAAO,OAAA,CAAQ,KAAA,EAAO,UAAU,OAAA,CAAQ,QAAA,EAAU,cAAc,OAAA,CAAQ,YAAA,EAAc,QAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA,EAAG;AAClL,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,YAAA,IAAgB,KAAA,CAAM,KAAA;AACvC,UAAA,SAAA,GAAY,YAAY,CAAA,EAAG,SAAS,GAAG,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,IAAA;AAAA,MAChE;AACA,MAAA,OAAOI,EAAAA,CAAG,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,IAC/B,SACO,KAAA,EAAO;AACZ,MAAAH,OAAAA,CAAO,MAAM,wBAAA,EAA0B,EAAE,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AACrE,MAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,gBAAgB,iBAAiB,OAAA,EAAgF;AAC/G,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,QAAO,GAAI,OAAA;AAC3C,IAAA,MAAM,gBAAgB,QAAA,IAAY,KAAA;AAClC,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,IAAA,MAAM,aAAa,KAAA,CAAM,UAAA;AAEzB,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA;AACxC,IAAA,IAAI;AAEF,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,SAAA,CAAU;AAAA,QACvB,UAAU,UAAA,EAAW;AAAA,QACrB,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,kBAAA,EAAoB,YAAY,MAAM,CAAA;AAAA,UACtC,aAAa,UAAA,IAAc,IAAA;AAAA,UAC3B,yBAAA,EAA2B,QAAA,GAAW,EAAE,QAAA,KAAa,EAAC;AAAA,UACtD,cAAA,EAAgB,aAAA,GAAgB,EAAE,IAAA,EAAM,cAAa,GAAI;AAAA;AAC3D,OACD,CAAC,CAAA;AAGF,MAAA,MAAM,aAAa,YAAY;AAC7B,QAAA,IAAI,YAAY,KAAA,EAAO;AACrB,UAAA,WAAA,MAAiB,QAAQ,KAAA,CAAM,MAAA;AAC7B,YAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,UAAU,UAAA,EAAW,EAAG,IAAA,EAAM,2BAAA,EAA6B,KAAA,EAAO,QAAA,CAAS,IAAI,CAAA,EAAG,CAAC,CAAA;AAAA,QAClH,CAAA,MACK;AACH,UAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,UAAU,UAAA,EAAW,EAAG,IAAA,EAAM,2BAAA,EAA6B,OAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,EAAG,CAAC,CAAA;AACpH,UAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,YAAW,EAAG,IAAA,EAAM,2BAAA,EAA6B,CAAC,CAAA;AAAA,QACzF;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,YAAW,EAAG,IAAA,EAAM,gBAAA,EAAkB,CAAC,CAAA;AAAA,MAC9E,CAAA,GAAG;AAEH,MAAA,IAAI,SAAA;AACJ,MAAA,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,KAAe;AAC9B,QAAA,SAAA,GAAY,CAAA;AAAA,MACd,CAAC,CAAA;AAED,MAAA,WAAA,MAAiB,OAAA,IAAW,IAAA,CAAK,QAAA,EAAS,EAAG;AAC3C,QAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,CAAC,OAAA,CAAQ,IAAA;AAC/B,UAAA;AACF,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA;AACrC,QAAA,QAAQ,MAAM,IAAA;AAAM,UAClB,KAAK,mCAAA;AACH,YAAA,MAAM,EAAE,MAAM,gBAAA,EAAiB;AAC/B,YAAA;AAAA,UACF,KAAK,mCAAA;AACH,YAAA,MAAM,EAAE,MAAM,gBAAA,EAAiB;AAC/B,YAAA;AAAA,UACF,KAAK,kDAAA,EAAoD;AACvD,YAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,KAAA,CAAM,cAAc,KAAA,CAAM,aAAA,EAAe,QAAQ,KAAA,CAAM,KAAA;AAClF,YAAA,IAAI,IAAA;AACF,cAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,OAAO,KAAA,EAAM;AACjD,YAAA;AAAA,UACF;AAAA,UACA,KAAK,uDAAA,EAAyD;AAC5D,YAAA,MAAM,IAAA,GAAO,MAAM,UAAA,IAAc,KAAA,CAAM,QAAQ,KAAA,CAAM,aAAA,EAAe,UAAA,IAAc,KAAA,CAAM,aAAA,EAAe,IAAA;AACvG,YAAA,IAAI,IAAA;AACF,cAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,OAAO,IAAA,EAAK;AAChD,YAAA;AAAA,UACF;AAAA,UACA,KAAK,kBAAA;AACH,YAAA,IAAI,SAAA;AACF,cAAA,MAAM,SAAA;AACR,YAAA;AAAA;AACJ,MACF;AACA,MAAA,IAAI,SAAA;AACF,QAAA,MAAM,SAAA;AAAA,IACV,CAAA,SACA;AACE,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAEA,EAAA,eAAe,WAAW,OAAA,EAAwE;AAChG,IAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAW,GAAI,OAAA;AAC/B,IAAA,MAAM,GAAA,GAAMK,uBAAAA,CAAuB,EAAE,MAAA,EAAQ,YAAY,CAAA;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,SAAuB,EAAC;AAC9B,MAAA,WAAA,MAAiB,KAAA,IAAS,iBAAiB,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAO,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,OAAA,CAAQ,OAAO,WAAA,EAAa,OAAA,CAAQ,aAAa,MAAA,EAAQ,GAAA,CAAI,QAAQ,UAAA,EAAY,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AACrM,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACnB,MAAA,OAAOF,EAAAA,CAAG,EAAE,IAAA,EAAM,YAAA,CAAa,MAAM,CAAA,EAAG,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,YAAY,GAAA,CAAI,UAAA,EAAY,QAAA,EAAU,GAAA,CAAI,UAAU,CAAA;AAAA,IAClH,SACO,KAAA,EAAO;AACZ,MAAAH,OAAAA,CAAO,MAAM,wBAAA,EAA0B,EAAE,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AACrE,MAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,gBAAgB,iBAAiB,OAAA,EAAoE;AACnG,IAAA,MAAM,EAAE,OAAO,IAAA,EAAM,KAAA,EAAO,aAAa,MAAA,EAAQ,UAAA,EAAY,QAAO,GAAI,OAAA;AACxE,IAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,KAAS,QAAA;AACtC,IAAA,MAAM,SAAA,GAAYK,uBAAAA,CAAuB,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA;AAErD,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA;AACxC,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,SAAA,CAAU;AAAA,QACvB,UAAU,UAAA,EAAW;AAAA,QACrB,IAAA,EAAM,gBAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,OAAO,KAAA,IAAS,QAAA;AAAA;AAAA,UAEhB,IAAA,EAAM,gBAAgB,eAAA,GAAkB,QAAA;AAAA,UACxC,eAAA,EAAiB,YAAY,SAAS,CAAA;AAAA,UACtC,aAAa,UAAA,IAAc,IAAA;AAAA,UAC3B,GAAI,WAAA,GAAc,EAAE,YAAA,EAAc,WAAA,KAAgB;AAAC;AACrD,OACD,CAAC,CAAA;AAEF,MAAA,MAAM,YAAY,YAAY;AAC5B,QAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,UAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,UAAA,EAAW,EAAG,IAAA,EAAM,0BAAA,EAA4B,IAAA,EAAM,CAAC,CAAA;AAC5F,UAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,YAAW,EAAG,IAAA,EAAM,0BAAA,EAA4B,CAAC,CAAA;AAAA,QACxF,CAAA,MACK;AACH,UAAA,WAAA,MAAiB,IAAA,IAAQ,IAAA;AACvB,YAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,UAAA,EAAW,EAAG,IAAA,EAAM,0BAAA,EAA4B,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,QACtG;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,YAAW,EAAG,IAAA,EAAM,gBAAA,EAAkB,CAAC,CAAA;AAAA,MAC9E,CAAA,GAAG;AACH,MAAA,IAAI,SAAA;AACJ,MAAA,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,KAAe;AAC7B,QAAA,SAAA,GAAY,CAAA;AAAA,MACd,CAAC,CAAA;AAED,MAAA,WAAA,MAAiB,OAAA,IAAW,IAAA,CAAK,QAAA,EAAS,EAAG;AAC3C,QAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,CAAC,OAAA,CAAQ,IAAA;AAC/B,UAAA;AACF,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA;AACrC,QAAA,IAAI,KAAA,CAAM,SAAS,sBAAA,EAAwB;AACzC,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,KAAA;AACpC,UAAA,IAAI,MAAA;AACF,YAAA,MAAM,WAAW,MAAM,CAAA;AAAA,QAC3B,CAAA,MAAA,IACS,KAAA,CAAM,IAAA,KAAS,kBAAA,EAAoB;AAC1C,UAAA,IAAI,SAAA;AACF,YAAA,MAAM,SAAA;AACR,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,SAAA;AACF,QAAA,MAAM,SAAA;AAAA,IACV,CAAA,SACA;AACE,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,YAAY,gBAAA,EAAkB,UAAA,EAAY,kBAAkB,sBAAA,EAAAA,uBAAAA,EAAwB,cAAc,iBAAA,EAAkB;AAC/H;AAGA,SAASA,wBAAuB,OAAA,EAA6E;AAC3G,EAAA,MAAM,MAAA,GAAsB,QAAQ,MAAA,IAAU,OAAA;AAC9C,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,MAAA,KAAW,OAAA,GAAW,QAAQ,UAAA,IAAc,IAAA,GAAS,MAAA,EAAW,QAAA,EAAU,CAAA,EAAE;AAC3G;AAGA,SAAS,WAAW,IAAA,EAA+B;AACjD,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MACM;AACJ,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;ACzNA,IAAML,OAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,CAAA;AAQ1D,SAAS,sBAAsB,MAAA,EAAmC;AACvE,EAAA,MAAM,cAA2B,iBAAA,CAAkB,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AAC3E,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsC;AAGhE,EAAA,SAAS,YAAY,IAAA,EAAwC;AAC3D,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AACrC,IAAA,IAAI,MAAA;AACF,MAAA,OAAO,MAAA;AACT,IAAA,MAAM,QAAA,GAAW,eAAe,IAAI,CAAA;AACpC,IAAA,aAAA,CAAc,GAAA,CAAI,MAAM,QAAQ,CAAA;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,SAAS,eAAe,KAAA,EAAsC;AAC5D,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,WAAA,CAAY,aAAA;AAClC,MAAA,OAAO,UAAA,CAAW,UAAA,CAAW,qBAAA,EAAuB,GAAA,CAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,WAAA,CAAY,aAAA,EAAc,EAAG,CAAC,CAAA;AACpI,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,SAAS,kBAAkB,MAAA,EAA8C;AACvE,IAAA,MAAM,OAAA,GAAU,WAAA,CAAY,OAAA,CAAQ,WAAA,CAAY,mBAAmB,CAAA;AACnE,IAAA,OAAO,SAAS,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA,GAAI,OAAA;AAAA,EACvD;AAEA,EAAA,eAAe,WAAW,OAAA,EAAwE;AAChG,IAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,MAAA;AACxB,MAAA,OAAOK,GAAAA,CAAI,UAAA,CAAW,qBAAA,EAAuB,GAAA,CAAI,wBAAA,EAA0B,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,aAAA,EAAc,EAAG,CAAC,CAAA;AACnH,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAC5C,IAAA,IAAI,OAAA;AACF,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,EAAQ;AAE1C,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,WAAA,EAAa,YAAA,EAAc,QAAQ,KAAK,CAAA;AAC3E,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA;AACZ,MAAA,OAAO,QAAA;AACT,IAAAJ,OAAAA,CAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,CAAA;AACjG,IAAA,OAAO,WAAA,CAAY,SAAS,IAAA,CAAK,QAAQ,EAAE,UAAA,CAAW,EAAE,KAAA,EAAO,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,QAAQ,KAAA,EAAO,QAAA,EAAU,QAAQ,QAAA,EAAU,YAAA,EAAc,QAAQ,YAAA,EAAc,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAAA,EAC9L;AAEA,EAAA,gBAAgB,iBAAiB,OAAA,EAAwE;AACvG,IAAA,IAAI,EAAE,QAAA,IAAY,OAAA,CAAQ,UAAU,CAAC,OAAA,CAAQ,MAAM,IAAA,EAAM,MAAA;AACvD,MAAA,MAAM,UAAA,CAAW,UAAA,CAAW,qBAAA,EAAuB,GAAA,CAAI,wBAAA,EAA0B,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,aAAA,EAAc,EAAG,CAAC,CAAA;AACzH,IAAA,IAAI,EAAE,QAAA,IAAY,OAAA,CAAQ,KAAA,CAAA,EAAQ;AAChC,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAC5C,MAAA,IAAI,OAAA;AACF,QAAA,MAAM,OAAA;AAAA,IACV;AAEA,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,WAAA,EAAa,YAAA,EAAc,QAAQ,KAAK,CAAA;AAC3E,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA;AACZ,MAAA,MAAM,QAAA,CAAS,KAAA;AACjB,IAAAA,OAAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,CAAA;AACvG,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,OAAA,CAAQ,MAAM,CAAA;AAC/C,IAAA,IAAI;AACF,MAAA,OAAO,WAAA,CAAY,SAAS,IAAA,CAAK,QAAQ,EAAE,gBAAA,CAAiB,EAAE,OAAO,QAAA,CAAS,IAAA,EAAM,OAAO,OAAA,CAAQ,KAAA,EAAO,UAAU,OAAA,CAAQ,QAAA,EAAU,cAAc,OAAA,CAAQ,YAAA,EAAc,QAAQ,CAAA;AAAA,IACpL,SACO,KAAA,EAAO;AACZ,MAAA,MAAM,cAAA,CAAe,OAAO,MAAM,CAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,eAAe,WAAW,OAAA,EAAgE;AACxF,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA;AACX,MAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,qBAAA,EAAuB,GAAA,CAAI,wBAAA,EAA0B,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,YAAA,EAAa,EAAG,CAAC,CAAA;AAElH,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,WAAA,EAAa,YAAA,EAAc,QAAQ,KAAK,CAAA;AAC3E,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA;AACZ,MAAA,OAAO,QAAA;AACT,IAAAJ,OAAAA,CAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,CAAA;AACjG,IAAA,OAAO,WAAA,CAAY,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA,CAAE,UAAA,CAAW,EAAE,KAAA,EAAO,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAa,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,UAAA,EAAY,OAAA,CAAQ,UAAA,EAAY,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAAA,EAC5O;AAEA,EAAA,gBAAgB,iBAAiB,OAAA,EAAgE;AAC/F,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,WAAA,EAAa,YAAA,EAAc,QAAQ,KAAK,CAAA;AAC3E,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA;AACZ,MAAA,MAAM,QAAA,CAAS,KAAA;AACjB,IAAAA,OAAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,CAAA;AACvG,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,OAAA,CAAQ,MAAM,CAAA;AAC/C,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA;AAEnD,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,sBAAA,CAAuB,EAAE,MAAA,EAAQ,QAAQ,MAAA,EAAQ,UAAA,EAAY,OAAA,CAAQ,UAAA,EAAY,CAAA;AACzG,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,uBAAuB,OAAA,CAAQ,IAAI,IAAI,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAA,CAAQ,IAAA;AAC9F,MAAA,WAAA,MAAiB,WAAW,QAAA,EAAU;AACpC,QAAA,IAAI,CAAC,OAAA,CAAQ,EAAA,IAAM,CAAC,OAAA,CAAQ,IAAA;AAC1B,UAAA,MAAM,UAAA,CAAW,UAAA,CAAW,qBAAA,EAAuB,GAAA,CAAI,wBAAA,EAA0B,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,0BAAA,EAA2B,EAAG,CAAC,CAAA;AACtI,QAAA,MAAM,EAAE,IAAA,EAAM,iBAAA,EAAmB,SAAA,EAAW,OAAA,CAAQ,IAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAQ,UAAA,EAAY,OAAO,UAAA,EAAY,QAAA,EAAU,OAAO,QAAA,EAAS;AAC5J,QAAA,WAAA,MAAiB,IAAA,IAAQ,SAAS,gBAAA,CAAiB,EAAE,OAAO,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,QAAQ,KAAA,EAAO,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAa,MAAA,EAAQ,OAAA,CAAQ,QAAQ,UAAA,EAAY,OAAA,CAAQ,UAAA,EAAY,MAAA,EAAQ,CAAA;AACrN,UAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,OAAA,CAAQ,IAAI,IAAA,EAAK;AACrD,QAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,SAAA,EAAW,QAAQ,EAAA,EAAG;AAAA,MACtD;AAAA,IACF,SACO,KAAA,EAAO;AACZ,MAAA,MAAM,cAAA,CAAe,OAAO,MAAM,CAAA;AAAA,IACpC;AAAA,EACF;AAKA,EAAA,SAAS,gBAAgB,OAAA,EAAsE;AAC7F,IAAA,MAAM,QAAA,GAAW,QAAQ,KAAA,KAAU,OAAA,CAAQ,cAAc,YAAA,GAAe,WAAA,CAAY,kBAAkB,WAAA,CAAY,eAAA,CAAA;AAClH,IAAA,IAAI,CAAC,QAAA;AACH,MAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,qBAAA,EAAuB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAI,OAAA,CAAQ,SAAS,CAAA,CAAA,CAAA,EAAI,EAAG,CAAC,CAAA;AAC5H,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAA,EAAQ,IAAA,CAAK,CAAA,KAAA,KAAS,MAAM,EAAA,KAAO,QAAA,IAAY,KAAA,CAAM,KAAA,KAAU,QAAQ,CAAA;AACjG,IAAA,IAAI,CAAC,KAAA;AACH,MAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,qBAAA,EAAuB,GAAA,CAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,QAAA,EAAS,EAAG,CAAC,CAAA;AAC5G,IAAA,MAAM,aAAgC,KAAA,CAAM,UAAA;AAC5C,IAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3C,MAAA,OAAOA,GAAAA;AAAA,QACL,UAAA,CAAW,uBAAA;AAAA,QACX,IAAI,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,UAAU,KAAA,CAAM,QAAA,EAAU,MAAA,EAAQ,CAAA,MAAA,EAAS,MAAM,EAAE,CAAA,kBAAA,EAAqB,QAAQ,SAAS,CAAA,CAAA,IAAM;AAAA,OAC7I;AAAA,IACF;AACA,IAAA,MAAM,YAAA,GAAe,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA,CAAE,YAAA;AACjD,IAAA,OAAOD,EAAAA,CAAG,OAAA,CAAQ,SAAA,KAAc,YAAA,GAC5B,EAAE,UAAA,EAAY,YAAA,CAAa,UAAA,EAAW,GACtC,EAAE,UAAA,EAAY,YAAA,CAAa,YAAY,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,EAAE,UAAA,EAAY,gBAAA,EAAkB,UAAA,EAAY,kBAAkB,eAAA,EAAgB;AACvF;AAEA,SAAS,uBAAuB,KAAA,EAAsE;AACpG,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,IAAA,IAAQ,SAAS,MAAA,IAAU,KAAA;AACnF;AAEA,gBAAgB,cAAc,OAAA,EAAoE;AAChG,EAAA,MAAM,OAAA;AACR;AAGA,SAAS,eAAe,IAAA,EAAwC;AAC9D,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA;AACH,MAAA,OAAO,yBAAA,EAA0B;AAAA,IACnC,KAAK,MAAA;AACH,MAAA,OAAO,uBAAA,EAAwB;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,uBAAA,EAAwB;AAAA,IACjC,KAAK,QAAA;AACH,MAAA,OAAO,yBAAA,EAA0B;AAAA;AAEvC;ACzKA,IAAMH,OAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,CAAA;AAW7D,SAAS,wBAAA,CACd,MAAA,EACA,KAAA,EACA,OAAA,EACA,cAAA,EACoB;AAIpB,EAAA,SAAS,iBAAiB,eAAA,EAAkC;AAC1D,IAAA,MAAM,UAAA,GAAa,mBAAmB,MAAA,CAAO,gBAAA;AAC7C,IAAA,IAAI,UAAA,GAAa,CAAA;AACf,MAAA,OAAO,UAAA;AACT,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,cAAA,GAAiB,GAAG,CAAA;AAAA,EACxC;AAKA,EAAA,SAAS,aAAA,CACP,QAAA,EACA,SAAA,EACA,cAAA,EACA,aAAA,EACmD;AACnD,IAAA,MAAM,iBAAgC,EAAC;AACvC,IAAA,MAAM,oBAAmC,EAAC;AAE1C,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,cAAA,EAAgB;AAC3C,QAAA,cAAA,CAAe,KAAK,GAAG,CAAA;AAAA,MACzB,CAAA,MACK;AACH,QAAA,iBAAA,CAAkB,KAAK,GAAG,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,KAAA,CAAM,CAAC,aAAa,CAAA;AACxD,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,cAAA,EAAgB,GAAG,SAAS,CAAA;AAC/C,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,gBAAA,CAAiB,MAAM,CAAA;AAEnD,IAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,MAAA;AAAA,QACV,YAAA,EAAc,iBAAA,CAAkB,MAAA,GAAS,SAAA,CAAU;AAAA,OACrD;AAAA,IACF;AAGA,IAAA,IAAI,aAAA,GAAgB,CAAC,GAAG,cAAc,CAAA;AACtC,IAAA,IAAI,MAAA,GAAS,KAAA,CAAM,gBAAA,CAAiB,aAAa,CAAA;AACjD,IAAA,MAAM,UAAyB,EAAC;AAEhC,IAAA,KAAA,IAAS,IAAI,iBAAA,CAAkB,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACtD,MAAA,MAAM,YAAY,KAAA,CAAM,gBAAA,CAAiB,CAAC,iBAAA,CAAkB,CAAC,CAAC,CAAC,CAAA;AAC/D,MAAA,IAAI,SAAS,SAAA,GAAY,SAAA;AACvB,QAAA;AACF,MAAA,OAAA,CAAQ,OAAA,CAAQ,iBAAA,CAAkB,CAAC,CAAC,CAAA;AACpC,MAAA,MAAA,IAAU,SAAA;AAAA,IACZ;AAEA,IAAA,aAAA,GAAgB,CAAC,GAAG,cAAA,EAAgB,GAAG,OAAO,CAAA;AAE9C,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,aAAA;AAAA,MACV,YAAA,EAAc,iBAAA,CAAkB,MAAA,GAAS,OAAA,CAAQ;AAAA,KACnD;AAAA,EACF;AAKA,EAAA,eAAe,WAAA,CAAY,UAAyB,OAAA,EAA+D;AACjH,IAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,MAAA,CAAO,eAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,OAAA,EAAS,SAAS,CAAA;AACrD,IAAA,MAAM,cAAA,GAAiB,SAAS,cAAA,IAAkB,IAAA;AAClD,IAAA,MAAM,aAAA,GAAgB,OAAA,EAAS,aAAA,IAAiB,MAAA,CAAO,aAAA;AAEvD,IAAAC,OAAAA,CAAO,MAAM,qBAAA,EAAuB,EAAE,UAAU,SAAA,EAAW,YAAA,EAAc,QAAA,CAAS,MAAA,EAAQ,CAAA;AAE1F,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,gBAAA,CAAiB,QAAQ,CAAA;AAGtD,MAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,QAAA,OAAOG,EAAAA,CAAG;AAAA,UACR,QAAA,EAAU,CAAC,GAAG,QAAQ,CAAA;AAAA,UACtB,cAAA;AAAA,UACA,gBAAA,EAAkB,cAAA;AAAA,UAClB,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,aAAa,gBAAA,EAAkB;AACjC,QAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAY,YAAA,EAAa,GAAI,aAAA;AAAA,UAC7C,QAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,gBAAA,CAAiB,UAAU,CAAA;AAE1D,QAAAH,QAAO,KAAA,CAAM,sCAAA,EAAwC,EAAE,cAAA,EAAgB,gBAAA,EAAkB,cAAc,CAAA;AACvG,QAAA,OAAOG,EAAAA,CAAG;AAAA,UACR,QAAA,EAAU,UAAA;AAAA,UACV,cAAA;AAAA,UACA,gBAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,MAAMI,eAAAA,GAAiB,iBAAiB,QAAA,CAAS,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,GAAI,EAAC;AACrF,QAAA,MAAMC,UAAAA,GAAY,SAAS,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,QAAA,IAAY,CAAC,cAAc,CAAA;AAC7E,QAAA,MAAM,SAAA,GAAYA,UAAAA,CAAU,KAAA,CAAM,CAAC,aAAa,CAAA;AAChD,QAAA,MAAMC,eAAcD,UAAAA,CAAU,KAAA,CAAM,CAAA,EAAGA,UAAAA,CAAU,SAAS,aAAa,CAAA;AAEvE,QAAA,IAAIC,YAAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,UAAA,OAAON,EAAAA,CAAG;AAAA,YACR,QAAA,EAAU,CAAC,GAAG,QAAQ,CAAA;AAAA,YACtB,cAAA;AAAA,YACA,gBAAA,EAAkB,cAAA;AAAA,YAClB,YAAA,EAAc;AAAA,WACf,CAAA;AAAA,QACH;AAEA,QAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,QAAA,CAASM,cAAa,EAAE,KAAA,EAAO,OAAA,EAAS,YAAA,EAAc,CAAA;AAC1F,QAAA,IAAI,CAAC,aAAA,CAAc,OAAA;AACjB,UAAA,OAAO,aAAA;AAET,QAAA,MAAM,cAAc,aAAA,CAAc,IAAA;AAClC,QAAA,MAAM,cAAA,GAA8B;AAAA,UAClC,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,CAAA;AAAA,EAA2B,WAAW,CAAA;AAAA,SACjD;AAEA,QAAA,MAAM,aAAa,CAAC,GAAGF,eAAAA,EAAgB,cAAA,EAAgB,GAAG,SAAS,CAAA;AACnE,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,gBAAA,CAAiB,UAAU,CAAA;AAE1D,QAAAP,OAAAA,CAAO,MAAM,+BAAA,EAAiC,EAAE,gBAAgB,gBAAA,EAAkB,YAAA,EAAcS,YAAAA,CAAY,MAAA,EAAQ,CAAA;AACpH,QAAA,OAAON,EAAAA,CAAG;AAAA,UACR,QAAA,EAAU,UAAA;AAAA,UACV,cAAA;AAAA,UACA,gBAAA;AAAA,UACA,cAAcM,YAAAA,CAAY,MAAA;AAAA,UAC1B,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,EAAE,QAAA,EAAU,YAAA,EAAc,YAAA,EAAc,eAAc,GAAI,aAAA;AAAA,QAC9D,QAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,gBAAA,CAAiB,YAAY,CAAA;AAExD,MAAA,IAAI,gBAAgB,SAAA,EAAW;AAC7B,QAAA,OAAON,EAAAA,CAAG;AAAA,UACR,QAAA,EAAU,YAAA;AAAA,UACV,cAAA;AAAA,UACA,gBAAA,EAAkB,YAAA;AAAA,UAClB,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,cAAA,GAAiB,iBAAiB,QAAA,CAAS,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,GAAI,EAAC;AACrF,MAAA,MAAM,SAAA,GAAY,SAAS,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,QAAA,IAAY,CAAC,cAAc,CAAA;AAC7E,MAAA,MAAM,iBAAA,GAAoB,SAAA,CAAU,KAAA,CAAM,CAAC,aAAa,CAAA;AACxD,MAAA,MAAM,cAAc,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,SAAA,CAAU,SAAS,aAAa,CAAA;AAEvE,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,QAAA,CAAS,aAAa,EAAE,KAAA,EAAO,OAAA,EAAS,YAAA,EAAc,CAAA;AAC1F,QAAA,IAAI,CAAC,aAAA,CAAc,OAAA;AACjB,UAAA,OAAO,aAAA;AAET,QAAA,MAAM,cAAc,aAAA,CAAc,IAAA;AAClC,QAAA,MAAM,cAAA,GAA8B;AAAA,UAClC,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,CAAA;AAAA,EAA2B,WAAW,CAAA;AAAA,SACjD;AAEA,QAAA,MAAM,aAAa,CAAC,GAAG,cAAA,EAAgB,cAAA,EAAgB,GAAG,iBAAiB,CAAA;AAC3E,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,gBAAA,CAAiB,UAAU,CAAA;AAE1D,QAAAH,OAAAA,CAAO,MAAM,8BAAA,EAAgC,EAAE,gBAAgB,gBAAA,EAAkB,YAAA,EAAc,WAAA,CAAY,MAAA,EAAQ,CAAA;AACnH,QAAA,OAAOG,EAAAA,CAAG;AAAA,UACR,QAAA,EAAU,UAAA;AAAA,UACV,cAAA;AAAA,UACA,gBAAA;AAAA,UACA,cAAc,WAAA,CAAY,MAAA;AAAA,UAC1B,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,OAAOA,EAAAA,CAAG;AAAA,QACR,QAAA,EAAU,YAAA;AAAA,QACV,cAAA;AAAA,QACA,gBAAA,EAAkB,YAAA;AAAA,QAClB,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH,SACO,KAAA,EAAO;AACZ,MAAAH,OAAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,OAAO,CAAA;AACpD,MAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,4BAA4B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,IAC7H;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL;AAAA,GACF;AACF;;;AChOO,SAAS,gBAAgB,KAAA,EAAiC;AAC/D,EAAA,OAAO,KAAK,SAAA,CAAU,CAAC,MAAM,QAAA,EAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AACzD;;;ACcA,IAAMJ,OAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,CAAA;AA4B5D,SAAS,wBACd,cAAA,EACA,QAAA,EACA,WAAA,EACA,YAAA,EACA,cACA,IAAA,EACmB;AAInB,EAAA,SAAS,iBAAiB,eAAA,EAAkC;AAC1D,IAAA,MAAM,UAAA,GAAa,mBAAmB,cAAA,CAAe,gBAAA;AACrD,IAAA,IAAI,UAAA,GAAa,CAAA;AACf,MAAA,OAAO,UAAA;AACT,IAAA,OAAO,cAAA,CAAe,gBAAA,GAAmB,CAAA,GAAI,cAAA,CAAe,gBAAA,GAAmB,IAAA;AAAA,EACjF;AAKA,EAAA,SAAS,YAAA,CACP,OAAA,EACA,eAAA,EACA,gBAAA,EACgB;AAChB,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AAGtB,IAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,IAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,QAAA,EAAU,SAAS,CAAA;AAC7D,IAAA,MAAM,QAAA,GAAW,QAAA,EAAU,QAAA,IAAY,cAAA,CAAe,eAAA;AACtD,IAAA,MAAM,cAAA,GAAiB,UAAU,cAAA,IAAkB,IAAA;AACnD,IAAA,MAAM,aAAA,GAAgB,QAAA,EAAU,aAAA,IAAiB,cAAA,CAAe,aAAA;AAChE,IAAA,MAAM,YAAA,GAAe,UAAU,IAAA,IAAQ,IAAA;AACvC,IAAA,MAAM,eAAe,QAAA,EAAU,YAAA;AAE/B,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,QAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AAIA,IAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAsB;AAGrD,IAAA,SAAS,sBAAA,GAAyB;AAChC,MAAA,OAAO;AAAA,QACL,UAAU,KAAA,EAAO,QAAA;AAAA,QACjB,KAAA,EAAO,QAAQ,MAAA,EAAQ,KAAA;AAAA,QACvB,KAAA,EAAO,QAAQ,MAAA,EAAQ,KAAA;AAAA,QACvB,aAAA,EAAe,QAAQ,MAAA,EAAQ,aAAA;AAAA,QAC/B,IAAA,EAAM,QAAQ,MAAA,EAAQ,IAAA;AAAA,QACtB,SAAA,EAAW,QAAQ,MAAA,EAAQ,SAAA;AAAA,QAC3B,QAAA,EAAU,QAAQ,MAAA,EAAQ;AAAA,OAC5B;AAAA,IACF;AAGA,IAAA,SAAS,oBAAA,CAAqB,aAAqB,KAAA,EAAqB;AACtE,MAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,aAAA,IAAiB,CAAC,IAAA,EAAM,MAAA;AAC3C,QAAA;AACF,MAAA,MAAM,cAAA,GAAgC;AAAA,QACpC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,WAAA,EAAY;AAAA,QACrC,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,KAAA;AAAM,OACtC;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CACf,OAAA,CAAQ,cAAA,EAAgB;AAAA,QACvB,UAAU,KAAA,EAAO,QAAA;AAAA,QACjB,KAAA,EAAO,QAAQ,MAAA,CAAO,KAAA;AAAA,QACtB,KAAA,EAAO,QAAQ,MAAA,CAAO,KAAA;AAAA,QACtB,KAAA,EAAO,QAAQ,MAAA,CAAO,eAAA;AAAA,QACtB,YAAA,EAAc,QAAQ,MAAA,CAAO;AAAA,OAC9B,CAAA,CACA,KAAA,CAAM,CAAC,MAAeC,OAAAA,CAAO,IAAA,CAAK,uBAAA,EAAyB,EAAE,OAAO,CAAA,EAAG,CAAC,CAAA,CACxE,QAAQ,MAAM;AACb,QAAA,kBAAA,CAAmB,OAAO,IAAI,CAAA;AAAA,MAChC,CAAC,CAAA;AACH,MAAA,kBAAA,CAAmB,IAAI,IAAI,CAAA;AAAA,IAC7B;AAIA,IAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,MAAA;AACzC,IAAA,MAAM,QAA4B,EAAC;AAEnC,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAoB;AAE/C,IAAA,SAAS,cAAA,GAAyB;AAChC,MAAA,OAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,IACtE;AAIA,IAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,QAAA;AAE3C,IAAA,IAAI,gBAAA,GAAmB,KAAA;AAEvB,IAAA,MAAM,oBAAuC,EAAC;AAE9C,IAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAwB;AAEtD,IAAA,IAAI,WAAA,GAAsC,IAAA;AAE1C,IAAA,IAAI,aAAA,GAAqC,IAAA;AAEzC,IAAA,IAAI,eAAA,GAAkB,CAAA;AAGtB,IAAA,MAAM,mBAAmB,OAAA,CAAQ,YAAA,KAC3B,eAAA,CAAgB,CAAC,GAAG,IAAA,KAAS,QAAA,IAAY,OAAO,eAAA,CAAgB,CAAC,CAAA,CAAE,OAAA,KAAY,WAC/E,eAAA,CAAgB,CAAC,EAAE,OAAA,GACnB,MAAA,CAAA;AAQN,IAAA,eAAe,iBAAA,GAAqG;AAClH,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,IAAI,WAAA,KAAgB,QAAA;AAClB,UAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,YAAA,EAAc,GAAA,CAAI,gBAAgB,CAAC,CAAA;AAE3D,QAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACnC,UAAA,iBAAA,CAAkB,KAAK,OAAO,CAAA;AAAA,QAChC,CAAC,CAAA;AAAA,MACH,CAAA,MACK;AACH,QAAA,gBAAA,GAAmB,IAAA;AAAA,MACrB;AACA,MAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,MAAA,WAAA,GAAc,KAAA;AACd,MAAA,MAAM,KAAA,GAAQ,eAAA;AACd,MAAA,IAAI,QAAA,GAAW,KAAA;AACf,MAAA,MAAM,UAAU,MAAY;AAC1B,QAAA,IAAI,QAAA;AACF,UAAA;AACF,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,IAAI,WAAA,KAAgB,KAAA;AAClB,UAAA,WAAA,GAAc,IAAA;AAChB,QAAA,IAAI,aAAA,KAAkB,OAAA;AACpB,UAAA,aAAA,GAAgB,IAAA;AAClB,QAAA,MAAM,IAAA,GAAO,kBAAkB,KAAA,EAAM;AACrC,QAAA,IAAI,IAAA;AACF,UAAA,IAAA,EAAK;AAAA;AAEL,UAAA,gBAAA,GAAmB,KAAA;AAAA,MACvB,CAAA;AACA,MAAA,aAAA,GAAgB,OAAA;AAChB,MAAA,OAAOD,GAAG,EAAE,KAAA,EAAO,QAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,CAAA;AAAA,IACpD;AAKA,IAAA,SAASO,cAAAA,CAAc,QAAiC,QAAA,EAAoC;AAC1F,MAAA,OAAO,SAAS,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA,GAAI,QAAA;AAAA,IACxD;AAKA,IAAA,SAAS,kBAAkB,MAAA,EAAsB;AAC/C,MAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA;AAC5C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,iBAAA,CAAkB,OAAO,MAAM,CAAA;AAC/B,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF;AAKA,IAAA,SAAS,eAAe,MAAA,EAAyB;AAC/C,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,MAAM,CAAA;AAC5C,MAAA,OAAO,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,WAAA,IAAe,KAAK,MAAA,KAAW,aAAA;AAAA,IACjE;AAQA,IAAA,SAAS,gBAAA,CAAiB,QAAuB,OAAA,EAA2B;AAC1E,MAAA,IAAI,MAAA,IAAU,CAAC,cAAA,CAAe,MAAM,CAAA;AAClC,QAAA,iBAAA,CAAkB,GAAA,CAAI,QAAQ,OAAO,CAAA;AAAA;AAErC,QAAA,OAAA,EAAQ;AAAA,IACZ;AAEA,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,KAAA;AAAA,MAEA,MAAM,WAAW,OAAA,EAAgD;AAC/D,QAAA,KAAA,CAAM,QAAA,CAAS,KAAK,OAAO,CAAA;AAE3B,QAAA,IAAI,CAAC,YAAA;AACH,UAAA,OAAOP,GAAG,MAAS,CAAA;AAErB,QAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,gBAAA,CAAiB,KAAA,CAAM,QAAQ,CAAA;AAC9D,QAAA,IAAI,aAAA,IAAiB,gBAAA;AACnB,UAAA,OAAOA,GAAG,MAAS,CAAA;AAErB,QAAAH,QAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,aAAA,EAAe,MAAA,EAAQ,kBAAkB,CAAA;AAEpF,QAAA,MAAM,cAAA,GAAiB,MAAM,WAAA,CAAY,WAAA,CAAY,MAAM,QAAA,EAAU;AAAA,UACnE,QAAA;AAAA,UACA,SAAA,EAAW,gBAAA;AAAA,UACX,cAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC3B,UAAAA,QAAO,IAAA,CAAK,oDAAA,EAAsD,EAAE,KAAA,EAAO,cAAA,CAAe,OAAO,CAAA;AACjG,UAAA,OAAOG,GAAG,MAAS,CAAA;AAAA,QACrB;AAEA,QAAA,IAAI,cAAA,CAAe,KAAK,OAAA,EAAS;AAC/B,UAAA,KAAA,CAAM,UAAU,IAAA,CAAK;AAAA,YACnB,OAAA,EAAS,eAAe,IAAA,CAAK,OAAA;AAAA,YAC7B,UAAA,EAAY,QAAA,CAAS,YAAA,CAAa,cAAA,CAAe,KAAK,OAAO,CAAA;AAAA,YAC7D,eAAA,EAAiB,eAAe,IAAA,CAAK;AAAA,WACtC,CAAA;AAAA,QACH;AAEA,QAAA,KAAA,CAAM,QAAA,GAAW,eAAe,IAAA,CAAK,QAAA;AACrC,QAAA,OAAOA,GAAG,MAAS,CAAA;AAAA,MACrB,CAAA;AAAA,MAEA,WAAA,GAAwC;AACtC,QAAA,OAAOA,EAAAA,CAAG,CAAC,GAAG,KAAA,CAAM,QAAQ,CAAC,CAAA;AAAA,MAC/B,CAAA;AAAA,MAEA,aAAA,GAAgE;AAC9D,QAAA,OAAOA,EAAAA,CAAG;AAAA,UACR,OAAA,EAAS,QAAA,CAAS,gBAAA,CAAiB,KAAA,CAAM,QAAQ,CAAA;AAAA,UACjD,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,MACH,CAAA;AAAA,MAEA,YAAA,GAA2C;AACzC,QAAA,OAAOA,EAAAA,CAAG,CAAC,GAAG,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MAChC,CAAA;AAAA,MAEA,MAAM,IAAA,GAAiC;AAErC,QAAA,MAAM,QAAQ,KAAA,EAAM;AAEpB,QAAA,IAAI,CAAC,KAAA,IAAS,CAAC,YAAA,EAAc;AAC3B,UAAA,OAAOA,GAAG,MAAS,CAAA;AAAA,QACrB;AACA,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,UAAA,MAAM,YAAA,CAAa,KAAK,GAAA,EAAK;AAAA,YAC3B,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,WAAW,KAAA,CAAM,SAAA;AAAA,YACjB,SAAA,EAAW,KAAK,GAAA;AAAI,WACtB,EAAG,EAAE,QAAA,EAAU,KAAA,CAAM,UAAU,SAAA,EAAW,KAAA,CAAM,WAAW,CAAA;AAG3D,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,MAAM,UAAA,GAAa,GAAA;AACnB,YAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AAClD,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,QAAA,CAAS,SAAA,GAAY,KAAK,GAAA,EAAI;AAC9B,cAAA,MAAM,YAAA,CAAa,KAAK,UAAA,EAAY,QAAA,EAAU,EAAE,QAAA,EAAU,QAAA,CAAS,UAAU,CAAA;AAAA,YAC/E,CAAA,MACK;AACH,cAAA,MAAM,YAAA,CAAa,KAAK,UAAA,EAAY;AAAA,gBAClC,WAAW,KAAA,CAAM,SAAA;AAAA,gBACjB,UAAU,KAAA,CAAM,QAAA;AAAA,gBAChB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,gBACpB,SAAA,EAAW,KAAK,GAAA;AAAI,eACtB,EAAG,EAAE,QAAA,EAAU,KAAA,CAAM,UAAU,CAAA;AAAA,YACjC;AAAA,UACF;AAEA,UAAA,OAAOA,GAAG,KAAA,CAAS,CAAA;AAAA,QACrB,SACO,KAAA,EAAO;AACZ,UAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,QAC5G;AAAA,MACF,CAAA;AAAA,MAEA,MAAM,MAAM,SAAA,EAAsC;AAChD,QAAA,MAAM,oBAAA,GAAuB,WAAW,oBAAA,IAAwB,IAAA;AAChE,QAAA,MAAM,gBAAA,GAAmB,WAAW,gBAAA,IAAoB,IAAA;AACxD,QAAA,MAAM,kBAAA,GAAqB,WAAW,kBAAA,IAAsB,KAAA;AAG5D,QAAA,eAAA,EAAA;AAEA,QAAA,IAAI,gBAAA,EAAkB;AAEpB,UAAA,WAAA,EAAa,KAAA,EAAM;AACnB,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,IAAI,IAAA,CAAK,MAAA,KAAW,YAAA,IAAgB,IAAA,CAAK,WAAW,UAAA,EAAY;AAC9D,cAAA,IAAA,CAAK,MAAA,GAAS,aAAA;AACd,cAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,cAAA,IAAA,CAAK,WAAA,GAAc,KAAK,GAAA,EAAI;AAC5B,cAAA,iBAAA,CAAkB,KAAK,EAAE,CAAA;AAAA,YAC3B;AAAA,UACF;AAEA,UAAA,aAAA,IAAgB;AAAA,QAClB;AAGA,QAAA,IAAI,kBAAA;AACF,UAAA,MAAM,QAAQ,KAAA,EAAM;AAGtB,QAAA,KAAA,CAAM,WAAW,EAAC;AAClB,QAAA,KAAA,CAAM,YAAY,EAAC;AACnB,QAAA,KAAA,CAAM,MAAA,GAAS,CAAA;AACf,QAAA,cAAA,CAAe,KAAA,EAAM;AACrB,QAAA,iBAAA,CAAkB,KAAA,EAAM;AAGxB,QAAA,IAAI,oBAAA,IAAwB,gBAAA;AAC1B,UAAA,KAAA,CAAM,SAAS,IAAA,CAAK,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,kBAAkB,CAAA;AAEnE,QAAA,OAAOD,GAAG,MAAS,CAAA;AAAA,MACrB,CAAA;AAAA,MAEA,QAAA,GAA0C;AACxC,QAAA,OAAOA,EAAAA,CAAG,MAAM,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,GAAG,CAAA,GAAI,CAAC,CAAA;AAAA,MACtC,CAAA;AAAA,MAEA,iBAAiB,MAAA,EAAiC;AAChD,QAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,MAAM,CAAA;AAC5C,QAAA,IAAI,CAAC,IAAA;AACH,UAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,sBAAA,EAAwB,GAAA,CAAI,iBAAA,EAAmB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAO,EAAG,CAAC,CAAA;AAC9F,QAAA,IAAI,KAAK,MAAA,KAAW,YAAA;AAClB,UAAA,IAAA,CAAK,MAAA,GAAS,UAAA;AAChB,QAAA,OAAOD,GAAG,MAAS,CAAA;AAAA,MACrB,CAAA;AAAA,MAEA,UAAA,CAAW,QAAgB,KAAA,EAAmD;AAC5E,QAAA,OAAO,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AAAA,MACxD,CAAA;AAAA,MAEA,aAAA,CAAc,QAAgB,KAAA,EAAmD;AAC/E,QAAA,OAAO,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,aAAa,CAAA;AAAA,MAC1D,CAAA;AAAA,MAEA,MAAM,YAAY,eAAA,EAA6E;AAC7F,QAAA,IAAI,CAAC,IAAA,EAAM,OAAA,IAAW,CAAC,MAAM,MAAA,EAAQ;AACnC,UAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,qBAAA,EAAuB,GAAA,CAAI,wBAAA,EAA0B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,iCAAA,EAAkC,EAAG,CAAC,CAAA;AAAA,QACtI;AAGA,QAAA,MAAM,QAAQ,KAAA,EAAM;AAEpB,QAAA,IAAI;AAEF,UAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,IAAK,KAAA,CAAA;AAC5E,UAAA,MAAM,gBAAgB,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,MAAM,QAAA,EAAU;AAAA,YAChE,OAAO,eAAA,EAAiB,KAAA;AAAA,YACxB;AAAA,WACD,CAAA;AACD,UAAA,IAAI,CAAC,aAAA,CAAc,OAAA;AACjB,YAAA,OAAO,aAAA;AACT,UAAA,MAAM,cAAc,aAAA,CAAc,IAAA;AAElC,UAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAK,EAAG;AACvB,YAAA,OAAOD,GAAG,EAAE,OAAA,EAAS,aAAa,QAAA,EAAU,IAAI,CAAA;AAAA,UAClD;AAGA,UAAA,MAAM,YAAA,GAAe,eAAA,EAAiB,KAAA,IAAS,OAAA,CAAQ,MAAA,EAAQ,KAAA;AAC/D,UAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA;AAAA,YAClC,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,aAAa,CAAA;AAAA,YACvC;AAAA,cACE,UAAU,KAAA,EAAO,QAAA;AAAA,cACjB,KAAA,EAAO,YAAA;AAAA,cACP,KAAA,EAAO,eAAA,EAAiB,KAAA,IAAS,OAAA,CAAQ,MAAA,EAAQ,KAAA;AAAA,cACjD,KAAA,EAAO,eAAA,EAAiB,KAAA,IAAS,OAAA,CAAQ,MAAA,EAAQ,eAAA;AAAA,cACjD,YAAA,EAAc,eAAA,EAAiB,sBAAA,IAA0B,OAAA,CAAQ,MAAA,EAAQ;AAAA;AAC3E,WACF;AACA,UAAA,IAAI,CAAC,SAAA,CAAU,OAAA;AACb,YAAA,OAAO,SAAA;AAET,UAAA,OAAOA,GAAG,EAAE,OAAA,EAAS,aAAa,QAAA,EAAU,SAAA,CAAU,MAAM,CAAA;AAAA,QAC9D,SACO,KAAA,EAAO;AACZ,UAAAH,OAAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,OAAO,CAAA;AACpD,UAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,qBAAA,EAAuB,GAAA,CAAI,0BAA0B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,QACzH;AAAA,MACF,CAAA;AAAA,MAEA,IAAI,kBAAA,GAA6B;AAC/B,QAAA,OAAO,kBAAA,CAAmB,IAAA;AAAA,MAC5B,CAAA;AAAA,MAEA,MAAM,KAAA,GAAkC;AAEtC,QAAA,OAAO,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAClC,UAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,CAAC,GAAG,kBAAkB,CAAC,CAAA;AAAA,QAClD;AACA,QAAA,OAAOD,GAAG,MAAS,CAAA;AAAA,MACrB,CAAA;AAAA;AAAA,MAIA,MAAM,IAAA,CAAK,OAAA,EAAiB,QAAA,EAAsE;AAChG,QAAA,IAAI,CAAC,MAAM,GAAA,EAAK;AACd,UAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,eAAA,EAAiB,GAAA,CAAI,mBAAmB,CAAC,CAAA;AAAA,QACjE;AAGA,QAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,EAAkB;AACpC,QAAA,IAAI,CAAC,GAAA,CAAI,OAAA;AACP,UAAA,OAAO,GAAA;AACT,QAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,cAAA,EAAgB,OAAA,KAAY,GAAA,CAAI,IAAA;AACvD,QAAA,MAAM,MAAA,GAASM,cAAAA,CAAc,QAAA,EAAU,MAAA,EAAQ,cAAc,CAAA;AAC7D,QAAA,IAAI,MAAA,GAAwB,IAAA;AAE5B,QAAA,IAAI;AAEF,UAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,UAAA,CAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,CAAA;AAC7E,UAAA,IAAI,CAAC,SAAA,CAAU,OAAA;AACb,YAAA,OAAO,SAAA;AAGT,UAAA,MAAM,cAAA,GAAiB,QAAQ,WAAA,EAAY;AAC3C,UAAA,IAAI,CAAC,cAAA,CAAe,OAAA;AAClB,YAAA,OAAO,cAAA;AACT,UAAA,IAAI,WAAW,cAAA,CAAe,IAAA;AAG9B,UAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,MAAA,IAAU,IAAA,CAAK,MAAA,EAAQ;AACzC,YAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAO,cAAA,CAAe,QAAA,EAAU,wBAAwB,CAAA;AACpF,YAAA,IAAI,SAAS,OAAA,EAAS;AACpB,cAAA,QAAA,GAAW,QAAA,CAAS,IAAA;AAAA,YACtB;AAAA,UACF;AAGA,UAAA,IAAI,OAAA,CAAQ,GAAA,EAAK,MAAA,IAAU,IAAA,CAAK,GAAA,EAAK;AACnC,YAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,EAAS;AAAA,cAC9C,OAAA,EAAS,QAAQ,GAAA,CAAI,OAAA;AAAA,cACrB,IAAA,EAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,cAClB,QAAA,EAAU,QAAQ,GAAA,CAAI,QAAA;AAAA,cACtB,YAAA,EAAc,QAAQ,GAAA,CAAI,YAAA;AAAA,cAC1B,WAAA,EAAa,QAAQ,GAAA,CAAI,WAAA;AAAA,cACzB,KAAA,EAAO,QAAA,EAAU,KAAA,IAAS,OAAA,CAAQ,KAAA;AAAA,cAClC,QAAA;AAAA,cACA,aAAA,EAAe,KAAA;AAAA,cACf;AAAA,aACD,CAAA;AACD,YAAA,IAAI,UAAU,OAAA,EAAS;AAErB,cAAA,MAAM,KAAA,GAAQ,UAAU,IAAA,CAAK,MAAA;AAC7B,cAAA,MAAA,GAAS,MAAM,sBAAA,CAAuB,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AAE3D,cAAA,OAAOP,EAAAA,CAAG;AAAA,gBACR,KAAA;AAAA,gBACA,KAAA,EAAO,UAAU,IAAA,CAAK,KAAA;AAAA,gBACtB,MAAA;AAAA,gBACA,KAAA,EAAO,UAAU,IAAA,CAAK;AAAA,eACvB,CAAA;AAAA,YACH;AAAA,UACF;AAGA,UAAA,IAAI,OAAA,CAAQ,SAAA,EAAW,MAAA,IAAU,IAAA,CAAK,SAAA,EAAW;AAC/C,YAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,SAAA,CAAU,IAAI,OAAA,EAAS;AAAA,cACrD,QAAA,EAAU,QAAQ,SAAA,CAAU,QAAA;AAAA,cAC5B,SAAA,EAAW,QAAQ,SAAA,CAAU,SAAA;AAAA,cAC7B,KAAA,EAAO,QAAA,EAAU,KAAA,IAAS,OAAA,CAAQ,KAAA;AAAA,cAClC,WAAA,EAAa,QAAA,EAAU,WAAA,IAAe,OAAA,CAAQ,WAAA;AAAA,cAC9C,QAAA;AAAA,cACA,OAAO,OAAA,CAAQ,KAAA;AAAA,cACf,UAAU,KAAA,EAAO,QAAA;AAAA,cACjB,WAAW,KAAA,EAAO,SAAA;AAAA,cAClB,aAAA,EAAe,KAAA;AAAA,cACf;AAAA,aACD,CAAA;AACD,YAAA,IAAI,aAAa,OAAA,EAAS;AACxB,cAAA,MAAM,KAAA,GAAQ,aAAa,IAAA,CAAK,MAAA;AAChC,cAAA,MAAA,GAAS,MAAM,sBAAA,CAAuB,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AAE3D,cAAA,OAAOA,EAAAA,CAAG,EAAE,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,KAAA,IAAS,OAAA,CAAQ,KAAA,IAAS,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAA,EAAW,CAAA;AAAA,YAC9F;AAAA,UACF;AAGA,UAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,EAAO,cAAA,EAAe;AAC/C,UAAA,MAAM,aAAA,GAAgB,QAAQ,aAAA,IAAiB,EAAA;AAC/C,UAAA,IAAI,SAAA,GAAY,EAAA;AAChB,UAAA,IAAI,SAAA;AAEJ,UAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,aAAA,EAAe,KAAA,EAAA,EAAS;AACnD,YAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK;AAAA,cACrC,KAAA,EAAO,QAAA,EAAU,KAAA,IAAS,OAAA,CAAQ,KAAA;AAAA,cAClC,QAAA;AAAA,cACA,WAAA,EAAa,QAAA,EAAU,WAAA,IAAe,OAAA,CAAQ,WAAA;AAAA,cAC9C,UAAU,KAAA,EAAO,QAAA;AAAA,cACjB,WAAW,KAAA,EAAO,SAAA;AAAA,cAClB,KAAA,EAAO,QAAA;AAAA,cACP,WAAA,EAAa,WAAW,MAAA,GAAS,KAAA,CAAA;AAAA,cACjC,aAAA,EAAe,UAAU,aAAA,IAAiB,KAAA;AAAA,cAC1C;AAAA,aACD,CAAA;AAED,YAAA,IAAI,CAAC,UAAA,CAAW,OAAA;AACd,cAAA,OAAO,UAAA;AAET,YAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AACxC,YAAA,SAAA,GAAY,WAAW,IAAA,CAAK,KAAA;AAC5B,YAAA,IAAI,UAAA,CAAW,KAAK,KAAA,EAAO;AACzB,cAAA,SAAA,GAAY;AAAA,gBACV,aAAA,EAAe,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,aAAA;AAAA,gBACrC,iBAAA,EAAmB,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,iBAAA;AAAA,gBACzC,YAAA,EAAc,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM;AAAA,eACtC;AAAA,YACF;AAEA,YAAA,IAAI,CAAC,MAAA;AACH,cAAA;AAEF,YAAA,MAAM,mBAAmB,MAAA,CAAO,OAAA;AAGhC,YAAA,IAAI,iBAAiB,UAAA,IAAc,gBAAA,CAAiB,WAAW,MAAA,GAAS,CAAA,IAAK,QAAQ,KAAA,EAAO;AAC1F,cAAA,QAAA,CAAS,KAAK,gBAAgB,CAAA;AAE9B,cAAA,KAAA,MAAW,QAAA,IAAY,iBAAiB,UAAA,EAAY;AAClD,gBAAA,IAAI,SAAS,IAAA,KAAS,UAAA;AACpB,kBAAA;AACF,gBAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,QAAA,EAAU,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,WAAW,CAAA;AAC3H,gBAAA,MAAM,UAAA,GAAa,WAAW,OAAA,GAC1B,UAAA,CAAW,KAAK,OAAA,GAChB,CAAA,YAAA,EAAe,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA,CAAA;AAC3C,gBAAA,MAAM,WAAA,GAAc,OAAO,UAAA,KAAe,QAAA,GACtC,UAAA,GACC,UAAA,CAAwC,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAE5E,gBAAA,QAAA,CAAS,IAAA,CAAK;AAAA,kBACZ,IAAA,EAAM,MAAA;AAAA,kBACN,cAAc,QAAA,CAAS,EAAA;AAAA,kBACvB,OAAA,EAAS;AAAA,iBACV,CAAA;AAAA,cACH;AACA,cAAA;AAAA,YACF;AAGA,YAAA,MAAM,QAAQ,OAAO,gBAAA,CAAiB,OAAA,KAAY,QAAA,GAAW,iBAAiB,OAAA,GAAU,EAAA;AAGxF,YAAA,MAAA,GAAS,MAAM,sBAAA,CAAuB,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AAE3D,YAAA,OAAOA,EAAAA,CAAG,EAAE,KAAA,EAAO,KAAA,EAAO,WAAW,MAAA,EAAQ,KAAA,EAAO,WAAW,CAAA;AAAA,UACjE;AAGA,UAAA,MAAM,gBAAA,GAAmB,SAAS,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,WAAW,EAAE,GAAA,EAAI;AAC1E,UAAA,MAAM,aAAA,GAAgB,oBAAoB,SAAA,IAAa,gBAAA,IAAoB,OAAO,gBAAA,CAAiB,OAAA,KAAY,QAAA,GAC3G,gBAAA,CAAiB,OAAA,GACjB,EAAA;AACJ,UAAA,MAAA,GAAS,MAAM,sBAAA,CAAuB,OAAA,EAAS,aAAA,EAAe,KAAK,CAAA;AACnE,UAAA,OAAOA,EAAAA,CAAG,EAAE,KAAA,EAAO,aAAA,EAAe,OAAO,SAAA,EAAW,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,QAChF,SACO,KAAA,EAAO;AACZ,UAAAH,OAAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,OAAO,CAAA;AAC7C,UAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,QAC5G,CAAA,SACA;AAEE,UAAA,gBAAA,CAAiB,QAAQ,OAAO,CAAA;AAAA,QAClC;AAAA,MACF,CAAA;AAAA,MAEA,OAAO,UAAA,CAAW,OAAA,EAAiB,QAAA,EAAkE;AACnG,QAAA,IAAI,CAAC,MAAM,GAAA,EAAK;AACd,UAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,QAC5E;AAGA,QAAA,MAAM,GAAA,GAAM,MAAM,iBAAA,EAAkB;AACpC,QAAA,IAAI,CAAC,GAAA,CAAI,OAAA;AACP,UAAA,MAAML,KAAK,KAAA,CAAM,iBAAA,CAAkB,WAAW,YAAA,EAAc,GAAA,CAAI,gBAAgB,CAAC,CAAA;AACnF,QAAA,MAAM,EAAE,MAAA,EAAQ,cAAA,EAAgB,OAAA,KAAY,GAAA,CAAI,IAAA;AAChD,QAAA,MAAM,MAAA,GAASW,cAAAA,CAAc,QAAA,EAAU,MAAA,EAAQ,cAAc,CAAA;AAC7D,QAAA,IAAI,UAAA,GAAsC,IAAA;AAE1C,QAAA,IAAI;AAEF,UAAA,MAAM,QAAQ,UAAA,CAAW,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAG3D,UAAA,MAAM,cAAA,GAAiB,QAAQ,WAAA,EAAY;AAC3C,UAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC3B,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,OAAO,cAAA,CAAe,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,UAC3E;AACA,UAAA,IAAI,WAAW,cAAA,CAAe,IAAA;AAG9B,UAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,MAAA,IAAU,IAAA,CAAK,MAAA,EAAQ;AACzC,YAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAO,cAAA,CAAe,QAAA,EAAU,wBAAwB,CAAA;AACpF,YAAA,IAAI,SAAS,OAAA,EAAS;AACpB,cAAA,QAAA,GAAW,QAAA,CAAS,IAAA;AAAA,YACtB;AAAA,UACF;AAIA,UAAA,MAAM,IAAA,GAAO,gBAAgB,OAAO,CAAA;AACpC,UAAA,UAAA,GAAa,IAAA;AACb,UAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,KAAK,EAAA,EAAG;AAE9C,UAAA,IAAI;AAEF,YAAA,IAAI,OAAA,CAAQ,GAAA,EAAK,MAAA,IAAU,IAAA,CAAK,GAAA,EAAK;AACnC,cAAA,IAAIC,UAAAA,GAAY,EAAA;AAChB,cAAA,IAAIC,MAAAA,GAAQ,EAAA;AACZ,cAAA,IAAIC,MAAAA;AAEJ,cAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,OAAA,EAAS;AAAA,gBACtD,OAAA,EAAS,QAAQ,GAAA,CAAI,OAAA;AAAA,gBACrB,IAAA,EAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,gBAClB,QAAA,EAAU,QAAQ,GAAA,CAAI,QAAA;AAAA,gBACtB,YAAA,EAAc,QAAQ,GAAA,CAAI,YAAA;AAAA,gBAC1B,WAAA,EAAa,QAAQ,GAAA,CAAI,WAAA;AAAA,gBACzB,KAAA,EAAO,QAAA,EAAU,KAAA,IAAS,OAAA,CAAQ,KAAA;AAAA,gBAClC,QAAA;AAAA,gBACA,aAAA,EAAe,KAAA;AAAA,gBACf;AAAA,eACD,CAAA,EAAG;AACF,gBAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,kBAAAF,cAAa,KAAA,CAAM,IAAA;AACnB,kBAAA,IAAA,CAAK,SAAA,GAAYA,UAAAA;AACjB,kBAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,gBAC1C,CAAA,MAAA,IACS,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAC9B,kBAAAA,aAAY,KAAA,CAAM,MAAA;AAClB,kBAAAC,SAAQ,KAAA,CAAM,KAAA;AACd,kBAAAC,SAAQ,KAAA,CAAM,KAAA;AAAA,gBAChB;AAAA,cACF;AAGA,cAAA,IAAI,MAAM,kBAAA,CAAmB,IAAA,EAAMF,UAAS,CAAA;AAC1C,gBAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAOA,UAAAA,EAAW,KAAA,EAAAC,MAAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,KAAA,EAAAC,MAAAA,EAAM;AACxE,cAAA;AAAA,YACF;AAGA,YAAA,IAAI,OAAA,CAAQ,SAAA,EAAW,MAAA,IAAU,IAAA,CAAK,SAAA,EAAW;AAC/C,cAAA,IAAIF,UAAAA,GAAY,EAAA;AAEhB,cAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,OAAA,EAAS;AAAA,gBAC1D,QAAA,EAAU,QAAQ,SAAA,CAAU,QAAA;AAAA,gBAC5B,SAAA,EAAW,QAAQ,SAAA,CAAU,SAAA;AAAA,gBAC7B,KAAA,EAAO,QAAA,EAAU,KAAA,IAAS,OAAA,CAAQ,KAAA;AAAA,gBAClC,WAAA,EAAa,QAAA,EAAU,WAAA,IAAe,OAAA,CAAQ,WAAA;AAAA,gBAC9C,QAAA;AAAA,gBACA,OAAO,OAAA,CAAQ,KAAA;AAAA,gBACf,UAAU,KAAA,EAAO,QAAA;AAAA,gBACjB,WAAW,KAAA,EAAO,SAAA;AAAA,gBAClB,aAAA,EAAe,KAAA;AAAA,gBACf;AAAA,eACD,CAAA,EAAG;AACF,gBAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,kBAAAA,cAAa,KAAA,CAAM,IAAA;AACnB,kBAAA,IAAA,CAAK,SAAA,GAAYA,UAAAA;AACjB,kBAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,gBAC1C;AAAA,cACF;AAGA,cAAA,IAAI,MAAM,kBAAA,CAAmB,IAAA,EAAMA,UAAS,CAAA;AAC1C,gBAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAOA,YAAW,KAAA,EAAO,QAAA,EAAU,KAAA,IAAS,OAAA,CAAQ,SAAS,EAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,OAAO,KAAA,CAAA,EAAU;AAC3H,cAAA;AAAA,YACF;AAGA,YAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,EAAO,cAAA,EAAe;AAC/C,YAAA,MAAM,aAAA,GAAgB,QAAQ,aAAA,IAAiB,EAAA;AAE/C,YAAA,IAAI,SAAA,GAAY,EAAA;AAChB,YAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,YAAA,IAAI,KAAA;AAEJ,YAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,aAAA,EAAe,KAAA,EAAA,EAAS;AACnD,cAAA,MAAM,YAAY,qBAAA,EAAsB;AAExC,cAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW;AAAA,gBACjC,KAAA,EAAO,QAAA,EAAU,KAAA,IAAS,OAAA,CAAQ,KAAA;AAAA,gBAClC,QAAA;AAAA,gBACA,WAAA,EAAa,QAAA,EAAU,WAAA,IAAe,OAAA,CAAQ,WAAA;AAAA,gBAC9C,UAAU,KAAA,EAAO,QAAA;AAAA,gBACjB,WAAW,KAAA,EAAO,SAAA;AAAA,gBAClB,KAAA,EAAO,QAAA;AAAA,gBACP,WAAA,EAAa,WAAW,MAAA,GAAS,KAAA,CAAA;AAAA,gBACjC,aAAA,EAAe,UAAU,aAAA,IAAiB,KAAA;AAAA,gBAC1C;AAAA,eACD,CAAA;AAED,cAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,gBAAA,SAAA,CAAU,QAAQ,KAAK,CAAA;AAEvB,gBAAA,IAAI,CAAC,SAAS,KAAA,CAAM,KAAA;AAClB,kBAAA,KAAA,GAAQ,KAAA,CAAM,KAAA;AAChB,gBAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,CAAC,GAAG,KAAA,EAAO,OAAA;AACzC,gBAAA,IAAI,KAAA,EAAO;AACT,kBAAA,SAAA,IAAa,KAAA;AACb,kBAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,kBAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,gBACrC;AACA,gBAAA,IAAI,MAAM,KAAA,EAAO;AACf,kBAAA,KAAA,GAAQ;AAAA,oBACN,aAAA,EAAe,MAAM,KAAA,CAAM,aAAA;AAAA,oBAC3B,iBAAA,EAAmB,MAAM,KAAA,CAAM,iBAAA;AAAA,oBAC/B,YAAA,EAAc,MAAM,KAAA,CAAM;AAAA,mBAC5B;AAAA,gBACF;AAAA,cACF;AAEA,cAAA,MAAM,YAAA,GAAe,UAAU,SAAA,EAAU;AAGzC,cAAA,IAAI,YAAA,CAAa,SAAA,CAAU,MAAA,GAAS,CAAA,IAAK,QAAQ,KAAA,EAAO;AACtD,gBAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,kBAAA,EAAoB,CAAA;AAE5C,gBAAA,KAAA,MAAW,QAAA,IAAY,aAAa,SAAA,EAAW;AAC7C,kBAAA,IAAI,SAAS,IAAA,KAAS,UAAA;AACpB,oBAAA;AACF,kBAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,CAAS,SAAS,IAAA,EAAM,SAAA,EAAW,QAAA,CAAS,QAAA,CAAS,SAAA,EAAU;AAEhG,kBAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,QAAA,EAAU,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,WAAW,CAAA;AAC3H,kBAAA,MAAM,UAAA,GAAa,WAAW,OAAA,GAC1B,UAAA,CAAW,KAAK,OAAA,GAChB,CAAA,YAAA,EAAe,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA,CAAA;AAC3C,kBAAA,MAAM,WAAA,GAAc,OAAO,UAAA,KAAe,QAAA,GACtC,UAAA,GACC,UAAA,CAAwC,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAE5E,kBAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM,OAAA,EAAS,WAAA,EAAa,OAAA,EAAS,UAAA,CAAW,OAAA,EAAQ;AAE7G,kBAAA,QAAA,CAAS,IAAA,CAAK;AAAA,oBACZ,IAAA,EAAM,MAAA;AAAA,oBACN,cAAc,QAAA,CAAS,EAAA;AAAA,oBACvB,OAAA,EAAS;AAAA,mBACV,CAAA;AAAA,gBACH;AAGA,gBAAA,SAAA,GAAY,EAAA;AACZ,gBAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,gBAAA;AAAA,cACF;AAGA,cAAA;AAAA,YACF;AAGA,YAAA,IAAI,MAAM,kBAAA,CAAmB,IAAA,EAAM,SAAS,CAAA;AAC1C,cAAA,MAAM,EAAE,MAAM,MAAA,EAAQ,KAAA,EAAO,WAAW,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,KAAA,EAAM;AAAA,UAC1E,SACO,KAAA,EAAO;AAIZ,YAAA,IAAI,OAAO,OAAA,EAAS;AAClB,cAAA,MAAM,EAAE,MAAM,WAAA,EAAa,MAAA,EAAQ,KAAK,EAAA,EAAI,SAAA,EAAW,KAAK,SAAA,EAAU;AACtE,cAAA;AAAA,YACF;AACA,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,QACF,CAAA,SACA;AAEE,UAAA,gBAAA,CAAiB,UAAA,EAAY,EAAA,IAAM,IAAA,EAAM,OAAO,CAAA;AAAA,QAClD;AAAA,MACF;AAAA,KACF;AASA,IAAA,SAAS,gBAAgB,WAAA,EAAuC;AAC9D,MAAA,MAAM,IAAA,GAAyB;AAAA,QAC7B,IAAI,cAAA,EAAe;AAAA,QACnB,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAW,EAAA;AAAA,QACX,SAAA,EAAW,EAAA;AAAA,QACX,MAAA,EAAQ,YAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AACA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAEf,MAAA,cAAA,CAAe,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,WAAW,CAAA;AACvC,MAAA,OAAO,IAAA;AAAA,IACT;AAaA,IAAA,eAAe,kBAAA,CAAmB,MAAwB,SAAA,EAAqC;AAC7F,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,WAAA,IAAe,IAAA,CAAK,MAAA,KAAW,aAAA;AACjD,QAAA,OAAO,KAAA;AACT,MAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,MAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,QAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,QAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,QAAA,IAAA,CAAK,WAAA,GAAc,KAAK,GAAA,EAAI;AAC5B,QAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA;AACnD,QAAA,cAAA,CAAe,MAAA,CAAO,KAAK,EAAE,CAAA;AAC7B,QAAA,IAAI,SAAA;AACF,UAAA,MAAM,QAAQ,UAAA,CAAW,EAAE,MAAM,WAAA,EAAa,OAAA,EAAS,WAAW,CAAA;AACpE,QAAA,oBAAA,CAAqB,aAAa,SAAS,CAAA;AAAA,MAC7C;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAaA,IAAA,eAAe,sBAAA,CAAuB,WAAA,EAAqB,SAAA,EAAmB,KAAA,EAAgC;AAC5G,MAAA,MAAM,SAAS,cAAA,EAAe;AAE9B,MAAA,IAAI,KAAA,KAAU,eAAA;AACZ,QAAA,OAAO,MAAA;AAET,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,IAAA,GAAyB;AAAA,QAC7B,EAAA,EAAI,MAAA;AAAA,QACJ,OAAA,EAAS,WAAA;AAAA,QACT,SAAA;AAAA,QACA,SAAA,EAAW,UAAA,KAAe,MAAA,GAAS,SAAA,GAAY,EAAA;AAAA,QAC/C,MAAA,EAAQ,UAAA,KAAe,MAAA,GAAS,WAAA,GAAc,YAAA;AAAA,QAC9C,SAAA,EAAW,GAAA;AAAA,QACX,WAAA,EAAa,UAAA,KAAe,MAAA,GAAS,GAAA,GAAM;AAAA,OAC7C;AACA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAEf,MAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,QAAA,IAAI,SAAA;AACF,UAAA,MAAM,QAAQ,UAAA,CAAW,EAAE,MAAM,WAAA,EAAa,OAAA,EAAS,WAAW,CAAA;AACpE,QAAA,oBAAA,CAAqB,aAAa,SAAS,CAAA;AAAA,MAC7C,CAAA,MACK;AACH,QAAA,cAAA,CAAe,GAAA,CAAI,QAAQ,WAAW,CAAA;AAAA,MACxC;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAKA,IAAA,eAAe,cAAA,CACb,MAAA,EACA,IAAA,EACA,MAAA,EAC0B;AAC1B,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,MAAM,CAAA;AAC5C,MAAA,IAAI,CAAC,IAAA;AACH,QAAA,OAAOP,GAAAA,CAAI,UAAA,CAAW,sBAAA,EAAwB,GAAA,CAAI,iBAAA,EAAmB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAO,EAAG,CAAC,CAAA;AAC9F,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,WAAA,IAAe,IAAA,CAAK,MAAA,KAAW,aAAA;AACjD,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,0BAAA,EAA4B,GAAA,CAAI,qBAAA,EAAuB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAO,EAAG,CAAC,CAAA;AAEtG,MAAA,MAAM,SAAA,GAAY,IAAA,KAAS,MAAA,KAAW,WAAA,GAAc,KAAK,SAAA,GAAY,EAAA,CAAA;AACrE,MAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,MAAA,IAAA,CAAK,WAAA,GAAc,KAAK,GAAA,EAAI;AAE5B,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAC7C,MAAA,cAAA,CAAe,OAAO,MAAM,CAAA;AAG5B,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,QAAQ,UAAA,CAAW,EAAE,MAAM,WAAA,EAAa,OAAA,EAAS,WAAW,CAAA;AAClE,QAAA,IAAI,WAAA,KAAgB,MAAA;AAClB,UAAA,oBAAA,CAAqB,aAAa,SAAS,CAAA;AAAA,MAC/C;AAGA,MAAA,iBAAA,CAAkB,MAAM,CAAA;AACxB,MAAA,OAAOD,GAAG,MAAS,CAAA;AAAA,IACrB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA,IAIL,cAAc,OAAA,EAA4D;AACxE,MAAA,MAAM,IAAA,GAAO,WAAW,EAAC;AAEzB,MAAA,MAAM,OAAA,GAAU,YAAA;AAAA,QACd,IAAA;AAAA,QACA,EAAC;AAAA,QACD;AAAC,OACH;AAGA,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,KAAK,OAAA,CAAQ,WAAW,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,IAAA,CAAK,cAAc,CAAA;AAAA,MACxE;AAEA,MAAA,OAAOA,GAAG,OAAO,CAAA;AAAA,IACnB,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,cAAA,CAAe,KAAA,EAAyB,OAAA,EAAoF;AAChI,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,OAAA,EAAS,KAAA,EAAM;AAEjC,MAAA,IAAI,kBAAiC,EAAC;AACtC,MAAA,IAAI,mBAAoC,EAAC;AAGzC,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,QAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAC5C,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,eAAA,GAAkB,SAAA,CAAU,QAAA;AAC5B,UAAA,gBAAA,GAAmB,SAAA,CAAU,SAAA;AAC7B,UAAAH,OAAAA,CAAO,MAAM,qCAAA,EAAuC,EAAE,OAAO,YAAA,EAAc,eAAA,CAAgB,QAAQ,CAAA;AAAA,QACrG;AAAA,MACF;AAEA,MAAA,MAAM,OAAA,GAAU,YAAA;AAAA;AAAA,QAEd,EAAE,GAAG,IAAA,EAAM,YAAA,EAAc,MAAA,EAAU;AAAA,QACnC,eAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAOG,GAAG,OAAO,CAAA;AAAA,IACnB,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,aAAa,QAAA,EAAqD;AACtE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,OAAOA,EAAAA,CAAG,EAAE,CAAA;AAAA,MACd;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,KAAA,CAAM;AAAA,UACxC,QAAA;AAAA,UACA,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAa,WAAW,MAAA;AAAO,SAClD,CAAA;AACD,QAAA,OAAOA,GAAG,QAAQ,CAAA;AAAA,MACpB,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC5G;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,aAAA,CAAc,KAAA,EAAyB,KAAA,EAAyC;AACpF,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,OAAOD,GAAG,MAAS,CAAA;AAAA,MACrB;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,gBAAgB,KAAK,CAAA;AACxC,QAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AAClD,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,sBAAsB,KAAA,CAAM,SAAS,CAAA,CAAA,EAAG,EAAG,CAAC,CAAA;AAAA,QAC/H;AACA,QAAA,QAAA,CAAS,KAAA,GAAQ,KAAA;AACjB,QAAA,QAAA,CAAS,SAAA,GAAY,KAAK,GAAA,EAAI;AAC9B,QAAA,MAAM,YAAA,CAAa,KAAK,UAAA,EAAY,QAAA,EAAU,EAAE,QAAA,EAAU,QAAA,CAAS,UAAU,CAAA;AAC7E,QAAA,OAAOD,GAAG,KAAA,CAAS,CAAA;AAAA,MACrB,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC5G;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,cAAc,KAAA,EAAmD;AACrE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,OAAOD,GAAG,MAAS,CAAA;AAAA,MACrB;AAEA,MAAA,IAAI;AAEF,QAAA,MAAM,UAAA,GAAa,gBAAgB,KAAK,CAAA;AACxC,QAAA,IAAI,YAAA;AACF,UAAA,MAAM,YAAA,CAAa,OAAO,UAAU,CAAA;AACtC,QAAA,MAAM,YAAA,CAAa,OAAO,UAAU,CAAA;AACpC,QAAA,OAAOA,GAAG,KAAA,CAAS,CAAA;AAAA,MACrB,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC5G;AAAA,IACF;AAAA,GACF;AACF;AC3iCA,IAAMJ,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,WAAA,EAAa,CAAA;AAW9D,SAAS,0BAA0B,MAAA,EAAuC;AAC/E,EAAA,MAAM,eAAA,GAAmC,MAAA,CAAO,SAAA,IAAa,EAAE,WAAW,GAAA,EAAI;AAK9E,EAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,iBAAA;AAKJ,EAAA,SAAS,kBAAkB,QAAA,EAA+B;AACxD,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,IAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,IAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,IAAA,MAAM,WAAW,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA,CAAA;AAGlD,IAAA,IAAI,gBAAgB,iBAAA,KAAsB,QAAA;AACxC,MAAA,OAAO,YAAA;AAET,IAAA,YAAA,GAAe,IAAIO,OAAAA,CAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AACtD,IAAA,iBAAA,GAAoB,QAAA;AACpB,IAAA,OAAO,YAAA;AAAA,EACT;AAKA,EAAA,eAAe,iBAAiB,OAAA,EAAkE;AAChG,IAAA,MAAM,iBAAiB,iBAAA,CAAkB,MAAA,CAAO,GAAA,EAAK,WAAA,EAAa,QAAQ,KAAA,EAAO;AAAA,MAC/E,oBAAA,EAAsB,IAAI,gBAAA,EAAkB,EAAE,QAAQ,EAAE,KAAA,EAAO,mCAAA,EAAoC,EAAG;AAAA,KACvG,CAAA;AACD,IAAA,IAAI,CAAC,cAAA,CAAe,OAAA;AAClB,MAAA,OAAO,cAAA;AACT,IAAA,MAAM,WAAW,cAAA,CAAe,IAAA;AAEhC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,KAAK,IAAI,OAAA,CAAQ,KAAA,GAAQ,CAAC,OAAA,CAAQ,KAAK,CAAA;AAE3E,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,kBAAkB,QAAQ,CAAA;AAEzC,MAAA,MAAM,MAAA,GAAyD;AAAA,QAC7D,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB;AAAA,OACF;AAEA,MAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,eAAA,CAAgB,UAAA,EAAY;AACpD,QAAA,MAAA,CAAO,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,eAAA,CAAgB,UAAA;AAAA,MAC5D;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,UAAA,CAAW,OAAO,MAAM,CAAA;AAEtD,MAAA,OAAOH,EAAAA,CAAG;AAAA,QACR,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,UAC/B,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,WAAW,IAAA,CAAK;AAAA,SAClB,CAAE,CAAA;AAAA,QACF,KAAA,EAAO;AAAA,UACL,aAAA,EAAe,SAAS,KAAA,CAAM,aAAA;AAAA,UAC9B,YAAA,EAAc,SAAS,KAAA,CAAM;AAAA;AAC/B,OACD,CAAA;AAAA,IACH,SACO,KAAA,EAAO;AACZ,MAAAH,QAAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,OAAO,CAAA;AACnD,MAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,IACjH;AAAA,EACF;AAKA,EAAA,eAAe,aAAa,OAAA,EAAkE;AAC5F,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,KAAK,IAAI,OAAA,CAAQ,KAAA,GAAQ,CAAC,OAAA,CAAQ,KAAK,CAAA;AAC3E,IAAA,MAAM,YAAY,eAAA,CAAgB,SAAA;AAGlC,IAAA,IAAI,KAAA,CAAM,UAAU,SAAA,EAAW;AAC7B,MAAA,OAAO,iBAAiB,OAAO,CAAA;AAAA,IACjC;AAGA,IAAA,MAAM,UAAqC,EAAC;AAC5C,IAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,WAAA,GAAc,EAAA;AAElB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,SAAA,EAAW;AAChD,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAI,SAAS,CAAA;AAC1C,MAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,OAAO,CAAA;AAClE,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,QAAA,OAAO,MAAA;AAET,MAAA,WAAA,GAAc,OAAO,IAAA,CAAK,KAAA;AAC1B,MAAA,iBAAA,IAAqB,MAAA,CAAO,KAAK,KAAA,CAAM,aAAA;AACvC,MAAA,WAAA,IAAe,MAAA,CAAO,KAAK,KAAA,CAAM,YAAA;AAGjC,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM;AACnC,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,KAAA,EAAO,IAAI,IAAA,CAAK,KAAA;AAAA,UAChB,WAAW,IAAA,CAAK;AAAA,SACjB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAOD,EAAAA,CAAG;AAAA,MACR,KAAA,EAAO,WAAA;AAAA,MACP,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,EAAE,aAAA,EAAe,iBAAA,EAAmB,cAAc,WAAA;AAAY,KACtE,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,MAAM,OAAA,EAAkE;AAC5E,MAAA,OAAO,aAAa,OAAO,CAAA;AAAA,IAC7B,CAAA;AAAA,IAEA,MAAM,UAAU,IAAA,EAA4C;AAC1D,MAAA,MAAM,SAAS,MAAM,YAAA,CAAa,EAAE,KAAA,EAAO,MAAM,CAAA;AACjD,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,QAAA,OAAO,MAAA;AACT,MAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,UAAU,CAAC,CAAA;AAC5D,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,kBAAA,EAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,2BAAA,EAA4B,EAAG,CAAC,CAAA;AAAA,MACxH;AACA,MAAA,OAAOD,EAAAA,CAAG,MAAM,SAAS,CAAA;AAAA,IAC3B,CAAA;AAAA,IAEA,MAAM,WAAW,KAAA,EAAiD;AAChE,MAAA,MAAM,SAAS,MAAM,YAAA,CAAa,EAAE,KAAA,EAAO,OAAO,CAAA;AAClD,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,QAAA,OAAO,MAAA;AACT,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAA,CAAO,KAAK,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AACrE,MAAA,OAAOA,GAAG,MAAA,CAAO,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,IAC9C;AAAA,GACF;AACF;ACnJA,IAAMH,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,CAAA;AAChE,IAAM,uBAAA,GAA0B,wCAAA;AAChC,IAAM,sBAAA,GAAyB,sCAAA;AAC/B,IAAM,wBAAA,GAA2B,gBAAA;AACjC,IAAM,yBAAA,GAA4B,aAAA;AAClC,IAAM,mBAAA,GAAsB,iDAAA;AAC5B,IAAM,qBAAA,GAAwB,yCAAA;AAC9B,IAAM,mBAAA,GAAsB,8CAAA;AAC5B,IAAM,oBAAA,GAAuB,gBAAA;AAC7B,IAAM,yBAAA,GAA4B,eAAA;AAClC,IAAM,yBAAA,GAA4B,eAAA;AAClC,IAAM,0BAAA,GAA6B,iCAAA;AACnC,IAAM,oBAAA,GAAuB,6BAAA;AAC7B,IAAM,qBAAA,GAAwB,mCAAA;AAC9B,IAAM,8BAAA,GAAiC,sCAAA;AACvC,IAAM,4BAAA,GAA+B,oBAAA;AACrC,IAAM,qBAAA,GAAwB,cAAA;AAC9B,IAAM,0BAAA,GAA6B,8DAAA;AACnC,IAAM,yBAAA,GAA4B,iEAAA;AAClC,IAAM,kBAAA,GAAqB,UAAA;AAC3B,IAAM,sBAAA,GAAyB,SAAA;AAK/B,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,YAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAM,WAAA,GAAsC;AAAA,EAC1C,GAAA,EAAK,YAAA;AAAA,EACL,EAAA,EAAI,eAAA;AAAA,EACJ,QAAA,EAAU,eAAA;AAAA,EACV,GAAA,EAAK,UAAA;AAAA,EACL,IAAA,EAAM,kBAAA;AAAA,EACN,GAAA,EAAK,iBAAA;AAAA,EACL,IAAA,EAAM,aAAA;AAAA,EACN,GAAA,EAAK,aAAA;AAAA,EACL,IAAA,EAAM,WAAA;AAAA,EACN,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,iBAAA;AAAA,EACL,IAAA,EAAM,yEAAA;AAAA,EACN,GAAA,EAAK,oBAAA;AAAA,EACL,GAAA,EAAK,YAAA;AAAA,EACL,IAAA,EAAM,YAAA;AAAA,EACN,GAAA,EAAK,WAAA;AAAA,EACL,GAAA,EAAK,WAAA;AAAA,EACL,IAAA,EAAM,YAAA;AAAA,EACN,GAAA,EAAK,WAAA;AAAA,EACL,IAAA,EAAM,YAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA;AAGA,SAAS,yBAAyB,MAAA,EAAoC;AACpE,EAAA,IAAI,OAAO,MAAA,GAAS,CAAA;AAClB,IAAA,OAAO,MAAA;AAET,EAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,OAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,CAAC,MAAM,EAAA,EAAM;AACxF,IAAA,OAAO,iBAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,IAAQ,OAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,CAAC,MAAM,EAAA,EAAM;AACxF,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,CAAC,CAAA,KAAM,OAAQ,MAAA,CAAO,CAAC,MAAM,GAAA,EAAM;AAC5C,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,OAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,CAAC,MAAM,EAAA,EAAM;AACxF,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,IACE,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,OAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,CAAC,MAAM,EAAA,IAC7E,MAAA,CAAO,MAAA,IAAU,EAAA,IAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,OAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,EAAE,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,EAAE,MAAM,EAAA,EAC5G;AACA,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,OAAO,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,EAAM;AACxF,IAAA,OAAO,iBAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AAOA,SAAS,cAAA,CAAe,OAAA,EAA0B,QAAA,EAAmB,YAAA,EAA+B;AAClG,EAAA,IAAI,YAAA;AACF,IAAA,OAAO,aAAa,WAAA,EAAY;AAElC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAO,WAAA,EAAY;AACnD,IAAA,IAAI,GAAA,IAAO,OAAO,WAAA,EAAa;AAC7B,MAAA,OAAO,YAAY,GAAG,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,IAAIE,MAAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AAC5B,IAAA,MAAM,QAAA,GAAW,yBAAyB,OAAO,CAAA;AACjD,IAAA,IAAI,QAAA;AACF,MAAA,OAAO,QAAA;AAAA,EACX;AAEA,EAAA,OAAO,YAAA;AACT;AAKA,SAAS,iBAAiB,OAAA,EAAkC;AAC1D,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA;AACrB,IAAA,OAAO,OAAA;AACT,EAAA,OAAO,OAAA,CAAQ,SAAS,OAAO,CAAA;AACjC;AAGA,IAAM,aAAA,GAAwC;AAAA,EAC5C,GAAA,EAAK,GAAA;AAAA,EACL,EAAA,EAAI,GAAA;AAAA,EACJ,EAAA,EAAI,GAAA;AAAA,EACJ,IAAA,EAAM,GAAA;AAAA,EACN,IAAA,EAAM,GAAA;AAAA,EACN,IAAA,EAAM,GAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,MAAA;AAAA,EACL,KAAA,EAAO;AACT,CAAA;AAGA,SAAS,mBAAmB,IAAA,EAAsB;AAChD,EAAA,OAAO,KAAK,OAAA,CAAQ,2CAAA,EAA6C,CAAC,KAAA,EAAO,GAAA,EAAK,KAAK,KAAA,KAAU;AAC3F,IAAA,IAAI,GAAA,KAAQ,MAAA;AACV,MAAA,OAAO,OAAO,YAAA,CAAa,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAC,CAAA;AACrD,IAAA,IAAI,GAAA,KAAQ,MAAA;AACV,MAAA,OAAO,OAAO,YAAA,CAAa,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAC,CAAA;AACrD,IAAA,OAAO,aAAA,CAAc,KAAK,CAAA,IAAK,KAAA;AAAA,EACjC,CAAC,CAAA;AACH;AAGA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAC5C;AAKA,SAAS,iBAAiB,OAAA,EAAkC;AAC1D,EAAA,MAAM,IAAA,GAAO,iBAAiB,OAAO,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,uBAAA,EAAyB,GAAG,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,sBAAA,EAAwB,GAAG,CAAA;AAC5D,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,GAAG,CAAA;AACtD,EAAA,OAAO,mBAAmB,MAAM,CAAA,CAAE,QAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC9D;AAQA,SAAS,eAAe,OAAA,EAAkC;AACxD,EAAA,IAAI,EAAA,GAAK,iBAAiB,OAAO,CAAA;AAGjC,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,uBAAA,EAAyB,EAAE,CAAA;AAC3C,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,sBAAA,EAAwB,EAAE,CAAA;AAG1C,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,wDAAA,EAA0D,CAAC,GAAG,IAAA,KAC5E;AAAA;AAAA,EAAa,mBAAmB,SAAA,CAAU,IAAI,CAAC,CAAA,CAAE,MAAM;AAAA;AAAA,CAAY,CAAA;AACrE,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,+BAAA,EAAiC,CAAC,GAAG,IAAA,KACnD;AAAA;AAAA,EAAa,mBAAmB,SAAA,CAAU,IAAI,CAAC,CAAA,CAAE,MAAM;AAAA;AAAA,CAAY,CAAA;AAGrE,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,CAAA,EAAG,KAAA,EAAA,EAAS;AACvC,IAAA,EAAA,GAAK,EAAA,CAAG,OAAA;AAAA,MACN,IAAI,MAAA,CAAO,CAAA,EAAA,EAAK,KAAK,CAAA,uBAAA,EAA0B,KAAK,KAAK,IAAI,CAAA;AAAA,MAC7D,CAAC,GAAG,CAAA,KAAM;AAAA,EAAK,GAAA,CAAI,OAAO,KAAK,CAAC,IAAI,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,EAAM;AAAA;AAAA,KACzD;AAAA,EACF;AAGA,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,cAAA,EAAgB,aAAa,CAAA;AAG7C,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,6CAAA,EAA+C,CAAC,CAAA,EAAG,CAAA,KACjE,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAG9F,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,wBAAA,EAA0B,IAAI,CAAA;AAC9C,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,yBAAA,EAA2B,IAAI,CAAA;AAC/C,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,6BAAA,EAA+B,CAAC,GAAG,CAAA,KAAM;AAAA,EAAA,EAAO,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,CAAA;AAGrF,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,mBAAA,EAAqB,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,EAAA,EAAK,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,EAAA,CAAI,CAAA;AAC3E,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,qBAAA,EAAuB,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAA,EAAI,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAA,CAAG,CAAA;AAG3E,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,mBAAA,EAAqB,CAAC,GAAG,IAAA,EAAM,IAAA,KAC7C,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,CAAA,CAAE,IAAA,EAAM,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAGxC,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,oBAAA,EAAsB,CAAC,GAAG,KAAA,KAAkB;AAC1D,IAAA,MAAM,MAAM,KAAA,CAAM,KAAA,CAAM,yBAAyB,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AAC3D,IAAA,MAAM,MAAM,KAAA,CAAM,KAAA,CAAM,yBAAyB,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AAC3D,IAAA,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,EACzB,CAAC,CAAA;AAGD,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,0BAAA,EAA4B,CAAC,CAAA,EAAG,CAAA,KAC9C,CAAA,EAAA,EAAK,kBAAA,CAAmB,SAAA,CAAU,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAG3C,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,oBAAA,EAAsB,CAAC,GAAG,GAAA,KAAQ;AAChD,IAAA,MAAM,QAAQ,CAAC,GAAG,GAAA,CAAI,QAAA,CAAS,qBAAqB,CAAC,CAAA;AACrD,IAAA,OAAO,KAAK,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,CAAA;AAAA,EACnE,CAAC,CAAA;AACD,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,8BAAA,EAAgC,EAAE,CAAA;AAClD,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,4BAAA,EAA8B,EAAE,CAAA;AAGhD,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,qBAAA,EAAuB,IAAI,CAAA;AAC3C,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,0BAAA,EAA4B,MAAM,CAAA;AAClD,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,yBAAA,EAA2B,EAAE,CAAA;AAG7C,EAAA,EAAA,GAAK,EAAA,CAAG,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AACtC,EAAA,EAAA,GAAK,mBAAmB,EAAE,CAAA;AAE1B,EAAA,OAAO,EAAA,CAAG,OAAA,CAAQ,sBAAA,EAAwB,MAAM,EAAE,IAAA,EAAK;AACzD;AAKA,eAAe,eAAA,CAAgB,OAAA,EAAiB,YAAA,GAA6B,MAAA,EAAQ,QAAA,EAA4E;AAC/J,EAAA,IAAI;AACF,IAAA,MAAM,QAAQ,MAAM;AAAA;AAAA,MAGlB;AAAA,KACF;AACA,IAAA,MAAM,WAAA,GAAc,MAAM,WAAA,CAAY,EAAE,MAAM,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG,CAAA;AACvE,IAAA,MAAM,GAAA,GAAM,MAAM,WAAA,CAAY,OAAA;AAI9B,IAAA,MAAM,aAAa,GAAA,CAAI,QAAA;AACvB,IAAA,MAAM,iBAAiB,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,UAAU,CAAA,GAAI,UAAA;AACnE,IAAA,MAAM,YAAsB,EAAC;AAE7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,cAAA,EAAgB,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA;AAChC,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,EAAe;AAC9C,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,KAAA,CAC1B,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,GAAA,IAAO,EAAE,CAAA,CAC1B,IAAA,CAAK,GAAG,CAAA;AACX,MAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,IACzB;AAGA,IAAA,MAAM,SAAA,GAAY,YAAA,KAAiB,UAAA,GAAa,aAAA,GAAgB,MAAA;AAChE,IAAA,OAAOE,EAAAA,CAAG,EAAE,IAAA,EAAM,SAAA,CAAU,KAAK,SAAS,CAAA,EAAG,SAAA,EAAW,UAAA,EAAY,CAAA;AAAA,EACtE,SACO,KAAA,EAAO;AACZ,IAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,iBAAA,EAAmB,GAAA,CAAI,sBAAsB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,EACjH;AACF;AAQA,eAAe,gBAAA,CAAiB,OAAA,EAAiB,YAAA,GAA6B,MAAA,EAAoC;AAChH,EAAA,IAAI;AACF,IAAA,MAAM,UAAU,MAAM;AAAA;AAAA,MAGpB;AAAA,KACF;AAIA,IAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,MAAA,MAAMU,UAAS,MAAM,OAAA,CAAQ,cAAc,EAAE,MAAA,EAAQ,SAAS,CAAA;AAC9D,MAAA,OAAOX,EAAAA,CAAG,cAAA,CAAeW,OAAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACxC;AACA,IAAA,MAAM,SAAS,MAAM,OAAA,CAAQ,eAAe,EAAE,MAAA,EAAQ,SAAS,CAAA;AAC/D,IAAA,OAAOX,EAAAA,CAAG,OAAO,KAAK,CAAA;AAAA,EACxB,SACO,KAAA,EAAO;AACZ,IAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,iBAAA,EAAmB,GAAA,CAAI,sBAAsB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,EACjH;AACF;AAKA,eAAe,kBACb,OAAA,EACA,QAAA,EACA,QACA,KAAA,EACA,YAAA,GAA6B,QAC7B,YAAA,EAC4B;AAC5B,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,CAAA,KAAA,EAAQ,QAAQ,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,YAAA,KAAiB,UAAA,GACnC,2LAAA,GACA,+HAAA;AACJ,EAAA,MAAM,SAAS,YAAA,IAAgB,aAAA;AAE/B,EAAAJ,SAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,QAAA,EAAU,OAAO,CAAA;AAE9D,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK;AAAA,IAC/B,KAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,WAAA;AAAA,YACN,SAAA,EAAW,EAAE,GAAA,EAAK,OAAA,EAAS,QAAQ,MAAA;AAAO,WAC5C;AAAA,UACA;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA;AACR;AACF;AACF;AACF,GACD,CAAA;AAED,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAOI,IAAI,UAAA,CAAW,eAAA,EAAiB,GAAA,CAAI,kBAAA,EAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,MAAM,OAAA,EAAQ,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,EAC3H;AAEA,EAAA,OAAOD,EAAAA,CAAG,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAA,EAAS,WAAW,EAAE,CAAA;AAC1D;AASO,SAAS,oBAAA,CAAqB,QAAkB,MAAA,EAAuC;AAM5F,EAAA,eAAe,OACb,OAAA,EACA,QAAA,EACA,QAAA,EACA,KAAA,EACA,cACA,YAAA,EACqC;AACrC,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,MAAA,CAAO,GAAA,EAAK,OAAO,KAAA,EAAO;AAAA,MACjE,oBAAA,EAAsB,IAAI,gBAAA,EAAkB,EAAE,QAAQ,EAAE,KAAA,EAAO,6BAAA,EAA8B,EAAG;AAAA,KACjG,CAAA;AACD,IAAA,IAAI,CAAC,cAAA,CAAe,OAAA;AAClB,MAAA,OAAO,cAAA;AAET,IAAA,MAAM,YAAY,MAAM,iBAAA;AAAA,MACtB,OAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAe,IAAA,CAAK,KAAA;AAAA,MACpB,YAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,SAAA,CAAU,OAAA;AACb,MAAA,OAAO,SAAA;AAET,IAAA,OAAOA,EAAAA,CAAG;AAAA,MACR,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,MAAA,EAAQ,KAAA;AAAA,MACR,UAAU,EAAE,QAAA,EAAU,UAAU,SAAA,EAAW,SAAA,CAAU,KAAK,MAAA;AAAO,KAClE,CAAA;AAAA,EACH;AAKA,EAAA,eAAe,QAAQ,OAAA,EAAgE;AACrF,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,OAAA,GAAU,IAAG,GAAI,OAAA;AAC5C,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,OAAA,EAAS,QAAA,EAAU,QAAQ,QAAQ,CAAA;AACnE,IAAA,MAAM,YAAA,GAA6B,QAAQ,YAAA,IAAgB,MAAA;AAE3D,IAAAH,QAAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,QAAA,EAAU,UAAU,YAAA,EAAc,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAGzF,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAI,CAACC,MAAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AAC7B,QAAA,OAAOG,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,6BAAA,EAA8B,EAAG,CAAC,CAAA;AAAA,MACjI;AACA,MAAA,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU,QAAA,EAAU,QAAQ,KAAA,EAAO,YAAA,EAAc,QAAQ,YAAY,CAAA;AAAA,IAC9F;AAGA,IAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACjC,MAAA,MAAM,IAAA,GAAO,iBAAiB,OAAO,CAAA;AACrC,MAAA,OAAOD,EAAAA,CAAG;AAAA,QACR,IAAA;AAAA,QACA,MAAA,EAAQ,MAAA;AAAA,QACR,UAAU,EAAE,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,KAAK,MAAA;AAAO,OACxD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,MAAA,MAAM,OAAO,YAAA,KAAiB,UAAA,GAAa,eAAe,OAAO,CAAA,GAAI,iBAAiB,OAAO,CAAA;AAC7F,MAAA,OAAOA,EAAAA,CAAG;AAAA,QACR,IAAA;AAAA,QACA,MAAA,EAAQ,MAAA;AAAA,QACR,UAAU,EAAE,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,KAAK,MAAA;AAAO,OACxD,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,aAAa,iBAAA,EAAmB;AAClC,MAAA,IAAI,CAACF,MAAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AAC7B,QAAA,OAAOG,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,qCAAA,EAAsC,EAAG,CAAC,CAAA;AAAA,MACzI;AACA,MAAA,MAAM,YAAY,MAAM,eAAA,CAAgB,OAAA,EAAS,YAAA,EAAc,QAAQ,QAAQ,CAAA;AAC/E,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,OAAOD,EAAAA,CAAG;AAAA,UACR,IAAA,EAAM,UAAU,IAAA,CAAK,IAAA;AAAA,UACrB,MAAA,EAAQ,KAAA;AAAA,UACR,SAAA,EAAW,UAAU,IAAA,CAAK,SAAA;AAAA,UAC1B,QAAA,EAAU,EAAE,QAAA,EAAU,QAAA,EAAU,WAAW,SAAA,CAAU,IAAA,CAAK,KAAK,MAAA;AAAO,SACvE,CAAA;AAAA,MACH;AACA,MAAAH,QAAAA,CAAO,IAAA,CAAK,+CAAA,EAAiD,EAAE,UAAU,CAAA;AACzE,MAAA,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU,QAAA,EAAU,QAAQ,KAAA,EAAO,YAAA,EAAc,QAAQ,YAAY,CAAA;AAAA,IAC9F;AAGA,IAAA,IACE,QAAA,KAAa,yEAAA,IACV,QAAA,KAAa,oBAAA,IACb,aAAa,iBAAA,EAChB;AACA,MAAA,IAAI,CAACC,MAAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AAC7B,QAAA,OAAOG,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,sCAAA,EAAuC,EAAG,CAAC,CAAA;AAAA,MAC1I;AACA,MAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,OAAA,EAAS,YAAY,CAAA;AAC/D,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,OAAOD,EAAAA,CAAG;AAAA,UACR,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,MAAA,EAAQ,MAAA;AAAA,UACR,UAAU,EAAE,QAAA,EAAU,UAAU,SAAA,EAAW,UAAA,CAAW,KAAK,MAAA;AAAO,SACnE,CAAA;AAAA,MACH;AACA,MAAAH,QAAAA,CAAO,IAAA,CAAK,gDAAA,EAAkD,EAAE,UAAU,CAAA;AAC1E,MAAA,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU,QAAA,EAAU,QAAQ,KAAA,EAAO,YAAA,EAAc,QAAQ,YAAY,CAAA;AAAA,IAC9F;AAGA,IAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAClC,MAAA,IAAI,CAACC,MAAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AAC7B,QAAA,OAAOG,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,mCAAA,EAAoC,EAAG,CAAC,CAAA;AAAA,MACvI;AACA,MAAA,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU,QAAA,EAAU,QAAQ,KAAA,EAAO,YAAA,EAAc,QAAQ,YAAY,CAAA;AAAA,IAC9F;AAGA,IAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS,EAAG,CAAC,CAAA;AAAA,EAC1G;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,MAAM,OAAA,EAAgE;AAC1E,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,QAAQ,OAAO,CAAA;AAAA,MAC9B,SACO,KAAA,EAAO;AACZ,QAAAJ,QAAAA,CAAO,MAAM,gCAAA,EAAkC,EAAE,UAAU,OAAA,CAAQ,QAAA,EAAU,OAAO,CAAA;AACpF,QAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,iBAAA,EAAmB,GAAA,CAAI,sBAAsB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACjH;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,SAAA,CAAU,OAAA,EAA0B,QAAA,EAA+C;AACvF,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAM,EAAE,OAAA,EAAS,UAAU,CAAA;AACrD,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,QAAA,OAAO,MAAA;AACT,MAAA,OAAOD,EAAAA,CAAG,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,IAC5B;AAAA,GACF;AACF;AC5hBA,IAAMH,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,kBAAA,EAAoB,CAAA;AAC5E,IAAM,4BAAA,GAA+B,kBAAA;AACrC,IAAM,6BAAA,GAAgC,SAAA;AAqB/B,IAAM,oBAAA,GAAuB,CAAC,QAAA,EAAU,SAAA,EAAW,WAAW,cAAA,EAAgB,UAAA,EAAY,SAAS,OAAO,CAAA;AAKjH,SAAS,4BAA4B,WAAA,EAA+B;AAClE,EAAA,MAAM,QAAA,GAAW,YAAY,GAAA,CAAI,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACzD,EAAA,OAAO,CAAA;;AAAA;AAAA;AAAA,iBAAA,EAIU,QAAQ,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iEAAA,CAAA;AAU3B;AAcA,eAAsB,eAAA,CACpB,GAAA,EACA,IAAA,EACA,KAAA,EACA,aACA,YAAA,EACuC;AACvC,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,IAAA,OAAOI,EAAAA,CAAG,EAAE,CAAA;AAAA,EACd;AAEA,EAAA,MAAM,gBAAgB,WAAA,IAAe,oBAAA;AACrC,EAAA,MAAM,cAAA,GAAiB,YAAA,IAAgB,2BAAA,CAA4B,aAAa,CAAA;AAEhF,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,IAAA,CAAK;AAAA,MAChC,KAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,cAAA,EAAe;AAAA,QAC1C,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA;AAAK,OAChC;AAAA,MACA,WAAA,EAAa,GAAA;AAAA,MACb,aAAA,EAAe;AAAA,KAChB,CAAA;AAED,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAAH,SAAO,IAAA,CAAK,mCAAA,EAAqC,EAAE,KAAA,EAAO,UAAA,CAAW,OAAO,CAAA;AAC5E,MAAA,OAAOI,IAAI,UAAA,CAAW,+BAAA,EAAiC,IAAI,iCAAA,EAAmC,EAAE,QAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,UAAA,CAAW,MAAM,OAAO,CAAA,IAAK,CAAA,EAAG,WAAW,KAAK,CAAA;AAAA,IAC1K;AAEA,IAAA,MAAM,UAAU,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAGhE,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,aAAa,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,OAAA,EAAS,UAAU,CAAA;AACxD,IAAAJ,QAAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,UAAA,EAAY,KAAK,MAAA,EAAQ,WAAA,EAAa,QAAA,CAAS,MAAA,EAAQ,CAAA;AAErG,IAAA,OAAOG,GAAG,QAAQ,CAAA;AAAA,EACpB,SACO,KAAA,EAAO;AACZ,IAAAH,QAAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,OAAO,CAAA;AAClD,IAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,+BAAA,EAAiC,GAAA,CAAI,mCAAmC,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,EAC5I;AACF;AAOA,SAAS,mBAAA,CAAoB,SAAiB,UAAA,EAA4C;AACxF,EAAA,IAAI,OAAA,GAAU,QAAQ,IAAA,EAAK;AAG3B,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAC7B,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQ,4BAAA,EAA8B,EAAE,CAAA,CAAE,OAAA,CAAQ,+BAA+B,EAAE,CAAA;AAAA,EACvG;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAGjC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,OAAO,MAAA,CACJ,OAAO,aAAa,CAAA,CACpB,IAAI,CAAA,CAAA,KAAK,eAAA,CAAgB,CAAA,EAAG,UAAU,CAAC,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,IAAQ,cAAc,MAAA,EAAQ;AACzE,MAAA,MAAM,WAAY,MAAA,CAAiC,QAAA;AACnD,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,QAAA,OAAO,QAAA,CAAS,OAAO,aAAa,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,eAAA,CAAgB,CAAA,EAAG,UAAU,CAAC,CAAA;AAAA,MAC/E;AAAA,IACF;AAEA,IAAAJ,QAAAA,CAAO,IAAA,CAAK,8CAAA,EAAgD,EAAE,OAAA,EAAS,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AAC9F,IAAA,OAAO,EAAC;AAAA,EACV,CAAA,CAAA,MACM;AACJ,IAAAA,QAAAA,CAAO,IAAA,CAAK,yCAAA,EAA2C,EAAE,OAAA,EAAS,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AACzF,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAKA,SAAS,cAAc,IAAA,EAAgD;AACrE,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA;AACvC,IAAA,OAAO,KAAA;AACT,EAAA,MAAM,GAAA,GAAM,IAAA;AACZ,EAAA,OAAO,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,KAAK,MAAA,GAAS,CAAA,IACpD,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA;AAC3B;AAQA,SAAS,eAAA,CAAgB,MAA+B,UAAA,EAA0C;AAChG,EAAA,MAAM,OAAO,UAAA,CAAW,GAAA,CAAI,KAAK,IAAc,CAAA,GAAI,KAAK,IAAA,GAAiB,OAAA;AAEzE,EAAA,OAAO;AAAA,IACL,IAAA,EAAO,IAAA,CAAK,IAAA,CAAgB,IAAA,EAAK;AAAA,IACjC,IAAA;AAAA,IACA,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,IAAK,IAAA,CAAK,OAAA,CAAqB,GAAA,CAAI,MAAM,CAAA,GAAI,MAAA;AAAA,IAChF,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA,KAAgB,WAAW,IAAA,CAAK,WAAA,CAAY,MAAK,GAAI;AAAA,GAChF;AACF;AAgBA,eAAsB,qBACpB,GAAA,EACA,MAAA,EACA,OACA,WAAA,EACA,YAAA,EACA,cAAc,CAAA,EACuD;AAErE,EAAA,MAAM,cAAmE,EAAC;AAE1E,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,WAAA,EAAa;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI,WAAW,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC5B,KAAA,CAAM,GAAA,CAAI,OAAO,KAAA,KAAU;AACzB,QAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,GAAA,EAAK,MAAM,OAAA,EAAS,KAAA,EAAO,aAAa,YAAY,CAAA;AACzF,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,QAAQ,CAAA,EAAG,OAAA,EAAS,KAAA,CAAM,OAAA,EAAQ,CAAE,CAAA;AAAA,QACrE;AACA,QAAAA,SAAO,IAAA,CAAK,oCAAA,EAAsC,EAAE,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AAC5E,QAAA,OAAO,EAAC;AAAA,MACV,CAAC;AAAA,KACH;AAEA,IAAA,KAAA,MAAW,YAAY,OAAA,EAAS;AAC9B,MAAA,WAAA,CAAY,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsD;AAE5E,EAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,OAAA,EAAQ,IAAK,WAAA,EAAa;AAC7C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,WAAA,EAAY;AACpC,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAElC,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AACxC,QAAA,QAAA,CAAS,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,MAChC;AAEA,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAM,kBAAkB,IAAI,GAAA,CAAI,QAAA,CAAS,OAAA,IAAW,EAAE,CAAA;AACtD,QAAA,KAAA,MAAW,KAAA,IAAS,OAAO,OAAA,EAAS;AAClC,UAAA,eAAA,CAAgB,IAAI,KAAK,CAAA;AAAA,QAC3B;AACA,QAAA,QAAA,CAAS,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,eAAe,CAAA;AAAA,MAC/C;AAEA,MAAA,IAAI,MAAA,CAAO,WAAA,KAAgB,CAAC,QAAA,CAAS,WAAA,IAAe,OAAO,WAAA,CAAY,MAAA,GAAS,QAAA,CAAS,WAAA,CAAY,MAAA,CAAA,EAAS;AAC5G,QAAA,QAAA,CAAS,cAAc,MAAA,CAAO,WAAA;AAAA,MAChC;AAAA,IACF,CAAA,MACK;AACH,MAAA,SAAA,CAAU,GAAA,CAAI,KAAK,EAAE,GAAG,QAAQ,QAAA,EAAU,CAAC,OAAO,CAAA,EAAG,CAAA;AAAA,IACvD;AAAA,EACF;AAEA,EAAA,OAAOG,GAAG,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAC,CAAA;AAC1C;;;ACxNA,IAAMH,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,WAAA,EAAa,CAAA;AAIrE,IAAM,mCAAA,GAAsC,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,wCAAA,CAAA;AAqBrC,SAAS,yBAAA,CACd,MAAA,EACA,GAAA,EACA,SAAA,EACAgB,WACA,KAAA,EACqB;AAMrB,EAAA,eAAe,kBAAkB,UAAA,EAAsC;AACrE,IAAA,IAAI,CAAC,KAAA;AACH,MAAA,OAAO,KAAA;AACT,IAAA,OAAO,MAAM,KAAA,CAAM,gBAAA,CAAiB,UAAU,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYL,MAAM,MAAM,OAAA,EAA2D;AACrE,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAOX,GAAAA,CAAI,UAAA,CAAW,sBAAA,EAAwB,GAAA,CAAI,yBAAA,EAA2B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,8EAAA,EAA+E,EAAG,CAAC,CAAA;AAAA,MACrL;AAEA,MAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,IAAc,MAAA,CAAO,UAAA;AACjD,MAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,IAAa,MAAA,CAAO,SAAA;AAE/C,MAAAJ,SAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,UAAA,EAAY,WAAW,CAAA;AAEnE,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,CAAM,UAAA,CAAW,UAAA,EAAY,SAAS,CAAA;AAC5C,QAAA,MAAM,KAAA,CAAM,kBAAA,CAAmB,UAAA,EAAY,SAAS,CAAA;AAEpD,QAAAA,QAAAA,CAAO,KAAA,CAAM,gCAAA,EAAkC,EAAE,YAAY,CAAA;AAC7D,QAAA,OAAOG,GAAG,KAAA,CAAS,CAAA;AAAA,MACrB,SACO,KAAA,EAAO;AACZ,QAAAH,QAAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,OAAO,CAAA;AACrD,QAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,sBAAA,EAAwB,GAAA,CAAI,2BAA2B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC3H;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAqBA,MAAM,OAAO,KAAA,EAAwE;AACnF,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,IAAc,MAAA,CAAO,UAAA;AAC9C,MAAA,IAAI,CAAC,MAAM,iBAAA,CAAkB,UAAU,CAAA,EAAG;AACxC,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,sBAAsB,CAAC,CAAA;AAAA,MACxE;AAEA,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,sBAAA,GAAyB,KAAA,CAAM,sBAAA,IAA0B,MAAA,CAAO,sBAAA;AAEtE,MAAA,MAAM,YAAA,GAAkC;AAAA,QACtC,GAAG,MAAA,CAAO,YAAA;AAAA,QACV,GAAG,KAAA,CAAM;AAAA,OACX;AACA,MAAA,MAAM,YAAA,GAAkC;AAAA,QACtC,GAAG,MAAA,CAAO,YAAA;AAAA,QACV,GAAG,KAAA,CAAM;AAAA,OACX;AAEA,MAAAJ,QAAAA,CAAO,KAAA,CAAM,oBAAA,EAAsB,EAAE,UAAA,EAAY,KAAA,CAAM,UAAA,EAAY,UAAA,EAAY,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAEpH,MAAA,IAAI;AAEF,QAAA,MAAM,WAAA,GAAce,SAAAA,CAAS,KAAA,CAAM,KAAA,CAAM,SAAS,YAAY,CAAA;AAC9D,QAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,GAAU,WAAA,CAAY,OAAO,KAAA,CAAM,OAAA;AAGnE,QAAA,MAAM,WAAA,GAAcA,SAAAA,CAAS,KAAA,CAAM,WAAA,EAAa,YAAY,CAAA;AAC5D,QAAA,MAAM,MAAA,GAAwF,WAAA,CAAY,OAAA,GACtG,WAAA,CAAY,IAAA,GACZ,CAAC,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,WAAA,EAAa,CAAA;AAGvC,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AACvC,QAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,UAAA,CAAW,KAAK,CAAA;AACpD,QAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,UAAA,OAAOX,GAAAA,CAAI,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,4BAA4B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,kBAAA,EAAmB,EAAG,CAAA,EAAG,YAAY,KAAK,CAAA;AAAA,QAC9I;AAGA,QAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,CAAA,KAAM;AAC/C,UAAA,MAAM,UAAU,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA,OAAA,EAAU,MAAM,KAAK,CAAA,CAAA;AACxD,UAAA,OAAO;AAAA,YACL,EAAA,EAAI,OAAA;AAAA,YACJ,MAAA,EAAQ,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAAA,YAC1B,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,QAAA,EAAU;AAAA,cACR,GAAG,KAAA,CAAM,QAAA;AAAA,cACT,GAAG,KAAA,CAAM,QAAA;AAAA,cACT,YAAY,KAAA,CAAM,UAAA;AAAA,cAClB,OAAO,KAAA,CAAM,KAAA;AAAA,cACb,KAAK,KAAA,CAAM,GAAA;AAAA,cACX,QAAA,EAAU,CAAA,MAAA,EAAS,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,cAC9B,YAAY,KAAA,CAAM;AAAA;AACpB,WACF;AAAA,QACF,CAAC,CAAA;AAED,QAAA,MAAM,KAAA,CAAO,aAAA,CAAc,UAAA,EAAY,eAAe,CAAA;AAGtD,QAAA,MAAM,MAAO,cAAA,CAAe;AAAA,UAC1B,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,UAAA;AAAA,UACA,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,KAAK,KAAA,CAAM,GAAA;AAAA,UACX,YAAY,MAAA,CAAO,MAAA;AAAA,UACnB,SAAA,EAAW,KAAK,GAAA;AAAI,SACrB,CAAA;AAGD,QAAA,MAAM,oBAAuC,EAAC;AAE9C,QAAA,IAAI,sBAAA,EAAwB;AAC1B,UAAA,MAAM,WAAA,GAAc,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,YACvC,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,SAAS,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA,OAAA,EAAU,MAAM,KAAK,CAAA;AAAA,WACnD,CAAE,CAAA;AAEF,UAAA,MAAM,YAAA,GAAe,MAAM,oBAAA,CAAqB,GAAA,EAAK,aAAa,KAAA,CAAA,EAAW,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,YAAY,CAAA;AACpH,UAAA,IAAI,aAAa,OAAA,EAAS;AAExB,YAAA,KAAA,MAAW,MAAA,IAAU,aAAa,IAAA,EAAM;AACtC,cAAA,MAAM,QAAA,GAAW,CAAA,IAAA,EAAOY,MAAAA,CAAO,EAAE,CAAC,CAAA,CAAA;AAClC,cAAA,MAAM,eAAA,GAAmC;AAAA,gBACvC,EAAA,EAAI,QAAA;AAAA,gBACJ,MAAM,MAAA,CAAO,IAAA;AAAA,gBACb,MAAM,MAAA,CAAO,IAAA;AAAA,gBACb,SAAS,MAAA,CAAO,OAAA;AAAA,gBAChB,aAAa,MAAA,CAAO;AAAA,eACtB;AACA,cAAA,iBAAA,CAAkB,KAAK,eAAe,CAAA;AAGtC,cAAA,MAAM,MAAO,YAAA,CAAa;AAAA,gBACxB,EAAA,EAAI,QAAA;AAAA,gBACJ,MAAM,MAAA,CAAO,IAAA;AAAA,gBACb,MAAM,MAAA,CAAO,IAAA;AAAA,gBACb,UAAA;AAAA,gBACA,SAAS,MAAA,CAAO,OAAA;AAAA,gBAChB,aAAa,MAAA,CAAO;AAAA,eACrB,CAAA;AAGD,cAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,gBAAA,MAAM,MAAO,oBAAA,CAAqB;AAAA,kBAChC,QAAA;AAAA,kBACA,YAAY,KAAA,CAAM,UAAA;AAAA,kBAClB,OAAA;AAAA,kBACA,UAAA;AAAA,kBACA,SAAA,EAAW,CAAA;AAAA,kBACX,SAAS,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,EAAG,MAAM,UAAU,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,OAAO,OAAO,CAAA,EAAG,OAAA,EAAS,KAAA,CAAM,GAAG,GAAG;AAAA,iBACrG,CAAA;AAAA,cACH;AAAA,YACF;AAAA,UACF,CAAA,MACK;AACH,YAAAhB,SAAO,IAAA,CAAK,oCAAA,EAAsC,EAAE,KAAA,EAAO,YAAA,CAAa,OAAO,CAAA;AAAA,UACjF;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,QAAAA,QAAAA,CAAO,MAAM,mBAAA,EAAqB;AAAA,UAChC,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,YAAY,MAAA,CAAO,MAAA;AAAA,UACnB,aAAa,iBAAA,CAAkB,MAAA;AAAA,UAC/B;AAAA,SACD,CAAA;AAED,QAAA,OAAOG,EAAAA,CAAG;AAAA,UACR,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,YAAY,MAAA,CAAO,MAAA;AAAA,UACnB,QAAA,EAAU,iBAAA;AAAA,UACV;AAAA,SACD,CAAA;AAAA,MACH,SACO,KAAA,EAAO;AACZ,QAAAH,QAAAA,CAAO,MAAM,2BAAA,EAA6B,EAAE,YAAY,KAAA,CAAM,UAAA,EAAY,OAAO,CAAA;AACjF,QAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,4BAA4B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC7H;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaA,MAAM,QAAA,CAAS,KAAA,EAAe,OAAA,EAAiF;AAC7G,MAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,IAAc,MAAA,CAAO,UAAA;AACjD,MAAA,IAAI,CAAC,MAAM,iBAAA,CAAkB,UAAU,CAAA,EAAG;AACxC,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,sBAAsB,CAAC,CAAA;AAAA,MACxE;AAEA,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,EAAA;AAC9B,MAAA,MAAM,iBAAA,GAAoB,SAAS,iBAAA,IAAqB,IAAA;AAExD,MAAAJ,QAAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,UAAA,EAAY,IAAA,EAAM,CAAA;AAEpF,MAAA,IAAI;AAEF,QAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,SAAA,CAAU,KAAK,CAAA;AACnD,QAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,UAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,yBAAA,EAA2B,GAAA,CAAI,8BAA8B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,wBAAA,EAAyB,EAAG,CAAA,EAAG,YAAY,KAAK,CAAA;AAAA,QACxJ;AAGA,QAAA,MAAM,aAAa,MAAM,KAAA,CAAO,aAAA,CAAc,UAAA,EAAY,YAAY,IAAA,EAAM;AAAA,UAC1E,MAAM,IAAA,GAAO,CAAA;AAAA;AAAA,UACb,UAAU,OAAA,EAAS,QAAA;AAAA,UACnB,QAAQ,OAAA,EAAS;AAAA,SAClB,CAAA;AAGD,QAAA,MAAM,OAAA,uBAAc,GAAA,EAAmC;AACvD,QAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,UAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,IAAY,EAAC;AAClC,UAAA,MAAM,QAAA,GAAqB;AAAA,YACzB,YAAY,QAAA,CAAS,UAAA;AAAA,YACrB,OAAO,QAAA,CAAS,KAAA;AAAA,YAChB,KAAK,QAAA,CAAS,GAAA;AAAA,YACd,UAAU,QAAA,CAAS,QAAA;AAAA,YACnB,SAAS,GAAA,CAAI,EAAA;AAAA,YACb;AAAA,WACF;AAEA,UAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,EAAA,EAAI;AAAA,YAClB,IAAI,GAAA,CAAI,EAAA;AAAA,YACR,OAAA,EAAS,IAAI,OAAA,IAAW,EAAA;AAAA,YACxB,OAAO,GAAA,CAAI,KAAA;AAAA,YACX,QAAA;AAAA,YACA,QAAA;AAAA,YACA,iBAAiB;AAAC,WACnB,CAAA;AAAA,QACH;AAGA,QAAA,IAAI,iBAAA,EAAmB;AACrB,UAAA,MAAM,oBAAoB,MAAM,eAAA;AAAA,YAC9B,GAAA;AAAA,YACA,KAAA;AAAA,YACA,KAAA,CAAA;AAAA,YACA,MAAA,CAAO,WAAA;AAAA,YACP,MAAA,CAAO;AAAA,WACT;AACA,UAAA,MAAM,gBAAA,GAAmB,iBAAA,CAAkB,OAAA,GACvC,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,GACtC,EAAC;AAEL,UAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAE/B,YAAA,MAAM,SAAA,uBAAgB,GAAA,EAA2E;AACjG,YAAA,KAAA,MAAW,QAAQ,gBAAA,EAAkB;AACnC,cAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAO,kBAAA,CAAmB,MAAM,UAAU,CAAA;AACjE,cAAA,KAAA,MAAW,CAAA,IAAK,QAAA;AACd,gBAAA,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,YACzB;AAEA,YAAA,IAAI,SAAA,CAAU,OAAO,CAAA,EAAG;AACtB,cAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAC7C,cAAA,MAAM,gBAAgB,IAAI,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,UAAU,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,OAAK,CAAC,CAAA,CAAE,IAAI,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAErF,cAAA,MAAM,YAAA,GAAe,MAAM,KAAA,CAAO,wBAAA,CAAyB,WAAW,UAAU,CAAA;AAChF,cAAA,MAAM,cAAc,MAAA,CAAO,iBAAA;AAE3B,cAAA,KAAA,MAAW,YAAY,YAAA,EAAc;AACnC,gBAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,UAAA;AAC9C,gBAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAA,IAAK,EAAA;AAE3D,gBAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,CAAA,IAAK,OAAA,EAAS;AACpC,kBAAA,MAAM,SAAA,GAAY,KAAK,QAAA,EAAU,UAAA;AACjC,kBAAA,IAAI,MAAA,KAAW,QAAA,IAAY,SAAA,KAAc,QAAA,CAAS,UAAA,EAAY;AAC5D,oBAAA,IAAA,CAAK,KAAA,IAAS,cAAc,QAAA,CAAS,SAAA;AACrC,oBAAA,IAAI,cAAc,CAAC,IAAA,CAAK,eAAA,CAAiB,QAAA,CAAS,UAAU,CAAA,EAAG;AAC7D,sBAAA,IAAA,CAAK,eAAA,CAAiB,KAAK,UAAU,CAAA;AAAA,oBACvC;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,QAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,QAAQ,MAAA,EAAQ,EACtC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA,CAChC,KAAA,CAAM,GAAG,IAAI,CAAA;AAGhB,QAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAC9C,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,cAAc,IAAA,CAAK,QAAA,CAAS,WAAW,IAAA,CAAK,EAAA;AACtE,UAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,YAAA,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,QAAQ,CAAA;AAAA,UACpC;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,QAAAJ,QAAAA,CAAO,MAAM,+BAAA,EAAiC,EAAE,aAAa,KAAA,CAAM,MAAA,EAAQ,UAAU,CAAA;AAErF,QAAA,OAAOG,EAAAA,CAAG;AAAA,UACR,KAAA;AAAA,UACA,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,UAC1C,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH,SACO,KAAA,EAAO;AACZ,QAAAH,QAAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,OAAO,CAAA;AACpD,QAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,yBAAA,EAA2B,GAAA,CAAI,8BAA8B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACjI;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAYA,MAAM,GAAA,CAAI,KAAA,EAAe,OAAA,EAAuE;AAE9F,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,QAAA,CAAS,OAAO,OAAO,CAAA;AACzD,MAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC3B,QAAA,OAAOA,IAAI,UAAA,CAAW,UAAA,EAAY,GAAA,CAAI,cAAA,EAAgB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,cAAA,CAAe,MAAM,OAAA,EAAQ,EAAG,CAAA,EAAG,eAAe,KAAK,CAAA;AAAA,MAClI;AAEA,MAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,cAAA,CAAe,IAAA;AAG5C,MAAA,MAAM,WAAA,GAAc,MAAM,MAAA,GAAS,CAAA,GAC/B,MAAM,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AACrB,QAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS,KAAA,IAAS,KAAK,QAAA,CAAS,UAAA,IAAc,IAAA,CAAK,QAAA,CAAS,OAAA,IAAW,SAAA;AAC3F,QAAA,OAAO,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,WAAA,EAAc,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,EAAM,KAAK,OAAO,CAAA,CAAA;AAAA,MACzF,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,GACd,4BAAA;AAGJ,MAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,mCAAA;AAC9C,MAAA,MAAM,aAAA,GAAgB,GAAG,YAAY;;AAAA;AAAA,EAAwB,WAAW;AAAA,mBAAA,CAAA;AAExE,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC9B,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,aAAA;AAAc,OAC3C;AAGA,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,QAAA,CAAS,IAAA,CAAK,GAAG,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACnC;AAEA,MAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAG9C,MAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,IAAA,CAAK;AAAA,QAChC,OAAO,OAAA,EAAS,KAAA;AAAA,QAChB,QAAA;AAAA,QACA,aAAa,OAAA,EAAS;AAAA,OACvB,CAAA;AAED,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,QAAA,OAAOA,IAAI,UAAA,CAAW,UAAA,EAAY,GAAA,CAAI,cAAA,EAAgB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,UAAA,CAAW,MAAM,OAAA,EAAQ,EAAG,CAAA,EAAG,WAAW,KAAK,CAAA;AAAA,MAC1H;AAEA,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AACxC,MAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,OAAA,EAAS,OAAA,IAAW,EAAA;AAE3C,MAAAJ,QAAAA,CAAO,MAAM,yBAAA,EAA2B;AAAA,QACtC,cAAc,KAAA,CAAM,MAAA;AAAA,QACpB,KAAA,EAAO,WAAW,IAAA,CAAK;AAAA,OACxB,CAAA;AAED,MAAA,OAAOG,EAAAA,CAAG;AAAA,QACR,MAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,SAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA,EAAO,WAAW,IAAA,CAAK,KAAA;AAAA,QACvB,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAA,GACnB;AAAA,UACE,aAAA,EAAe,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,aAAA;AAAA,UACrC,iBAAA,EAAmB,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,iBAAA;AAAA,UACzC,YAAA,EAAc,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM;AAAA,SACtC,GACA;AAAA,OACL,CAAA;AAAA,IACH,CAAA;AAAA;AAAA,IAGA,MAAM,YAAA,CAAa,UAAA,EAAoB,OAAA,EAA0E;AAC/G,MAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,IAAc,MAAA,CAAO,UAAA;AACjD,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAM,iBAAA,CAAkB,UAAU,CAAA,EAAG;AAClD,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,sBAAsB,CAAC,CAAA;AAAA,MACxE;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,gBAAA,CAAiB,UAAA,EAAY;AAAA,UACvD,UAAA;AAAA,UACA,MAAM,OAAA,EAAS;AAAA,SAChB,CAAA;AAED,QAAA,OAAOD,EAAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,UAC7B,MAAA,EAAQ;AAAA,YACN,EAAA,EAAI,KAAK,MAAA,CAAO,EAAA;AAAA,YAChB,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,YAClB,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,YAClB,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,YACrB,WAAA,EAAa,IAAA,CAAK,MAAA,CAAO,WAAA,IAAe,KAAA;AAAA,WAC1C;AAAA,UACA,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,YACpC,YAAY,GAAA,CAAI,UAAA;AAAA,YAChB,OAAA,EAAS,IAAI,OAAA,IAAW,KAAA,CAAA;AAAA,YACxB,YAAY,GAAA,CAAI,UAAA;AAAA,YAChB,WAAW,GAAA,CAAI,SAAA;AAAA,YACf,OAAA,EAAS,IAAI,OAAA,IAAW,KAAA;AAAA,WAC1B,CAAE;AAAA,UACF,CAAC,CAAA;AAAA,MACL,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,yBAAA,EAA2B,GAAA,CAAI,8BAA8B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACjI;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,MAAM,aAAa,OAAA,EAAoE;AACrF,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,sBAAsB,CAAC,CAAA;AAAA,MACxE;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,YAAA,CAAa;AAAA,UACpC,YAAY,OAAA,EAAS,UAAA;AAAA,UACrB,MAAM,OAAA,EAAS,IAAA;AAAA,UACf,SAAS,OAAA,EAAS,OAAA;AAAA,UAClB,OAAO,OAAA,EAAS;AAAA,SACjB,CAAA;AAED,QAAA,OAAOD,EAAAA,CAAG,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,UACzB,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,WAAA,EAAa,IAAI,WAAA,IAAe,KAAA,CAAA;AAAA,UAChC,SAAA,EAAW,IAAI,SAAA,IAAa,KAAA,CAAA;AAAA,UAC5B,SAAA,EAAW,IAAI,SAAA,IAAa,KAAA;AAAA,UAC5B,CAAC,CAAA;AAAA,MACL,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,yBAAA,EAA2B,GAAA,CAAI,8BAA8B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACjI;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,MAAM,cAAc,OAAA,EAAqF;AACvG,MAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,IAAc,MAAA,CAAO,UAAA;AACjD,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAM,iBAAA,CAAkB,UAAU,CAAA,EAAG;AAClD,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,sBAAsB,CAAC,CAAA;AAAA,MACxE;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,aAAA,CAAc,UAAA,EAAY;AAAA,UACjD,QAAQ,OAAA,EAAS,MAAA;AAAA,UACjB,OAAO,OAAA,EAAS;AAAA,SACjB,CAAA;AAGD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,UAAU,CAAA;AACzC,QAAA,MAAM,YAAA,GAAe,MAAM,KAAA,CAAM,wBAAA,CAAyB,QAAQ,UAAU,CAAA;AAE5E,QAAA,MAAM,MAAA,GAAkC,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,UACrD,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,KAAA,EAAO,EAAE,KAAA,IAAS,KAAA,CAAA;AAAA,UAClB,GAAA,EAAK,EAAE,GAAA,IAAO,KAAA,CAAA;AAAA,UACd,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,WAAA,EAAa,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,UAAU,CAAA,IAAK,CAAA;AAAA,UAC/C,WAAW,CAAA,CAAE;AAAA,SACf,CAAE,CAAA;AAEF,QAAA,OAAOD,GAAG,MAAM,CAAA;AAAA,MAClB,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,yBAAA,EAA2B,GAAA,CAAI,8BAA8B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACjI;AAAA,IACF,CAAA;AAAA;AAAA,IAGA,MAAM,cAAA,CAAe,UAAA,EAAoB,OAAA,EAAoE;AAC3G,MAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,IAAc,MAAA,CAAO,UAAA;AACjD,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAM,iBAAA,CAAkB,UAAU,CAAA,EAAG;AAClD,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,sBAAsB,CAAC,CAAA;AAAA,MACxE;AAEA,MAAA,IAAI;AAEF,QAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,WAAA,CAAY,YAAY,UAAU,CAAA;AAC9D,QAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,GAAA;AAG1C,QAAA,MAAM,YAAsB,EAAC;AAC7B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,UAAA,SAAA,CAAU,IAAA,CAAK,CAAA,EAAG,UAAU,CAAA,OAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,QAC3C;AAGA,QAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,UAAA,IAAI;AACF,YAAA,MAAM,KAAA,CAAM,aAAA,CAAc,UAAA,EAAY,SAAS,CAAA;AAAA,UACjD,SACO,QAAA,EAAU;AACf,YAAAJ,SAAO,IAAA,CAAK,+BAAA,EAAiC,EAAE,UAAA,EAAY,KAAA,EAAO,UAAU,CAAA;AAAA,UAC9E;AAAA,QACF;AAGA,QAAA,MAAM,KAAA,CAAM,sBAAA,CAAuB,UAAA,EAAY,UAAU,CAAA;AAGzD,QAAA,MAAM,KAAA,CAAM,6BAAA,CAA8B,UAAA,EAAY,UAAU,CAAA;AAGhE,QAAA,MAAM,KAAA,CAAM,cAAA,CAAe,UAAA,EAAY,UAAU,CAAA;AAEjD,QAAAA,SAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,UAAA,EAAY,YAAY,CAAA;AAC3D,QAAA,OAAOG,GAAG,KAAA,CAAS,CAAA;AAAA,MACrB,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,4BAA4B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC7H;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,WAAW,KAAA,EAA4E;AAC3F,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,aAAkB,CAAA;AACpD,QAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,MAAW,CAAA;AAC7C,QAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,KAAA,CAAM,QAAA,EAAU,EAAE,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,OAAA,EAAS,CAAA;AACtF,QAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AACxC,QAAA,MAAM,UAAA,GAAa,MAAM,UAAA,IAAc,QAAA;AAEvC,QAAA,OAAO,KAAK,MAAA,CAAO;AAAA,UACjB,UAAA;AAAA,UACA,OAAA;AAAA,UACA,KAAA,EAAO,MAAM,KAAA,IAAS,QAAA;AAAA,UACtB,KAAK,KAAA,CAAM,QAAA;AAAA,UACX,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,wBAAwB,KAAA,CAAM,sBAAA;AAAA,UAC9B,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,cAAc,KAAA,CAAM;AAAA,SACrB,CAAA;AAAA,MACH,SACO,KAAA,EAAO;AACZ,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,4BAA4B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC7H;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,WAAA,CACJ,MAAA,EACA,UAAA,EACgD;AAChD,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,IAAI,YAAA,GAAe,CAAA;AACnB,MAAA,IAAI,YAAA,GAAe,CAAA;AACnB,MAAA,MAAM,UAAiD,EAAC;AAExD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,QAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,IAAc,CAAA,MAAA,EAAS,CAAC,CAAA,CAAA;AACjD,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAE5C,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,YAAA,EAAA;AACA,UAAA,OAAA,CAAQ,KAAK,EAAE,UAAA,EAAY,MAAA,EAAQ,YAAA,CAAa,MAAM,CAAA;AACtD,UAAA,UAAA,GAAa,EAAE,SAAA,EAAW,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,MAAA,EAAQ,iBAAA,EAAmB,UAAA,EAAY,MAAA,EAAQ,YAAA,CAAa,IAAA,EAAM,CAAA;AAAA,QACnH,CAAA,MACK;AACH,UAAA,YAAA,EAAA;AACA,UAAA,OAAA,CAAQ,KAAK,EAAE,UAAA,EAAY,KAAA,EAAO,YAAA,CAAa,OAAO,CAAA;AACtD,UAAA,UAAA,GAAa,EAAE,SAAA,EAAW,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,MAAA,EAAQ,iBAAA,EAAmB,UAAA,EAAY,KAAA,EAAO,YAAA,CAAa,KAAA,EAAO,CAAA;AAAA,QACnH;AAAA,MACF;AAEA,MAAA,OAAOD,EAAAA,CAAG,EAAE,YAAA,EAAc,YAAA,EAAc,OAAA,EAAS,UAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,EAAW,CAAA;AAAA,IACrF,CAAA;AAAA;AAAA,IAGA,MAAM,iBAAiB,UAAA,EAA+C;AACpE,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,sBAAA,EAAwB,GAAA,CAAI,yBAAA,EAA2B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,8EAAA,EAA+E,EAAG,CAAC,CAAA;AAAA,MACrL;AAEA,MAAA,MAAM,GAAA,GAAM,cAAc,MAAA,CAAO,UAAA;AACjC,MAAAJ,SAAO,KAAA,CAAM,+BAAA,EAAiC,EAAE,UAAA,EAAY,KAAK,CAAA;AAEjE,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,CAAM,iBAAiB,GAAG,CAAA;AAChC,QAAAA,SAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,UAAA,EAAY,KAAK,CAAA;AAChE,QAAA,OAAOG,GAAG,KAAA,CAAS,CAAA;AAAA,MACrB,SACO,KAAA,EAAO;AACZ,QAAAH,SAAO,KAAA,CAAM,sCAAA,EAAwC,EAAE,UAAA,EAAY,GAAA,EAAK,OAAO,CAAA;AAC/E,QAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,sBAAA,EAAwB,GAAA,CAAI,2BAA2B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC3H;AAAA,IACF;AAAA,GACF;AACF;AClrBA,IAAM,uBAAA,GAA0B,GAAA;AAQhC,SAAS,uBAAA,CACP,SACA,aAAA,EACsD;AACtD,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,SAAA,GAAY,OAAA,EAAS,QAAA,KAAa,MAAA,GACpC,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,QAAA,GAAW,GAAG,CAAA,GAClC,OAAA,EAAS,aAAa,aAAA,IAAiB,uBAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,GAAA,GAAM,SAAA;AAE5C,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AACnD,EAAA,MAAM,MAAA,GAAS,OAAA,EAAS,MAAA,GACpB,WAAA,CAAY,GAAA,CAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,aAAa,CAAC,CAAA,GAC/C,aAAA;AAEJ,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,EAAE,MAAA,EAAQ,QAAA,EAAU,SAAS,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,SAAA,EAAW,QAAA,EAAS;AAAA,IACxF;AAAA,GACF;AACF;AAOA,eAAe,mBAAA,CACb,KACA,OAAA,EACY;AACZ,EAAA,MAAM,EAAE,QAAO,GAAI,OAAA;AACnB,EAAA,IAAI,MAAA,CAAO,OAAA;AACT,IAAA,MAAM,IAAI,YAAA,CAAa,SAAA,EAAW,YAAY,CAAA;AAEhD,EAAA,OAAO,MAAM,IAAI,OAAA,CAAW,CAAC,SAAS,MAAA,KAAW;AAC/C,IAAA,MAAM,UAAU,MAAY,MAAA,CAAO,IAAI,YAAA,CAAa,SAAA,EAAW,YAAY,CAAC,CAAA;AAC5E,IAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AACxD,IAAA,OAAA,CAAQ,SAAQ,CACb,IAAA,CAAK,MAAM,GAAA,CAAI,OAAO,CAAC,CAAA,CACvB,IAAA;AAAA,MACC,CAAC,KAAA,KAAU;AACT,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf,CAAA;AAAA,MACA,CAAC,KAAA,KAAmB;AAClB,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,QAAA,MAAA,CAAO,KAAA,YAAiB,QAAQ,KAAA,GAAQ,IAAI,MAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,MAClE;AAAA,KACF;AAAA,EACJ,CAAC,CAAA;AACH;AAGA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,OAAO,iBAAiB,KAAA,KAAU,KAAA,CAAM,IAAA,KAAS,YAAA,IAAgB,MAAM,IAAA,KAAS,cAAA,CAAA;AAClF;AAuBO,SAAS,WACd,OAAA,EACuB;AACvB,EAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,UAAA,EAAY,OAAA,EAAS,WAAU,GAAI,OAAA;AAE9D,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,KAAA,EAAe,WAAA,EAAiE;AAC5F,MAAA,MAAM,WAAA,GAAc,UAAA,CAAW,SAAA,CAAU,KAAK,CAAA;AAC9C,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,sBAAA,EAAwB,WAAA,CAAY,MAAM,OAAO,CAAA;AAAA,MACzE;AACA,MAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,kBAAiB,GAAI,uBAAA,CAAwB,aAAa,SAAS,CAAA;AAC/F,MAAA,MAAM,aAAa,WAAA,EAAa,SAAA;AAChC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAI;AACF,UAAA,MAAM,UAAU,MAAM,mBAAA;AAAA,YACpB,CAAA,GAAA,KAAO,UAAA,CAAW,EAAE,QAAA,EAAU,IAAA,EAAM,OAAO,WAAA,CAAY,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,CAAA;AAAA,YAC3E;AAAA,WACF;AACA,UAAA,IAAI,CAAC,OAAA;AACH,YAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,kBAAA,EAAoB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,QACvF,SACO,KAAA,EAAO;AACZ,UAAA,IAAI,aAAa,KAAK,CAAA;AACpB,YAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,YAAA,EAAc,GAAA,CAAI,kBAAkB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,EAAA,EAAI,gBAAA,EAAiB,EAAG,GAAG,KAAK,CAAA;AAC9G,UAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,kBAAA,EAAoB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,QACrF;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,CAAA,GAAA,KAAO,QAAQ,WAAA,CAAY,IAAA,EAAM,GAAG,CAAA,EAAG,OAAO,CAAA;AACvF,QAAA,OAAOD,GAAG,MAAM,CAAA;AAAA,MAClB,SACO,KAAA,EAAO;AACZ,QAAA,IAAI,aAAa,KAAK,CAAA;AACpB,UAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,YAAA,EAAc,GAAA,CAAI,kBAAkB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,EAAA,EAAI,gBAAA,EAAiB,EAAG,GAAG,KAAK,CAAA;AAC9G,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,qBAAA,EAAuB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,EAAG,KAAK,CAAA;AAAA,MAC5G;AAAA,IACF,CAAA;AAAA,IAEA,YAAA,GAA+B;AAC7B,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU;AAAA,UACR,IAAA;AAAA,UACA,WAAA;AAAA,UACA,UAAA,EAAY,gBAAgB,UAAU;AAAA;AACxC,OACF;AAAA,IACF;AAAA,GACF;AACF;AAmBO,SAAS,kBAAA,CAAmB,OAAA,GAA+B,EAAC,EAA2B;AAC5F,EAAA,MAAM,KAAA,uBAA+B,GAAA,EAAI;AAEzC,EAAA,SAAS,cAAc,IAAA,EAA+B;AACpD,IAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,uBAAA,EAAyB,GAAA,CAAI,0BAAA,EAA4B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,EACtG;AAEA,EAAA,MAAM,QAAA,GAAmC;AAAA;AAAA,IAEvC,SAA0B,IAAA,EAA8C;AACtE,MAAA,IAAI,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AACrB,QAAA,OAAO,aAAA,CAAc,KAAK,IAAI,CAAA;AAChC,MAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAY,CAAA;AACjC,MAAA,OAAOD,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA;AAAA,IAGA,aAAa,QAAA,EAAqD;AAChE,MAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,MAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,QAAA,IAAI,KAAA,CAAM,IAAI,IAAA,CAAK,IAAI,KAAK,aAAA,CAAc,GAAA,CAAI,KAAK,IAAI,CAAA;AACrD,UAAA,OAAO,aAAA,CAAc,KAAK,IAAI,CAAA;AAChC,QAAA,aAAA,CAAc,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,MAC7B;AACA,MAAA,KAAA,MAAW,IAAA,IAAQ,QAAA;AACjB,QAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAY,CAAA;AACnC,MAAA,OAAOA,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA;AAAA,IAGA,QAAyB,IAAA,EAA8C;AACrE,MAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AACtB,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,iBAAA,EAAmB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,EAAG,CAAC,CAAA;AAC/F,MAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAY,CAAA;AACjC,MAAA,OAAOD,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA;AAAA,IAGA,WAAW,IAAA,EAAuB;AAChC,MAAA,OAAO,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,IAC1B,CAAA;AAAA;AAAA,IAGA,IAAI,IAAA,EAAgC;AAClC,MAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA,IACvB,CAAA;AAAA;AAAA,IAGA,IAAI,IAAA,EAAuB;AACzB,MAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA,IACvB,CAAA;AAAA;AAAA,IAGA,QAAA,GAAqB;AACnB,MAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,IAChC,CAAA;AAAA;AAAA,IAGA,cAAA,GAAmC;AACjC,MAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,EAAE,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,YAAA,EAAc,CAAA;AAAA,IACnE,CAAA;AAAA;AAAA,IAGA,MAAM,OAAA,CAAQ,QAAA,EAAoB,WAAA,EAAqE;AAErG,MAAA,IAAI,QAAA,CAAS,SAAS,UAAA,EAAY;AAChC,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,iBAAA,EAAmB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAU,EAAG,CAAC,CAAA;AAAA,MAC/F;AACA,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,SAAS,IAAI,CAAA;AAC7C,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,mBAAmB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,CAAS,QAAA,CAAS,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,MAC5G;AAEA,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA;AAAA,MAC/C,CAAA,CAAA,MACM;AACJ,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,sBAAA,EAAwB,GAAA,CAAI,oBAAoB,CAAC,CAAA;AAAA,MACzE;AAEA,MAAA,MAAM,oBAAoB,OAAA,CAAQ,SAAA;AAClC,MAAA,MAAM,qBAAqB,WAAA,EAAa,SAAA;AACxC,MAAA,MAAM,SAAA,GAAY,iBAAA,IAAqB,kBAAA,GACnC,OAAO,OAAA,KAA6F;AACpG,QAAA,IAAI,iBAAA,IAAqB,CAAC,MAAM,iBAAA,CAAkB,OAAO,CAAA;AACvD,UAAA,OAAO,KAAA;AACT,QAAA,IAAI,kBAAA,IAAsB,CAAC,MAAM,kBAAA,CAAmB,OAAO,CAAA;AACzD,UAAA,OAAO,KAAA;AACT,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,GACE,MAAA;AAEJ,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,EAAE,GAAG,WAAA,EAAa,SAAA,EAAW,CAAA;AACrE,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,MAAM,OAAA,GAAU,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GACnC,OAAO,IAAA,GACP,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA;AAE9B,MAAA,OAAOD,EAAAA,CAAG;AAAA,QACR,IAAA,EAAM,MAAA;AAAA,QACN,OAAA;AAAA,QACA,cAAc,QAAA,CAAS;AAAA,OACxB,CAAA;AAAA,IACH,CAAA;AAAA;AAAA,IAGA,MAAM,UAAA,CACJ,SAAA,EACAL,QAAAA,GAAyD,EAAC,EACvB;AACnC,MAAA,MAAM,EAAE,QAAA,GAAW,KAAA,EAAO,GAAG,aAAY,GAAIA,QAAAA;AAC7C,MAAA,MAAM,WAA0B,EAAC;AAEjC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,UAC5B,UAAU,GAAA,CAAI,CAAA,EAAA,KAAM,SAAS,OAAA,CAAQ,EAAA,EAAI,WAAW,CAAC;AAAA,SACvD;AACA,QAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,UAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,YAAA,OAAO,MAAA;AAAA,UACT;AACA,UAAA,QAAA,CAAS,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,QAC3B;AAAA,MACF,CAAA,MACK;AACH,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,OAAA,CAAQ,UAAU,WAAW,CAAA;AAC3D,UAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,YAAA,OAAO,MAAA;AAAA,UACT;AACA,UAAA,QAAA,CAAS,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,QAC3B;AAAA,MACF;AAEA,MAAA,OAAOK,GAAG,QAAQ,CAAA;AAAA,IACpB,CAAA;AAAA;AAAA,IAGA,KAAA,GAAc;AACZ,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IACd,CAAA;AAAA;AAAA,IAGA,IAAI,IAAA,GAAe;AACjB,MAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACf;AAAA,GACF;AAEA,EAAA,OAAO,QAAA;AACT;AAUA,SAAS,gBAAgB,MAAA,EAA4C;AACnE,EAAA,MAAM,UAAA,GAAac,CAAA,CAAI,YAAA,CAAa,MAAM,CAAA;AAC1C,EAAA,MAAM,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,MAAK,GAAI,UAAA;AAChC,EAAA,OAAO,IAAA;AACT;AC9UA,IAAM,iBAAA,GAAoB,YAAA;AAC1B,IAAM,0BAAA,GAA6B,2BAAA;AACnC,IAAM,kBAAA,GAAqB,IAAA;AA+C3B,SAAS,cAAc,OAAA,EAA0B;AAC/C,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA;AACrB,IAAA,OAAO,OAAA;AACT,EAAA,IAAI,KAAA,CAAM,QAAQ,OAAO,CAAA;AACvB,IAAA,OAAO,OAAA,CAAQ,IAAI,CAAA,IAAA,KAAS,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,CAAK,SAAS,MAAA,IAAU,OAAO,KAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,EAAG,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAChJ,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AASA,SAAS,oBAAoB,QAAA,EAA4E;AACvG,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,SAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,SAAS,WAAA,EAAa;AAC7D,MAAA,MAAM,IAAA,GAAO,aAAA,CAAc,OAAA,CAAQ,OAAO,CAAA;AAC1C,MAAA,IAAI,IAAA;AACF,QAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,aAAA,EAAe,WAAA,EAAa,OAAA,CAAQ,YAAA,EAAc,OAAA,EAAS,aAAA,CAAc,OAAA,CAAQ,OAAO,GAAG;AAAA,OAC9G,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAChC,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,MAAM,IAAA,GAAO,aAAA,CAAc,OAAA,CAAQ,OAAO,CAAA;AAC1C,MAAA,IAAI,IAAA;AACF,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AACpC,MAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,QAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,UAAA,EAAY;AACrC,UAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,YAAA,IAAI,QAAiB,EAAC;AACtB,YAAA,IAAI;AACF,cAAA,KAAA,GAAQ,IAAA,CAAK,SAAS,SAAA,GAAY,IAAA,CAAK,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,GAAI,EAAC;AAAA,YAC3E,CAAA,CAAA,MACM;AACJ,cAAA,KAAA,GAAQ,EAAC;AAAA,YACX;AACA,YAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,UAChF;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAU,IAAA,IAAQ,EAAA,EAAK,CAAA;AACrF,MAAA;AAAA,IACF;AAGA,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,aAAA,CAAc,OAAA,CAAQ,OAAO,CAAA,EAAG,CAAA;AAAA,EACvE;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA,GAAI,MAAA,EAAU;AACnG;AAGA,SAAS,iBAAiB,KAAA,EAAuD;AAC/E,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA;AAC7B,IAAA,OAAO,MAAA;AACT,EAAA,MAAM,SAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,KAAK,IAAA,KAAS,UAAA;AAChB,MAAA;AACF,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,MACpB,WAAA,EAAa,IAAA,CAAK,QAAA,CAAS,WAAA,IAAe,MAAA;AAAA,MAC1C,YAAA,EAAe,KAAK,QAAA,CAAS,UAAA,IAAc,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,EAAC;AAAE,KAC7E,CAAA;AAAA,EACH;AACA,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,MAAA;AACtC;AAGA,SAAS,aAAA,CAAc,YAA2B,UAAA,EAA6B;AAC7E,EAAA,IAAI,cAAc,UAAA,KAAe,UAAA;AAC/B,IAAA,OAAO,YAAA;AACT,EAAA,IAAI,UAAA,KAAe,YAAA;AACjB,IAAA,OAAO,QAAA;AACT,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,cAAA,CAAe,UAA6B,KAAA,EAAuC;AAC1F,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,YAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,KAAA,IAAS,SAAS,OAAA,EAAS;AACpC,IAAA,IAAI,MAAM,IAAA,KAAS,MAAA;AACjB,MAAA,SAAA,CAAU,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,SAAA,IAClB,MAAM,IAAA,KAAS,UAAA;AACtB,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,CAAM,IAAI,IAAA,EAAM,UAAA,EAAY,UAAU,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,SAAA,EAAW,KAAK,SAAA,CAAU,KAAA,CAAM,SAAS,EAAE,CAAA,EAAE,EAAG,CAAA;AAAA,EACnI;AACA,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAE9B,EAAA,OAAO;AAAA,IACL,IAAI,QAAA,CAAS,EAAA;AAAA,IACb,MAAA,EAAQ,iBAAA;AAAA,IACR,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAAA,IACrC,KAAA,EAAO,SAAS,KAAA,IAAS,KAAA;AAAA,IACzB,SAAS,CAAC;AAAA,MACR,KAAA,EAAO,CAAA;AAAA,MACP,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,WAAA;AAAA,QACN,SAAS,SAAA,CAAU,MAAA,GAAS,KAAK,IAAA,CAAK,MAAA,KAAW,IAAI,IAAA,GAAO,IAAA;AAAA,QAC5D,OAAA,EAAS,IAAA;AAAA,QACT,GAAI,UAAU,MAAA,GAAS,CAAA,GAAI,EAAE,UAAA,EAAY,SAAA,KAAc;AAAC,OAC1D;AAAA,MACA,eAAe,aAAA,CAAc,QAAA,CAAS,WAAA,EAAa,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,MACvE,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,IACD,KAAA,EAAO;AAAA,MACL,aAAA,EAAe,SAAS,KAAA,CAAM,YAAA;AAAA,MAC9B,iBAAA,EAAmB,SAAS,KAAA,CAAM,aAAA;AAAA,MAClC,YAAA,EAAc,QAAA,CAAS,KAAA,CAAM,YAAA,GAAe,SAAS,KAAA,CAAM;AAAA;AAC7D,GACF;AACF;AAGA,SAAS,SAAA,CAAU,EAAA,EAAY,KAAA,EAAe,KAAA,EAAoC;AAChF,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,MAAA,EAAQ,uBAAA;AAAA,IACR,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAAA,IACrC,KAAA;AAAA,IACA,OAAA,EAAS,CAAC,EAAE,KAAA,EAAO,GAAG,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA,EAAM,EAAG,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,MAAM;AAAA,GACxF;AACF;AAUO,SAAS,wBAAwB,IAAA,EAAuC;AAC7E,EAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AAQnB,EAAA,SAAS,gBAAA,CAAiB,cAAuB,SAAA,EAA2D;AAC1G,IAAA,MAAM,KAAA,GAAQ,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,YAAA,IAAgB,CAAA,CAAE,KAAA,KAAU,YAAY,CAAA,GAAI,MAAA;AAC/G,IAAA,MAAM,KAAA,GAAQ,WAAW,KAAA,IAAS,KAAA,EAAO,SAAS,YAAA,IAAgB,MAAA,CAAO,IAAI,KAAA,IAAS,0BAAA;AACtF,IAAA,MAAM,MAAA,GAAS,SAAA,EAAW,MAAA,IAAU,KAAA,EAAO,MAAA,IAAU,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,wBAAA,IAA4B,OAAA,CAAQ,GAAA,CAAI,iBAAA;AAC9H,IAAA,IAAI,CAAC,MAAA;AACH,MAAA,OAAOb,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,gBAAA,EAAkB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,mCAAA,EAAoC,EAAG,CAAC,CAAA;AAC9H,IAAA,MAAM,OAAA,GAAA,CAAW,SAAA,EAAW,OAAA,IAAW,KAAA,EAAO,WAAW,OAAA,CAAQ,GAAA,CAAI,yBAAA,IAA6B,OAAA,CAAQ,GAAA,CAAI,kBAAA,IAAsB,0BAAA,EAA4B,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAClL,IAAA,OAAOD,EAAAA,CAAG;AAAA,MACR,MAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAW,SAAA,EAAW,SAAA,IAAa,OAAO,SAAA,IAAa,MAAA,CAAO,IAAI,SAAA,IAAa,kBAAA;AAAA,MAC/E,aAAa,SAAA,EAAW,WAAA,IAAe,KAAA,EAAO,WAAA,IAAe,OAAO,GAAA,CAAI,WAAA;AAAA,MACxE,SAAS,SAAA,EAAW,OAAA,IAAW,OAAO,OAAA,IAAW,MAAA,CAAO,IAAI,OAAA,IAAW;AAAA,KACxE,CAAA;AAAA,EACH;AAGA,EAAA,SAAS,YAAA,CAAa,OAAA,EAAgC,QAAA,EAA6B,MAAA,EAAmC;AACpH,IAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,mBAAA,CAAoB,QAAQ,QAAQ,CAAA;AACjE,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,QAAA,CAAS,WAAA;AACpD,IAAA,OAAO;AAAA,MACL,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,QAAA,CAAS,SAAA;AAAA,MAC3C,QAAA;AAAA,MACA,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,MAC3B,GAAI,WAAA,IAAe,IAAA,GAAO,EAAE,WAAA,KAAgB,EAAC;AAAA,MAC7C,GAAI,QAAQ,KAAA,IAAS,IAAA,GAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AAAA,MACxD,GAAI,gBAAA,CAAiB,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAE,KAAA,EAAO,gBAAA,CAAiB,OAAA,CAAQ,KAAK,CAAA,EAAE,GAAI,EAAC;AAAA,MACpF;AAAA,KACF;AAAA,EACF;AAGA,EAAA,eAAe,IAAA,CAAK,QAAA,EAA6B,IAAA,EAAwB,MAAA,EAAyC;AAChH,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,SAAS,OAAO,CAAA;AAEnE,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,MAAA,CAAO,OAAA;AACT,QAAA,UAAA,CAAW,KAAA,EAAM;AAAA;AAEjB,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM,UAAA,CAAW,OAAM,EAAG,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IAC7E;AACA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,KAAA,CAAM,CAAA,EAAG,QAAA,CAAS,OAAO,CAAA,YAAA,CAAA,EAAgB;AAAA,QACpD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAa,QAAA,CAAS,MAAA;AAAA,UACtB,mBAAA,EAAqB;AAAA,SACvB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAAA,IACH,CAAA,SACA;AACE,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAGA,EAAA,SAAS,SAAA,CAAU,QAAgB,MAAA,EAAuD;AACxF,IAAA,IAAI,MAAA,KAAW,GAAA;AACb,MAAA,OAAO,EAAE,GAAA,EAAK,UAAA,CAAW,YAAA,EAAc,SAAS,MAAA,EAAO;AACzD,IAAA,IAAI,MAAA,KAAW,GAAA;AACb,MAAA,OAAO,EAAE,GAAA,EAAK,UAAA,CAAW,eAAA,EAAiB,SAAS,MAAA,EAAO;AAC5D,IAAA,IAAI,MAAA,KAAW,GAAA;AACb,MAAA,OAAO,EAAE,GAAA,EAAK,UAAA,CAAW,eAAA,EAAiB,SAAS,MAAA,EAAO;AAC5D,IAAA,OAAO,EAAE,GAAA,EAAK,UAAA,CAAW,SAAA,EAAW,SAAS,MAAA,EAAO;AAAA,EACtD;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,OAAA,EAAqD;AAC9D,MAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,OAAA,CAAQ,KAAA,EAAO,QAAQ,SAAS,CAAA;AACxE,MAAA,IAAI,CAAC,cAAA,CAAe,OAAA;AAClB,QAAA,OAAO,cAAA;AACT,MAAA,MAAM,WAAW,cAAA,CAAe,IAAA;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,QAAA,EAAU,YAAA,CAAa,SAAS,QAAA,EAAU,KAAK,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA;AACvF,QAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,UAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,MAAM,IAAI,UAAU,CAAA;AAC1D,UAAA,MAAM,MAAA,GAAS,UAAU,GAAA,CAAI,MAAA,EAAQ,OAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AACzD,UAAA,OAAOC,GAAAA,CAAI,OAAO,GAAA,EAAK,MAAA,CAAO,SAAS,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,CAAA;AAAA,QAC/D;AACA,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,QAAA,OAAOD,EAAAA,CAAG,cAAA,CAAe,IAAA,EAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,MAChD,SACO,KAAA,EAAO;AACZ,QAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA;AAC3C,UAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,OAAA,EAAS,GAAA,CAAI,mBAAmB,GAAG,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,CAAA;AACrF,QAAA,OAAOA,IAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,kBAAA,EAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,iBAAgB,EAAG,GAAG,KAAK,CAAA;AAAA,MACvJ;AAAA,IACF,CAAA;AAAA,IAEA,OAAO,WAAW,OAAA,EAA6C;AAC7D,MAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,OAAA,CAAQ,KAAA,EAAO,QAAQ,SAAS,CAAA;AACxE,MAAA,IAAI,CAAC,cAAA,CAAe,OAAA;AAClB,QAAA,MAAM,IAAI,KAAA,CAAM,cAAA,CAAe,KAAA,CAAM,OAAO,CAAA;AAC9C,MAAA,MAAM,WAAW,cAAA,CAAe,IAAA;AAEhC,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,QAAA,EAAU,YAAA,CAAa,SAAS,QAAA,EAAU,IAAI,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA;AACtF,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,CAAC,IAAI,IAAA,EAAM;AACxB,QAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,MAAM,IAAI,UAAU,CAAA;AAC1D,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,MACpF;AAEA,MAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,CAAK,SAAA,EAAU;AAClC,MAAA,MAAM,WAAA,GAAc,IAAI,WAAA,EAAY;AAEpC,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA;AACF,UAAA;AACF,QAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG;AAC/E,UAAA,IAAI,CAAC,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,KAAS,QAAA;AAChC,YAAA;AACF,UAAA,IAAI,OAAA;AACJ,UAAA,IAAI;AACF,YAAA,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,UACjC,CAAA,CAAA,MACM;AACJ,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,OAAA,CAAQ,SAAS,qBAAA,IAAyB,OAAA,CAAQ,OAAO,IAAA,KAAS,YAAA,IAAgB,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM;AACxG,YAAA,MAAM,UAAU,QAAA,CAAS,KAAA,EAAO,SAAS,KAAA,EAAO,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,UACpE,CAAA,MAAA,IAES,OAAA,CAAQ,IAAA,KAAS,eAAA,IAAmB,QAAQ,KAAA,EAAO;AAC1D,YAAA,MAAM;AAAA,cACJ,IAAI,QAAA,CAAS,KAAA;AAAA,cACb,MAAA,EAAQ,uBAAA;AAAA,cACR,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAAA,cACrC,OAAO,QAAA,CAAS,KAAA;AAAA,cAChB,OAAA,EAAS,CAAC,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,EAAC,EAAG,aAAA,EAAe,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,cACxE,KAAA,EAAO;AAAA,gBACL,aAAA,EAAe,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,YAAA,IAAgB,CAAA;AAAA,gBACvD,iBAAA,EAAmB,QAAQ,KAAA,CAAM,aAAA;AAAA,gBACjC,eAAe,OAAA,CAAQ,OAAA,EAAS,OAAO,YAAA,IAAgB,CAAA,IAAK,QAAQ,KAAA,CAAM;AAAA;AAC5E,aACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,UAAA,GAA2C;AAE/C,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,MAAA,IAAI,OAAO,GAAA,CAAI,KAAA;AACb,QAAA,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAC7B,MAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,EAAC,EAAG;AAC3C,QAAA,IAAA,CAAK,KAAA,CAAM,GAAA,IAAO,MAAA,CAAO,GAAA,CAAI,GAAA,MAAS,WAAA;AACpC,UAAA,MAAA,CAAO,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA,MAC1B;AACA,MAAA,OAAOD,EAAAA,CAAG,CAAC,GAAG,MAAM,CAAC,CAAA;AAAA,IACvB;AAAA,GACF;AACF;;;ACzWA,SAASe,eAAc,OAAA,EAA0B;AAC/C,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA;AACrB,IAAA,OAAO,OAAA;AACT,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,OAAA,CACJ,IAAI,CAAA,IAAA,KAASC,SAAAA,CAAS,IAAI,CAAA,IAAK,IAAA,CAAK,SAAS,MAAA,IAAU,OAAO,KAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,EAAG,EACtG,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,EAAE,CAAA;AAAA,EACZ;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAASA,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AASO,SAAS,iBAAiB,QAAA,EAAwC;AACvE,EAAA,MAAM,QAA6B,EAAC;AACpC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,sBAAA;AAAA,QACN,SAAS,OAAA,CAAQ,YAAA;AAAA,QACjB,MAAA,EAAQD,cAAAA,CAAc,OAAA,CAAQ,OAAO;AAAA,OACtC,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAChC,MAAA,MAAM,SAAA,GAAY,OAAA;AAClB,MAAA,MAAM,IAAA,GAAOA,cAAAA,CAAc,SAAA,CAAU,OAAO,CAAA;AAC5C,MAAA,IAAI,IAAA;AACF,QAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,MAAM,CAAA;AACjD,MAAA,IAAI,UAAU,UAAA,EAAY;AACxB,QAAA,KAAA,MAAW,IAAA,IAAQ,UAAU,UAAA,EAAY;AACvC,UAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,YAAA,KAAA,CAAM,IAAA,CAAK;AAAA,cACT,IAAA,EAAM,eAAA;AAAA,cACN,SAAS,IAAA,CAAK,EAAA;AAAA,cACd,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,cACpB,SAAA,EAAW,KAAK,QAAA,CAAS;AAAA,aAC1B,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,IAAA,KAAS,MAAA,IAAU,QAAQ,IAAA,KAAS,QAAA,IAAY,QAAQ,IAAA,KAAS,WAAA;AAC3E,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,SAASA,cAAAA,CAAc,OAAA,CAAQ,OAAO,CAAA,EAAG,CAAA;AAAA,EAC9E;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,iBAAiB,KAAA,EAAuD;AACtF,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA;AAC7B,IAAA,OAAO,MAAA;AACT,EAAA,MAAM,SAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,KAAK,IAAA,KAAS,UAAA;AAChB,MAAA;AACF,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,KAAK,QAAA,CAAS,IAAA;AAAA,MACpB,WAAA,EAAa,IAAA,CAAK,QAAA,CAAS,WAAA,IAAe,IAAA;AAAA,MAC1C,UAAA,EAAa,IAAA,CAAK,QAAA,CAAS,UAAA,IAAc,EAAC;AAAA,MAC1C,MAAA,EAAQ,IAAA,CAAK,QAAA,CAAS,MAAA,IAAU;AAAA,KACjC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,MAAA;AACtC;AAGA,SAAS,iBAAiB,QAAA,EAAyC;AACjE,EAAA,MAAM,YAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,MAAA,EAAQ;AAClC,IAAA,IAAI,IAAA,CAAK,SAAS,eAAA,EAAiB;AACjC,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAI,IAAA,CAAK,OAAA;AAAA,QACT,IAAA,EAAM,UAAA;AAAA,QACN,UAAU,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,SAAA,EAAW,KAAK,SAAA;AAAU,OACxD,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,SAAA;AACT;AAGA,SAAS,SAAS,KAAA,EAAgF;AAChG,EAAA,IAAI,CAAC,KAAA;AACH,IAAA,OAAO,MAAA;AACT,EAAA,OAAO;AAAA,IACL,eAAe,KAAA,CAAM,YAAA;AAAA,IACrB,mBAAmB,KAAA,CAAM,aAAA;AAAA,IACzB,cAAc,KAAA,CAAM;AAAA,GACtB;AACF;AAQO,SAAS,uBAAA,CAAwB,UAA6B,KAAA,EAAuC;AAC1G,EAAA,MAAM,SAAA,GAAY,iBAAiB,QAAQ,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,SAAS,WAAA,IAAe,EAAA;AAErC,EAAA,MAAM,OAAA,GAAgE;AAAA,IACpE,IAAA,EAAM,WAAA;AAAA,IACN,SAAS,SAAA,CAAU,MAAA,GAAS,KAAK,IAAA,CAAK,MAAA,KAAW,IAAI,IAAA,GAAO,IAAA;AAAA,IAC5D,OAAA,EAAS,IAAA;AAAA,IACT,GAAI,UAAU,MAAA,GAAS,CAAA,GAAI,EAAE,UAAA,EAAY,SAAA,KAAc;AAAC,GAC1D;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA;AAErC,EAAA,OAAO;AAAA,IACL,IAAI,QAAA,CAAS,EAAA;AAAA,IACb,MAAA,EAAQ,iBAAA;AAAA,IACR,SAAS,QAAA,CAAS,UAAA;AAAA,IAClB,KAAA,EAAO,SAAS,KAAA,IAAS,KAAA;AAAA,IACzB,SAAS,CAAC;AAAA,MACR,KAAA,EAAO,CAAA;AAAA,MACP,OAAA;AAAA,MACA,aAAA,EAAe,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,YAAA,GAAe,MAAA;AAAA,MACrD,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,IACD,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC,GAC3B;AACF;AAWO,SAAS,qBAAA,CAAsB,OAA4B,KAAA,EAA2C;AAC3G,EAAA,IAAI,KAAA,CAAM,SAAS,4BAAA,EAA8B;AAC/C,IAAA,OAAO;AAAA,MACL,IAAI,KAAA,CAAM,OAAA;AAAA,MACV,MAAA,EAAQ,uBAAA;AAAA,MACR,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAAA,MACrC,KAAA;AAAA,MACA,OAAA,EAAS,CAAC,EAAE,KAAA,EAAO,GAAG,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAM,EAAG,aAAA,EAAe,IAAA,EAAM,QAAA,EAAU,MAAM;AAAA,KAC9F;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,oBAAA,EAAsB;AACvC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA;AAC3C,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,MAAM,QAAA,CAAS,EAAA;AAAA,MACnB,MAAA,EAAQ,uBAAA;AAAA,MACR,OAAA,EAAS,MAAM,QAAA,CAAS,UAAA;AAAA,MACxB,KAAA,EAAO,KAAA,CAAM,QAAA,CAAS,KAAA,IAAS,KAAA;AAAA,MAC/B,OAAA,EAAS,CAAC,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,EAAC,EAAG,aAAA,EAAe,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,MACxE,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC,KAC3B;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;AC/JA,SAAS,mBAAmB,KAAA,EAAqE;AAC/F,EAAA,IAAI,KAAA,YAAiBZ,QAAO,QAAA,EAAU;AACpC,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,MAAA,EAAQ,MAAM,MAAA,EAAQ,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,MAAA,EAAU;AAAA,EACvF;AACA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAQ;AAAA,EAClC;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE;AAClC;AAgBA,SAAS,UAAU,KAAA,EAAuE;AACxF,EAAA,IAAI,KAAA,YAAiBA,QAAO,QAAA,EAAU;AACpC,IAAA,IAAI,MAAM,UAAA,CAAW,SAAA;AACrB,IAAA,IAAI,KAAA,CAAM,WAAW,GAAA,EAAK;AACxB,MAAA,GAAA,GAAM,UAAA,CAAW,YAAA;AAAA,IACnB,CAAA,MAAA,IACS,KAAA,CAAM,MAAA,KAAW,GAAA,EAAK;AAC7B,MAAA,GAAA,GAAM,UAAA,CAAW,eAAA;AAAA,IACnB,CAAA,MAAA,IACS,KAAA,CAAM,MAAA,KAAW,GAAA,EAAK;AAC7B,MAAA,GAAA,GAAM,UAAA,CAAW,eAAA;AAAA,IACnB;AACA,IAAA,OAAO,EAAE,KAAK,OAAA,EAAS,KAAA,CAAM,SAAS,KAAA,EAAO,kBAAA,CAAmB,KAAK,CAAA,EAAE;AAAA,EACzE;AAEA,EAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,IAAA,OAAO;AAAA,MACL,KAAK,UAAA,CAAW,OAAA;AAAA,MAChB,OAAA,EAAS,IAAI,mBAAmB,CAAA;AAAA,MAChC,KAAA,EAAO,mBAAmB,KAAK;AAAA,KACjC;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,UAAA,CAAW,cAAA;AAAA,IAChB,OAAA,EAAS,IAAI,kBAAA,EAAoB;AAAA,MAC/B,QAAQ,EAAE,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAA;AAAgB,KAC3E,CAAA;AAAA,IACD,KAAA,EAAO,mBAAmB,KAAK;AAAA,GACjC;AACF;AAEA,SAAS,gBAAgB,OAAA,EAA0E;AACjG,EAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAChC,IAAA,MAAM,gBAAA,GAAgF;AAAA,MACpF,IAAA,EAAM,WAAA;AAAA,MACN,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,GAAI,QAAQ,IAAA,GAAO,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS;AAAC,KAC/C;AACA,IAAA,OAAO,gBAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAA;AACT;AAwBO,SAAS,qBAAqB,IAAA,EAAuC;AAC1E,EAAA,MAAM,EAAE,QAAO,GAAI,IAAA;AAGnB,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAG5C,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAmD;AAC/E,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,iBAAA,IAAqB,GAAA;AAErD,EAAA,SAAS,SAAA,CAAU,MAAA,EAAgB,OAAA,EAAiB,OAAA,EAAyB;AAC3E,IAAA,MAAM,MAAM,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA,CAAA;AAC7C,IAAA,IAAI,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,GAAS,IAAIA,OAAAA,CAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAChD,MAAA,WAAA,CAAY,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAQA,EAAA,SAAS,aAAA,CAAc,MAAA,EAAgB,OAAA,EAAiB,OAAA,EAAyB;AAC/E,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,eAAA,EAAiB;AACpC,MAAA,IAAI,EAAE,SAAA,IAAa,GAAA;AACjB,QAAA,eAAA,CAAgB,OAAO,CAAC,CAAA;AAAA,IAC5B;AACA,IAAA,MAAM,MAAM,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,OAAO,KAAK,OAAO,CAAA,CAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA;AACtC,IAAA,IAAI,MAAA;AACF,MAAA,OAAO,MAAA,CAAO,MAAA;AAChB,IAAA,MAAM,SAAS,IAAIA,OAAAA,CAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AACtD,IAAA,eAAA,CAAgB,IAAI,GAAA,EAAK,EAAE,QAAQ,SAAA,EAAW,GAAA,GAAM,cAAc,CAAA;AAClE,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,SAAS,aAAA,CAAc,cAAuB,SAAA,EAAwD;AACpG,IAAA,IAAI,SAAA;AACF,MAAA,OAAO,kBAAkB,SAAS,CAAA;AACpC,IAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,MAAA,CAAO,GAAA,EAAK,QAAQ,YAAA,EAAc;AAAA,MACzE,oBAAA,EAAsB,IAAI,gBAAA,EAAkB,EAAE,QAAQ,EAAE,KAAA,EAAO,8BAAA,EAA+B,EAAG;AAAA,KAClG,CAAA;AACD,IAAA,IAAI,CAAC,cAAA,CAAe,OAAA;AAClB,MAAA,OAAO,cAAA;AACT,IAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,SAAS,KAAA,EAAO,GAAA,KAAQ,cAAA,CAAe,IAAA;AAEhE,IAAA,MAAM,WAAA,GAAc,GAAA,KAAQ,WAAA,GAAc,WAAA,GAAc,MAAA;AACxD,IAAA,OAAOH,EAAAA,CAAG,EAAE,MAAA,EAAQ,SAAA,CAAU,MAAA,IAAU,EAAA,EAAI,OAAA,IAAW,2BAAA,EAA6B,OAAO,CAAA,EAAG,KAAA,EAAO,GAAA,EAAK,aAAa,CAAA;AAAA,EACzH;AAQA,EAAA,SAAS,kBAAkB,SAAA,EAAuD;AAChF,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,MAAA,IAAU,MAAA,CAAO,GAAA,CAAI,UAAUiB,OAAAA,CAAQ,GAAA,CAAI,kBAAA,IAAsBA,OAAAA,CAAQ,GAAA,CAAI,cAAA;AACtG,IAAA,IAAI,CAAC,MAAA;AACH,MAAA,OAAOhB,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,gBAAA,EAAkB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,oCAAA,EAAqC,EAAG,CAAC,CAAA;AAC/H,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,IAAW,MAAA,CAAO,GAAA,CAAI,OAAA,IAAWgB,OAAAA,CAAQ,GAAA,CAAI,mBAAA,IAAuBA,OAAAA,CAAQ,GAAA,CAAI,eAAA,IAAmB,2BAAA;AAC7H,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,IAAW,MAAA,CAAO,IAAI,OAAA,IAAW,GAAA;AAC3D,IAAA,MAAM,OAAO,SAAA,CAAU,GAAA,IAAO,OAAO,GAAA,CAAI,GAAA,MAAS,cAAc,WAAA,GAAc,MAAA;AAC9E,IAAA,OAAOjB,EAAAA,CAAG;AAAA,MACR,MAAA,EAAQ,aAAA,CAAc,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,MAC9C,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,GAAA;AAAA,MACA,SAAA,EAAW,SAAA,CAAU,SAAA,IAAa,MAAA,CAAO,GAAA,CAAI,SAAA;AAAA,MAC7C,WAAA,EAAa,SAAA,CAAU,WAAA,IAAe,MAAA,CAAO,GAAA,CAAI;AAAA,KAClD,CAAA;AAAA,EACH;AAQA,EAAA,SAAS,oBAAA,CACP,SACA,QAAA,EACmD;AACnD,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,UAAA,IAAc,QAAA,CAAS,SAAA;AACjD,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,QAAA,CAAS,WAAA;AACpD,IAAA,MAAM,aAAa,OAAO,OAAA,CAAQ,WAAA,KAAgB,QAAA,GAAW,QAAQ,WAAA,GAAc,MAAA;AACnF,IAAA,OAAO;AAAA,MACL,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,KAAA,EAAO,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACxC,GAAI,SAAA,IAAa,IAAA,GAAO,EAAE,iBAAA,EAAmB,SAAA,KAAc,EAAC;AAAA,MAC5D,GAAI,WAAA,IAAe,IAAA,GAAO,EAAE,WAAA,KAAgB,EAAC;AAAA,MAC7C,GAAI,QAAQ,KAAA,IAAS,IAAA,GAAO,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,EAAC;AAAA,MACxD,GAAI,gBAAA,CAAiB,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAE,KAAA,EAAO,gBAAA,CAAiB,OAAA,CAAQ,KAAK,CAAA,EAAE,GAAI,EAAC;AAAA,MACpF,GAAI,UAAA,GAAa,EAAE,WAAA,EAAa,UAAA,KAAe,EAAC;AAAA,MAChD,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,OAAA,EAA4E;AACrF,MAAA,MAAM,YAAA,GAAe,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,QAAQ,SAAS,CAAA;AACnE,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA;AAChB,QAAA,OAAO,YAAA;AACT,MAAA,MAAM,WAAW,YAAA,CAAa,IAAA;AAC9B,MAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,KAAI,GAAI,QAAA;AACvD,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,UAAA,EAAY,WAAW,UAAA,EAAY,MAAA,EAAQ,GAAG,aAAA,EAAc,GAAI,OAAA;AACxG,MAAA,IAAI;AAEF,QAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,UAAA,MAAMkB,SAAAA,GAAW,MAAM,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,oBAAA,CAAqB,OAAA,EAAS,QAAQ,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA;AAClG,UAAA,OAAOlB,EAAAA,CAAG,uBAAA,CAAwBkB,SAAAA,EAAU,KAAK,CAAC,CAAA;AAAA,QACpD;AAEA,QAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,eAAe,CAAA;AAC3D,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,GAAG,aAAA;AAAA,UACH,QAAA,EAAU,cAAA;AAAA,UACV,KAAA;AAAA,UACA,GAAI,SAAA,KAAc,KAAA,CAAA,IAAa,aAAA,CAAc,UAAA,IAAc,OAAO,EAAE,UAAA,EAAY,SAAA,EAAU,GAAI,EAAC;AAAA,UAC/F,GAAI,gBAAgB,KAAA,CAAA,IAAa,aAAA,CAAc,eAAe,IAAA,GAAO,EAAE,WAAA,EAAY,GAAI,EAAC;AAAA,UACxF,MAAA,EAAQ;AAAA,SACV;AAEA,QAAA,MAAM,WAAW,MAAA,GACb,MAAM,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,GACvD,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,OAAO,MAAM,CAAA;AAC/C,QAAA,OAAOlB,GAAG,QAAQ,CAAA;AAAA,MACpB,SACO,KAAA,EAAO;AACZ,QAAA,MAAM,MAAA,GAAS,UAAU,KAAK,CAAA;AAC9B,QAAA,OAAOC,IAAI,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,OAAA,EAAS,OAAO,KAAK,CAAA;AAAA,MACrD;AAAA,IACF,CAAA;AAAA,IAEA,OAAO,WAAW,OAAA,EAAoE;AACpF,MAAA,MAAM,YAAA,GAAe,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,QAAQ,SAAS,CAAA;AACnE,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAC5C,MAAA,MAAM,WAAW,YAAA,CAAa,IAAA;AAC9B,MAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,KAAI,GAAI,QAAA;AACvD,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,UAAA,EAAY,WAAW,UAAA,EAAY,MAAA,EAAQ,GAAG,aAAA,EAAc,GAAI,OAAA;AAGxG,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,MAAM,eAAA,GAAkB,MAAM,MAAA,CAAO,SAAA,CAAU,MAAA;AAAA,UAC7C,EAAE,GAAG,oBAAA,CAAqB,SAAS,QAAQ,CAAA,EAAG,QAAQ,IAAA,EAAK;AAAA,UAC3D,EAAE,MAAA;AAAO,SACX;AACA,QAAA,WAAA,MAAiB,SAAS,eAAA,EAAiB;AACzC,UAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,KAAA,EAAO,KAAK,CAAA;AAChD,UAAA,IAAI,KAAA;AACF,YAAA,MAAM,KAAA;AAAA,QACV;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,eAAe,CAAA;AAC3D,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,GAAG,aAAA;AAAA,QACH,QAAA,EAAU,cAAA;AAAA,QACV,KAAA;AAAA,QACA,GAAI,SAAA,KAAc,MAAA,IAAa,aAAA,CAAc,UAAA,IAAc,OAAO,EAAE,UAAA,EAAY,SAAA,EAAU,GAAI,EAAC;AAAA,QAC/F,GAAI,gBAAgB,MAAA,IAAa,aAAA,CAAc,eAAe,IAAA,GAAO,EAAE,WAAA,EAAY,GAAI,EAAC;AAAA,QACxF,MAAA,EAAQ;AAAA,OACV;AACA,MAAA,MAAM,SAAS,MAAA,GACX,MAAM,MAAA,CAAO,IAAA,CAAK,YAAY,MAAA,CAAO,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,GACvD,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,OAAO,MAAM,CAAA;AAC/C,MAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,UAAA,GAA2C;AAC/C,MAAA,MAAM,eAAe,aAAA,EAAc;AACnC,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA;AAChB,QAAA,OAAO,YAAA;AACT,MAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,CAAa,IAAA;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,EAAK;AAC1C,QAAA,MAAM,SAAS,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,KAAsB,EAAE,EAAE,CAAA;AAC5D,QAAA,OAAOD,GAAG,MAAM,CAAA;AAAA,MAClB,SACO,KAAA,EAAO;AACZ,QAAA,MAAM,MAAA,GAAS,UAAU,KAAK,CAAA;AAC9B,QAAA,OAAOC,IAAI,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,OAAA,EAAS,OAAO,KAAK,CAAA;AAAA,MACrD;AAAA,IACF;AAAA,GACF;AACF;;;ACpTO,SAAS,kBAAkB,IAAA,EAAuC;AACvE,EAAA,MAAM,MAAA,GAAS,qBAAqB,IAAI,CAAA;AAExC,EAAA,IAAI,SAAA;AAEJ,EAAA,SAAS,YAAA,GAA4B;AACnC,IAAA,SAAA,KAAc,wBAAwB,IAAI,CAAA;AAC1C,IAAA,OAAO,SAAA;AAAA,EACT;AAGA,EAAA,SAAS,KAAK,OAAA,EAA6C;AACzD,IAAA,MAAM,GAAA,GAAM,gBAAgB,IAAA,CAAK,MAAA,CAAO,KAAK,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA;AAClF,IAAA,OAAO,GAAA,KAAQ,WAAA,GAAc,YAAA,EAAa,GAAI,MAAA;AAAA,EAChD;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,CAAA,OAAA,KAAW,IAAA,CAAK,OAAO,CAAA,CAAE,KAAK,OAAO,CAAA;AAAA,IAC3C,YAAY,CAAC,OAAA,KAAgD,KAAK,OAAO,CAAA,CAAE,WAAW,OAAO,CAAA;AAAA,IAC7F,YAAY,MAAM;AAChB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,IAAO,MAAA;AACnC,MAAA,OAAO,QAAQ,WAAA,GAAc,YAAA,GAAe,UAAA,EAAW,GAAI,OAAO,UAAA,EAAW;AAAA,IAC/E;AAAA,GACF;AACF;;;ACPA,IAAMJ,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,CAAA;AAgCxD,SAAS,oBAAA,CAAqB,QAAkB,IAAA,EAAoC;AACzF,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,EAAE,MAAA,EAAQ,CAAA;AAC7C,EAAA,MAAM,cAAc,IAAA,EAAM,WAAA;AAC1B,EAAA,MAAM,eAAe,IAAA,EAAM,YAAA;AAC3B,EAAA,IAAI,SAAA,GAAY,CAAA;AAKhB,EAAA,SAAS,aAAa,QAAA,EAAiC;AACrD,IAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,MAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,QAAA,MAAM,IAAA,GAAO,OAAO,GAAA,CAAI,OAAA,KAAY,WAChC,GAAA,CAAI,OAAA,GACJ,IAAI,OAAA,CAAQ,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,CAAE,GAAA,CAAI,OAAK,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACxE,QAAA,OAAO,IAAA,CAAK,SAAS,EAAA,GAAK,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAA,GAAQ,IAAA;AAAA,MACxD;AAAA,IACF;AACA,IAAA,OAAO,aAAA;AAAA,EACT;AAKA,EAAA,eAAe,oBAAA,CACb,QACA,QAAA,EACe;AACf,IAAA,MAAM,WAAA,CAAa,IAAA,CAAK,MAAA,CAAO,EAAA,EAAI,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,CAAA;AACrG,IAAAC,QAAAA,CAAO,KAAA,CAAM,mBAAA,EAAqB,EAAE,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,SAAA,EAAW,MAAA,CAAO,WAAW,CAAA;AAE3G,IAAA,IAAI,YAAA,EAAc;AAEhB,MAAA,MAAM,UAAA,GAAa,gBAAgB,EAAE,QAAA,EAAU,OAAO,QAAA,EAAU,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,CAAA;AAC7F,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AAClD,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,YAAA,CAAa,IAAA,CAAK,UAAA,EAAY,EAAE,GAAG,QAAA,EAAU,SAAA,EAAW,GAAA,EAAI,EAAG,EAAE,QAAA,EAAU,QAAA,CAAS,UAAU,CAAA;AAAA,MACtG,CAAA,MACK;AACH,QAAA,MAAM,YAAA,CAAa,KAAK,UAAA,EAAY;AAAA,UAClC,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,KAAA,EAAO,aAAa,QAAQ,CAAA;AAAA,UAC5B,SAAA,EAAW,GAAA;AAAA,UACX,SAAA,EAAW;AAAA,SACb,EAAG,EAAE,QAAA,EAAU,MAAA,CAAO,UAAU,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAKA,EAAA,eAAe,eAAe,OAAA,EAA4E;AACxG,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AAG1C,IAAA,IAAI,OAAO,OAAA,IAAW,OAAA,CAAQ,YAAY,WAAA,IAAe,OAAA,CAAQ,kBAAkB,KAAA,EAAO;AACxF,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAA,CAAO,IAAA;AACxB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AACjC,QAAA,MAAM,MAAA,GAAqB;AAAA,UACzB,EAAA,EAAI,GAAG,QAAA,CAAS,EAAE,IAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,SAAA,EAAW,CAAA,CAAA;AAAA,UAC/C,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,SAAA,EAAW,QAAQ,SAAA,IAAa,SAAA;AAAA,UAChC,OAAA,EAAS;AAAA,YACP,OAAO,QAAA,CAAS,KAAA;AAAA,YAChB,UAAU,OAAA,CAAQ;AAAA,WACpB;AAAA,UACA,QAAA,EAAU;AAAA,YACR,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,OAAA,IAAW,EAAA;AAAA,YACrC,SAAA,EAAW,QAAQ,OAAA,EAAS,UAAA;AAAA,YAC5B,YAAA,EAAc,QAAQ,aAAA,IAAiB,MAAA;AAAA,YACvC,KAAA,EAAO,SAAS,KAAA,IAAS,EAAE,eAAe,CAAA,EAAG,iBAAA,EAAmB,CAAA,EAAG,YAAA,EAAc,CAAA;AAAE,WACrF;AAAA,UACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,SACzB;AACA,QAAA,MAAM,oBAAA,CAAqB,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACrD,SACO,KAAA,EAAO;AAEZ,QAAAA,QAAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,EAAE,OAAO,CAAA;AAAA,MACtD;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAOA,EAAA,gBAAgB,qBAAqB,OAAA,EAAoE;AACvG,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,IAAA,MAAM,eAAe,CAAC,EAAE,QAAQ,QAAA,IAAY,WAAA,IAAe,QAAQ,aAAA,KAAkB,KAAA,CAAA;AAGrF,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,YAAA,GAA8B,IAAA;AAElC,IAAA,MAAM,YAAoG,EAAC;AAC3G,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI,aAAA,GAAgB,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,WAAW,KAAA,IAAS,EAAA;AAEjE,IAAA,WAAA,MAAiB,KAAA,IAAS,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG;AACtD,MAAA,MAAM,KAAA;AAEN,MAAA,IAAI,CAAC,YAAA;AACH,QAAA;AAGF,MAAA,IAAI,CAAC,YAAY,KAAA,CAAM,EAAA;AACrB,QAAA,QAAA,GAAW,KAAA,CAAM,EAAA;AACnB,MAAA,IAAI,CAAC,iBAAiB,KAAA,CAAM,KAAA;AAC1B,QAAA,aAAA,GAAgB,KAAA,CAAM,KAAA;AAExB,MAAA,KAAA,MAAW,MAAA,IAAU,MAAM,OAAA,EAAS;AAClC,QAAA,IAAI,OAAO,KAAA,CAAM,OAAA;AACf,UAAA,OAAA,IAAW,OAAO,KAAA,CAAM,OAAA;AAC1B,QAAA,IAAI,MAAA,CAAO,aAAA;AACT,UAAA,YAAA,GAAe,MAAA,CAAO,aAAA;AAExB,QAAA,IAAI,MAAA,CAAO,MAAM,UAAA,EAAY;AAC3B,UAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,KAAA,CAAM,UAAA,EAAY;AACxC,YAAA,IAAI,CAAC,SAAA,CAAU,EAAA,CAAG,KAAK,CAAA,EAAG;AACxB,cAAA,SAAA,CAAU,GAAG,KAAK,CAAA,GAAI,EAAE,EAAA,EAAI,EAAA,CAAG,MAAM,EAAA,EAAI,IAAA,EAAM,YAAY,QAAA,EAAU,EAAE,MAAM,EAAA,CAAG,QAAA,EAAU,QAAQ,EAAA,EAAI,SAAA,EAAW,IAAG,EAAE;AAAA,YACxH;AACA,YAAA,IAAI,GAAG,QAAA,EAAU,SAAA;AACf,cAAA,SAAA,CAAU,GAAG,KAAK,CAAA,CAAE,QAAA,CAAS,SAAA,IAAa,GAAG,QAAA,CAAS,SAAA;AACxD,YAAA,IAAI,GAAG,QAAA,EAAU,IAAA;AACf,cAAA,SAAA,CAAU,GAAG,KAAK,CAAA,CAAE,QAAA,CAAS,IAAA,GAAO,GAAG,QAAA,CAAS,IAAA;AAClD,YAAA,IAAI,EAAA,CAAG,EAAA;AACL,cAAA,SAAA,CAAU,EAAA,CAAG,KAAK,CAAA,CAAE,EAAA,GAAK,EAAA,CAAG,EAAA;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,QAAoB,EAAE,aAAA,EAAe,GAAG,iBAAA,EAAmB,CAAA,EAAG,cAAc,CAAA,EAAE;AACpF,QAAA,MAAM,MAAA,GAAqB;AAAA,UACzB,EAAA,EAAI,GAAG,QAAA,IAAY,QAAQ,IAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,SAAA,EAAW,CAAA,CAAA;AAAA,UACxD,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,SAAA,EAAW,QAAQ,SAAA,IAAa,SAAA;AAAA,UAChC,OAAA,EAAS;AAAA,YACP,KAAA,EAAO,aAAA;AAAA,YACP,UAAU,OAAA,CAAQ;AAAA,WACpB;AAAA,UACA,QAAA,EAAU;AAAA,YACR,OAAA;AAAA,YACA,WAAW,SAAA,CAAU,MAAA,GAAS,IAAI,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA,GAAI,KAAA,CAAA;AAAA,YAC9D,cAAc,YAAA,IAAgB,MAAA;AAAA,YAC9B;AAAA,WACF;AAAA,UACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,SACzB;AACA,QAAA,MAAM,oBAAA,CAAqB,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACrD,SACO,KAAA,EAAO;AACZ,QAAAA,QAAAA,CAAO,KAAA,CAAM,mCAAA,EAAqC,EAAE,OAAO,CAAA;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAKA,EAAA,eAAe,UAAA,CACb,OACA,OAAA,EACkC;AAClC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAOG,EAAAA,CAAG,EAAE,CAAA;AAAA,IACd;AACA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,KAAA,CAAM;AAAA,QACtC,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,SAAS,EAAE,KAAA,EAAO,aAAa,SAAA,EAAW,OAAA,EAAS,SAAS,MAAA,EAAO;AAAA,QACnE,OAAO,OAAA,EAAS;AAAA,OACjB,CAAA;AACD,MAAA,OAAOA,GAAG,OAAO,CAAA;AAAA,IACnB,SACO,KAAA,EAAO;AACZ,MAAA,OAAOC,IAAI,UAAA,CAAW,kBAAA,EAAoB,IAAI,qBAAA,EAAuB,EAAE,QAAQ,EAAE,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,MAAA,CAAO,KAAK,GAAE,EAAG,GAAG,KAAK,CAAA;AAAA,IAC5J;AAAA,EACF;AAKA,EAAA,eAAe,aACb,QAAA,EACmC;AACnC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAOD,EAAAA,CAAG,EAAE,CAAA;AAAA,IACd;AACA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,KAAA,CAAM;AAAA,QACxC,QAAA;AAAA,QACA,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAa,WAAW,MAAA;AAAO,OAClD,CAAA;AACD,MAAA,OAAOA,GAAG,QAAQ,CAAA;AAAA,IACpB,SACO,KAAA,EAAO;AACZ,MAAA,OAAOC,IAAI,UAAA,CAAW,kBAAA,EAAoB,IAAI,qBAAA,EAAuB,EAAE,QAAQ,EAAE,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,MAAA,CAAO,KAAK,GAAE,EAAG,GAAG,KAAK,CAAA;AAAA,IAC5J;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAqB;AAAA,IACzB,IAAA,EAAM,cAAA;AAAA,IACN,UAAA,EAAY,oBAAA;AAAA,IACZ,UAAA,EAAY,MAAM,QAAA,CAAS,UAAA,EAAW;AAAA,IACtC,UAAA;AAAA,IACA,YAAA;AAAA,IAEA,MAAM,GAAA,CAAI,QAAA,EAAkB,OAAA,EAAkD;AAC5E,MAAA,MAAM,WAA0B,EAAC;AACjC,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,OAAA,CAAQ,cAAc,CAAA;AAAA,MACjE;AACA,MAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,UAAU,CAAA;AACjD,MAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe;AAAA,QAClC,QAAA;AAAA,QACA,OAAO,OAAA,EAAS,KAAA;AAAA,QAChB,aAAa,OAAA,EAAS,WAAA;AAAA,QACtB,UAAU,OAAA,EAAS,QAAA;AAAA,QACnB,WAAW,OAAA,EAAS,SAAA;AAAA,QACpB,eAAe,OAAA,EAAS,aAAA;AAAA,QACxB,WAAW,OAAA,EAAS,SAAA;AAAA,QACpB,QAAQ,OAAA,EAAS;AAAA,OAClB,CAAA;AACD,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,QAAA,OAAO,MAAA;AACT,MAAA,OAAOD,EAAAA,CAAG,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAA,EAAS,WAAW,EAAE,CAAA;AAAA,IAC1D,CAAA;AAAA,IAEA,OAAO,SAAA,CAAU,QAAA,EAAkB,OAAA,EAA6C;AAC9E,MAAA,MAAM,WAA0B,EAAC;AACjC,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,OAAA,CAAQ,cAAc,CAAA;AAAA,MACjE;AACA,MAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,UAAU,CAAA;AACjD,MAAA,WAAA,MAAiB,SAAS,oBAAA,CAAqB;AAAA,QAC7C,QAAA;AAAA,QACA,OAAO,OAAA,EAAS,KAAA;AAAA,QAChB,aAAa,OAAA,EAAS,WAAA;AAAA,QACtB,UAAU,OAAA,EAAS,QAAA;AAAA,QACnB,WAAW,OAAA,EAAS,SAAA;AAAA,QACpB,eAAe,OAAA,EAAS,aAAA;AAAA,QACxB,WAAW,OAAA,EAAS,SAAA;AAAA,QACpB,QAAQ,OAAA,EAAS;AAAA,OAClB,CAAA,EAAG;AACF,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAG,KAAA,EAAO,OAAA;AACvC,QAAA,IAAI,KAAA;AACF,UAAA,MAAM,KAAA;AAAA,MACV;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,eAAkB,OAAA,EAA0D;AAChF,MAAA,MAAM,eAA8B,EAAC;AACrC,MAAA,IAAI,OAAA,CAAQ,YAAA;AACV,QAAA,YAAA,CAAa,KAAK,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,OAAA,CAAQ,cAAc,CAAA;AACrE,MAAA,YAAA,CAAa,IAAA,CAAK,GAAG,OAAA,CAAQ,QAAQ,CAAA;AAErC,MAAA,MAAM,UAAA,GAAa,CAAA,CAAE,YAAA,CAAa,OAAA,CAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,QAAA;AACzC,MAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,CAAA;AACzC,MAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,MAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,QAAA,MAAM,QAAA,GAA0B,YAAY,CAAA,GACxC,YAAA,GACA,CAAC,GAAG,YAAA,EAAc,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,GAAA,CAAI,yBAAA,EAA2B,EAAE,MAAA,EAAQ,EAAE,OAAO,SAAA,EAAU,EAAG,CAAA,EAAG,CAAA;AACjH,QAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe;AAAA,UAClC,QAAA;AAAA,UACA,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,aAAa,OAAA,CAAQ,WAAA;AAAA,UACrB,WAAW,OAAA,CAAQ,SAAA;AAAA,UACnB,aAAA,EAAe,KAAA;AAAA,UACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,eAAA,EAAiB,EAAE,IAAA,EAAM,aAAA,EAAe,WAAA,EAAa,EAAE,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,UAAA,EAAY,MAAA,EAAQ,IAAA,EAAK;AAAE,SAC7G,CAAA;AACD,QAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,UAAA,OAAO,MAAA;AAET,QAAA,MAAM,UAAU,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAG,OAAA,EAAS,OAAA;AACjD,QAAA,MAAM,IAAA,GAAO,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,EAAA;AACrD,QAAA,IAAI,MAAA;AACJ,QAAA,IAAI;AACF,UAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,QAC1B,CAAA,CAAA,MACM;AACJ,UAAA,SAAA,GAAY,cAAA;AACZ,UAAA;AAAA,QACF;AACA,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA;AACjD,QAAA,IAAI,SAAA,CAAU,OAAA;AACZ,UAAA,OAAOA,EAAAA,CAAG,UAAU,IAAI,CAAA;AAC1B,QAAA,SAAA,GAAY,UAAU,KAAA,CAAM,OAAA;AAAA,MAC9B;AAEA,MAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,eAAA,EAAiB,GAAA,CAAI,yBAAA,EAA2B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,SAAA,IAAa,SAAA,EAAU,EAAG,CAAC,CAAA;AAAA,IACtH;AAAA,GACF;AAEA,EAAA,MAAM,KAAA,GAAyB;AAAA,IAC7B,MAAA,EAAQ,UAAA;AAAA,IACR,cAAA,EAAgB;AAAA,GAClB;AAEA,EAAA,MAAM,MAAA,GAA2B;AAAA,IAC/B,eAAA,EAAiB,qBAAA;AAAA,IACjB,OAAA,EAAS,aAAA;AAAA,IACT,gBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,MAAA,EAAO;AAC9B;ACpUO,SAAS,qBAAqB,KAAA,EAA0C;AAI7E,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA8B;AAEhD,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAkC;AAExD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAgC;AAEpD,EAAA,OAAO;AAAA;AAAA,IAEL,YAAA,CACE,YACA,OAAA,EACiB;AACjB,MAAA,KAAA,CAAM,GAAA,CAAI,WAAW,IAAA,EAAM;AAAA,QACzB,UAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,OAAOD,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA;AAAA,IAGA,gBAAA,CACE,UACA,OAAA,EACiB;AACjB,MAAA,SAAA,CAAU,IAAI,QAAA,CAAS,GAAA,EAAK,EAAE,QAAA,EAAU,SAAS,CAAA;AACjD,MAAA,OAAOA,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA;AAAA,IAGA,cAAA,CACE,QACA,OAAA,EACiB;AACjB,MAAA,OAAA,CAAQ,IAAI,MAAA,CAAO,IAAA,EAAM,EAAE,MAAA,EAAQ,SAAS,CAAA;AAC5C,MAAA,OAAOA,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,MAAM,QAAA,CACJ,IAAA,EACA,IAAA,EACA,OAAA,EAC6B;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,GAAA,CAAI,oBAAA,EAAsB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,QACvF;AACA,QAAA,MAAM,MAAkB,OAAA,IAAW,EAAE,SAAA,EAAW,MAAA,CAAO,YAAW,EAAE;AACpE,QAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,OAAA,CAAQ,MAAM,GAAG,CAAA;AACnD,QAAA,OAAOD,GAAG,MAAM,CAAA;AAAA,MAClB,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA;AAAA,UACL,UAAA,CAAW,cAAA;AAAA,UACX,IAAI,kBAAA,EAAoB;AAAA,YACtB,MAAA,EAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAA;AAAgB,WACjF,CAAA;AAAA,UACD;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAM,aAAa,GAAA,EAAqD;AACtE,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACtC,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,kBAAA,EAAoB,GAAA,CAAI,wBAAA,EAA0B,EAAE,MAAA,EAAQ,EAAE,GAAA,EAAI,EAAG,CAAC,CAAA;AAAA,QAC9F;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,OAAA,EAAQ;AAC3C,QAAA,OAAOD,GAAG,OAAO,CAAA;AAAA,MACnB,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA;AAAA,UACL,UAAA,CAAW,kBAAA;AAAA,UACX,IAAI,sBAAA,EAAwB;AAAA,YAC1B,MAAA,EAAQ,EAAE,GAAA,EAAK,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAA;AAAgB,WAChF,CAAA;AAAA,UACD;AAAA,SACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,MAAM,SAAA,CACJ,IAAA,EACA,IAAA,EACwC;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACrC,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,kBAAA,EAAoB,GAAA,CAAI,sBAAA,EAAwB,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,QAC7F;AAGA,QAAA,KAAA,MAAW,GAAA,IAAO,YAAA,CAAa,MAAA,CAAO,SAAA,IAAa,EAAC,EAAG;AACrD,UAAA,IAAI,GAAA,CAAI,QAAA,IAAY,EAAE,GAAA,CAAI,QAAQ,IAAA,CAAA,EAAO;AACvC,YAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,kBAAA,EAAoB,GAAA,CAAI,0BAA0B,EAAE,MAAA,EAAQ,EAAE,IAAA,EAAM,GAAA,EAAK,GAAA,CAAI,IAAA,EAAK,EAAG,CAAC,CAAA;AAAA,UAC9G;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,OAAA,CAAQ,IAAI,CAAA;AAChD,QAAA,OAAOD,GAAG,QAAQ,CAAA;AAAA,MACpB,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA;AAAA,UACL,UAAA,CAAW,kBAAA;AAAA,UACX,IAAI,oBAAA,EAAsB;AAAA,YACxB,MAAA,EAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAA;AAAgB,WACjF,CAAA;AAAA,UACD;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;ACtLA,SAAS,kBAAA,CAAmBL,QAA4B,OAAA,EAAsD;AAC5G,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,OAAA;AAC5B,EAAA,MAAM,WAAA,GAAc,EAAE,QAAA,EAAU,KAAA,EAAM;AAEtC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,QAAA,EAAyB,OAAA,KACjCA,MAAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,IACxD,MAAA,EAAQ,CAAC,KAAA,EAAe,OAAA,KACtBA,MAAAA,CAAK,MAAA,CAAO,KAAA,EAAO,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,IACpD,cAAA,EAAgB,CAAC,QAAA,EAAyB,OAAA,KACxCA,MAAAA,CAAK,cAAA,CAAe,QAAA,EAAU,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,IAC/D,GAAA,EAAK,CAAC,KAAA,KACJA,MAAAA,CAAK,GAAA,CAAI,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,IACxC,MAAA,EAAQ,CAAC,QAAA,EAAkB,OAAA,KAAYA,OAAK,MAAA,CAAO,QAAA,EAAU,SAAS,WAAW,CAAA;AAAA,IACjF,KAAK,CAAC,QAAA,KAAqBA,MAAAA,CAAK,GAAA,CAAI,UAAU,WAAW,CAAA;AAAA,IACzD,QAAQ,CAAC,QAAA,KAAqBA,MAAAA,CAAK,MAAA,CAAO,UAAU,WAAW,CAAA;AAAA,IAC/D,IAAA,EAAM,aACJA,MAAAA,CAAK,IAAA,CAAK,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,IAC3C,QAAA,EAAU,aACRA,MAAAA,CAAK,QAAA,CAAS,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,IAC/C,KAAA,EAAO,aACLA,MAAAA,CAAK,KAAA,CAAM,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO;AAAA,GAC9C;AACF;AAQO,SAAS,uBAAuBA,MAAAA,EAA8C;AACnF,EAAA,OAAO;AAAA,IACL,GAAGA,MAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQH,MAAM,MAAM,OAAA,EAAwD;AAClE,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA,IAAK,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,MAAM,CAAA,IAAK,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAA;AACzG,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAOK,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,8BAA8B,CAAC,CAAA;AAAA,MAChF;AACA,MAAA,OAAOL,MAAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B,CAAA;AAAA,IAEA,MAAA,EAAQ,CAAC,OAAA,KAAiC,kBAAA,CAAmBA,QAAM,OAAO,CAAA;AAAA,IAE1E,KAAA,EAAO;AAAA,MACL,MAAM,SAAS,OAAA,EAA0D;AACvE,QAAA,IAAI,OAAA,EAAS,YAAY,IAAA,EAAM;AAC7B,UAAA,OAAOK,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,8BAA8B,CAAC,CAAA;AAAA,QAChF;AACA,QAAA,OAAOL,OAAK,KAAA,EAAM;AAAA,MACpB;AAAA;AACF,GACF;AACF;AC1EA,IAAMC,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,kBAAA,EAAoB,CAAA;AAC5E,IAAMuB,6BAAAA,GAA+B,kBAAA;AACrC,IAAMC,8BAAAA,GAAgC,SAAA;AAItC,IAAM,+BAAA,GAAkC,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iEAAA,CAAA;AAyBxC,SAAS,eAAe,QAAA,EAAiC;AACvD,EAAA,OAAO,QAAA,CACJ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,WAAW,CAAA,CACvD,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,UAAU,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,sBAAA;AAC5D,IAAA,OAAO,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AAAA,EAC9B,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACd;AAgBA,eAAsB,eAAA,CACpB,GAAA,EACA,QAAA,EACA,OAAA,EAQwC;AACxC,EAAA,MAAM,gBAAA,GAAmB,eAAe,QAAQ,CAAA;AAChD,EAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,EAAK,EAAG;AAC5B,IAAA,OAAOpB,EAAAA,CAAG,EAAE,CAAA;AAAA,EACd;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,UAAA,GAAa,gBAAA;AACjB,IAAA,IAAI,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAA,EAAG;AAC9C,MAAA,UAAA,IAAc;;AAAA,sCAAA,EAA6C,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IACrF;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,IAAA,CAAK;AAAA,MAChC,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,GAAI,SAAS,SAAA,GAAY,EAAE,WAAW,OAAA,CAAQ,SAAA,KAAc,EAAC;AAAA,MAC7D,QAAA,EAAU;AAAA,QACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,gBAAgB,+BAAA,EAAgC;AAAA,QACpF,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,UAAA;AAAW,OACtC;AAAA,MACA,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAAH,SAAO,IAAA,CAAK,mCAAA,EAAqC,EAAE,KAAA,EAAO,UAAA,CAAW,OAAO,CAAA;AAC5E,MAAA,OAAOI,IAAI,UAAA,CAAW,qBAAA,EAAuB,IAAI,wBAAA,EAA0B,EAAE,QAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,UAAA,CAAW,MAAM,OAAO,CAAA,IAAK,CAAA,EAAG,WAAW,KAAK,CAAA;AAAA,IACvJ;AAEA,IAAA,MAAM,UAAU,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAChE,IAAA,IAAI,OAAA,GAAU,oBAAoB,OAAO,CAAA;AAGzC,IAAA,IAAI,OAAA,EAAS,aAAA,IAAiB,OAAA,CAAQ,aAAA,GAAgB,CAAA,EAAG;AACvD,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAA,CAAM,EAAE,UAAA,IAAc,CAAA,KAAM,QAAQ,aAAc,CAAA;AAAA,IAC7E;AAGA,IAAA,IAAI,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAA,EAAG;AAC9C,MAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAgB,OAAA,CAAQ,KAAK,CAAA;AACjD,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,QAAQ,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IACnD;AAGA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAA,GAAU,OAAA,CAAQ,IAAI,CAAA,CAAA,MAAM,EAAE,GAAG,CAAA,EAAG,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAS,CAAE,CAAA;AAAA,IACnE;AAEA,IAAAJ,QAAAA,CAAO,KAAA,CAAM,6BAAA,EAA+B,EAAE,YAAA,EAAc,SAAS,MAAA,EAAQ,cAAA,EAAgB,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAC7G,IAAA,OAAOG,GAAG,OAAO,CAAA;AAAA,EACnB,SACO,KAAA,EAAO;AACZ,IAAAH,QAAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,OAAO,CAAA;AAClD,IAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,qBAAA,EAAuB,GAAA,CAAI,0BAA0B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,EACzH;AACF;AAIA,IAAM,kBAAA,uBAAyB,GAAA,CAAY,CAAC,QAAQ,YAAA,EAAc,OAAA,EAAS,QAAA,EAAU,aAAa,CAAC,CAAA;AAKnG,SAAS,oBAAoB,OAAA,EAAqC;AAChE,EAAA,IAAI,OAAA,GAAU,QAAQ,IAAA,EAAK;AAG3B,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAC7B,IAAA,OAAA,GAAU,QAAQ,OAAA,CAAQkB,6BAAAA,EAA8B,EAAE,CAAA,CAAE,OAAA,CAAQC,gCAA+B,EAAE,CAAA;AAAA,EACvG;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAEjC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,OAAO,MAAA,CAAO,MAAA,CAAO,iBAAiB,CAAA,CAAE,IAAI,mBAAmB,CAAA;AAAA,IACjE;AAEA,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,IAAQ,cAAc,MAAA,EAAQ;AACzE,MAAA,MAAM,WAAY,MAAA,CAAiC,QAAA;AACnD,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3B,QAAA,OAAO,QAAA,CAAS,MAAA,CAAO,iBAAiB,CAAA,CAAE,IAAI,mBAAmB,CAAA;AAAA,MACnE;AAAA,IACF;AAEA,IAAAvB,QAAAA,CAAO,IAAA,CAAK,8CAAA,EAAgD,EAAE,OAAA,EAAS,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AAC9F,IAAA,OAAO,EAAC;AAAA,EACV,CAAA,CAAA,MACM;AACJ,IAAAA,QAAAA,CAAO,IAAA,CAAK,yCAAA,EAA2C,EAAE,OAAA,EAAS,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AACzF,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAKA,SAAS,kBAAkB,IAAA,EAAgD;AACzE,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA;AACvC,IAAA,OAAO,KAAA;AACT,EAAA,MAAM,GAAA,GAAM,IAAA;AACZ,EAAA,OAAO,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,IAAY,GAAA,CAAI,QAAQ,MAAA,GAAS,CAAA,IAC1D,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA;AAC3B;AAKA,SAAS,oBAAoB,IAAA,EAAiD;AAC5E,EAAA,MAAM,OAAO,kBAAA,CAAmB,GAAA,CAAI,KAAK,IAAc,CAAA,GACnD,KAAK,IAAA,GACL,MAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,UAAA,KAAe,WAC1C,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,UAAU,CAAC,CAAA,GACxC,GAAA;AAEJ,EAAA,OAAO;AAAA,IACL,OAAA,EAAU,IAAA,CAAK,OAAA,CAAmB,IAAA,EAAK;AAAA,IACvC,IAAA;AAAA,IACA;AAAA,GACF;AACF;AC3LA,IAAMA,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,CAAA;AAU3D,SAAS,oBAAA,CAAqB,OAAoB,WAAA,EAA0C;AACjG,EAAA,IAAI,CAAC,WAAA;AACH,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,KAAA,CAAM,aAAa,WAAA,CAAY,QAAA;AACjC,IAAA,OAAO,IAAA;AACT,EAAA,IAAI,YAAY,KAAA,EAAO;AACrB,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA;AACT,MAAA,OAAO,IAAA;AACT,IAAA,MAAM,aAAa,KAAA,CAAM,KAAA;AACzB,IAAA,OAAO,CAAC,MAAA,CAAO,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,KAAK,KAAK,CAAA,KAAM,UAAA,CAAW,GAAG,MAAM,KAAK,CAAA;AAAA,EAC7F;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,yBAAyB,QAAA,EAAiC;AACjE,EAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,IAAA,IAAI,QAAQ,IAAA,KAAS,MAAA;AACnB,MAAA,OAAO,OAAO,OAAA,CAAQ,OAAA,KAAY,QAAA,GAAW,QAAQ,OAAA,GAAU,EAAA;AAAA,EACnE;AACA,EAAA,OAAO,EAAA;AACT;AAGA,eAAsB,sBAAA,CACpB,QAAA,EACA,OAAA,EACA,MAAA,EACmC;AACnC,EAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,CAAA;AAC9B,EAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,QAAA;AAEtC,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,yBAAyB,QAAQ,CAAA;AAC/C,IAAA,IAAI,CAAC,KAAA;AACH,MAAA,OAAOI,EAAAA,CAAG,CAAC,GAAG,QAAQ,CAAC,CAAA;AAEzB,IAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,KAAA,EAAO;AAAA,MACvC,IAAA;AAAA,MACA,qBAAqB,OAAA,EAAS,mBAAA;AAAA,MAC9B,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAe,OAAA,EAAS;AAAA,KACzB,CAAA;AACD,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,MAAA,OAAOC,IAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,YAAA,CAAa,MAAM,OAAA,EAAQ,EAAG,CAAA,EAAG,aAAa,KAAK,CAAA;AAAA,IACjJ;AAEA,IAAA,IAAI,YAAA,CAAa,KAAK,MAAA,KAAW,CAAA;AAC/B,MAAA,OAAOD,EAAAA,CAAG,CAAC,GAAG,QAAQ,CAAC,CAAA;AAEzB,IAAA,IAAI,aAAa,YAAA,CAAa,IAAA,CAC3B,IAAI,CAAC,MAAA,EAAQ,UAAU,CAAA,CAAA,EAAI,KAAA,GAAQ,CAAC,CAAA,GAAA,EAAM,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA,CAC1E,KAAK,IAAI,CAAA;AAEZ,IAAA,IAAI,OAAA,EAAS,SAAA,IAAa,OAAA,CAAQ,SAAA,GAAY,CAAA,EAAG;AAC/C,MAAA,MAAM,eAAA,GAAkB,WAAW,MAAA,GAAS,IAAA;AAC5C,MAAA,IAAI,eAAA,GAAkB,QAAQ,SAAA,EAAW;AACvC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,YAAY,IAAI,CAAA;AACpD,QAAA,UAAA,GAAa,CAAA,EAAG,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAC,CAAA,GAAA,CAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc;;AAAA;AAAA,EAAkC,UAAU;AAAA,oBAAA,CAAA;AAChE,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,QAAQ,CAAA;AAE3B,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,MAAM,cAAc,MAAA,CAAO,SAAA,CAAU,CAAA,OAAA,KAAW,OAAA,CAAQ,SAAS,QAAQ,CAAA;AACzE,MAAA,IAAI,eAAe,CAAA,EAAG;AACpB,QAAA,MAAM,aAAA,GAAgB,OAAO,WAAW,CAAA;AACxC,QAAA,MAAA,CAAO,WAAW,CAAA,GAAI;AAAA,UACpB,GAAG,aAAA;AAAA,UACH,OAAA,EAAU,cAAsC,OAAA,GAAU;AAAA,SAC5D;AAAA,MACF,CAAA,MACK;AACH,QAAA,MAAA,CAAO,OAAA,CAAQ;AAAA,UACb,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,uEAAuE,WAAW,CAAA;AAAA,SAC5F,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MACK;AACH,MAAA,IAAI,aAAA,GAAgB,CAAA,CAAA;AACpB,MAAA,KAAA,IAAS,QAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,KAAA,IAAS,GAAG,KAAA,EAAA,EAAS;AACvD,QAAA,IAAI,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AACjC,UAAA,aAAA,GAAgB,KAAA;AAChB,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,QAAA,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,EAAG;AAAA,UAC9B,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,qBAAqB,WAAW,CAAA;AAAA,SAC1C,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAAH,QAAAA,CAAO,MAAM,mBAAA,EAAqB,EAAE,OAAO,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,CAAA;AAC/E,IAAA,OAAOG,GAAG,MAAM,CAAA;AAAA,EAClB,SACO,KAAA,EAAO;AACZ,IAAAH,QAAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,OAAO,CAAA;AAClD,IAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,EACvH;AACF;;;ACpGA,IAAMJ,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,iBAAA,EAAmB,CAAA;AAC3E,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,iBAAA,GAAoB,YAAA;AAC1B,IAAM,YAAA,uBAAmB,GAAA,CAAgB,CAAC,QAAQ,YAAA,EAAc,OAAA,EAAS,QAAA,EAAU,aAAa,CAAC,CAAA;AA+BjG,SAASoB,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,aAAA,CAAc,OAAgB,QAAA,EAAkC;AACvE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,aAAa,GAAA,CAAI,KAAmB,IAAI,KAAA,GAAsB,QAAA;AACpG;AAEA,SAAS,mBAAA,CAAoB,OAAgB,QAAA,EAA0B;AACrE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA,GAAI,QAAA;AACjG;AAEA,SAAS,cAAA,CAAe,OAAgB,QAAA,EAA0B;AAChE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AAC1D,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,KAAK,EAAE,OAAA,EAAQ;AAC1C,IAAA,IAAI,MAAA,CAAO,SAAS,SAAS,CAAA;AAC3B,MAAA,OAAO,SAAA;AAAA,EACX;AACA,EAAA,OAAO,QAAA;AACT;AAYA,SAAS,aAAA,CACP,OACA,QAAA,EACyB;AACzB,EAAA,MAAM,QAAA,GAAoC;AAAA,IACxC,UAAU,KAAA,CAAM,IAAA;AAAA,IAChB,cAAA,EAAgB,MAAM,UAAA,IAAc,kBAAA;AAAA,IACpC,aAAA,EAAe;AAAA,GACjB;AACA,EAAA,IAAI,KAAA,CAAM,KAAA;AACR,IAAA,QAAA,CAAS,YAAY,KAAA,CAAM,KAAA;AAC7B,EAAA,IAAI,MAAM,QAAA,IAAY,MAAA,CAAO,KAAK,KAAA,CAAM,QAAQ,EAAE,MAAA,GAAS,CAAA;AACzD,IAAA,QAAA,CAAS,eAAe,KAAA,CAAM,QAAA;AAChC,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,EAAU,QAAA;AACjC,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,IAAA,GAAO,MAAA,GAAS,CAAA;AAC3D,IAAA,QAAA,CAAS,QAAA,GAAW,SAAS,IAAA,EAAK;AACpC,EAAA,OAAO,QAAA;AACT;AAOA,SAAS,iBAAiB,QAAA,EAAwE;AAChG,EAAA,MAAM,QAAA,GAAoCA,SAAAA,CAAS,QAAA,CAAS,YAAY,CAAA,GAAI,EAAE,GAAG,QAAA,CAAS,YAAA,EAAa,GAAI,EAAC;AAC5G,EAAA,IAAI,QAAA,CAAS,QAAA,KAAa,MAAA,IAAa,OAAO,QAAA,CAAS,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA;AAChH,IAAA,QAAA,CAAS,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,IAAA,EAAK;AAC7C,EAAA,OAAO,OAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,IAAI,QAAA,GAAW,MAAA;AACvD;AAGA,SAAS,aAAA,CAAc,MAAsB,gBAAA,EAAuC;AAClF,EAAA,MAAM,WAAWA,SAAAA,CAAS,IAAA,CAAK,QAAQ,CAAA,GAAI,IAAA,CAAK,WAAW,EAAC;AAC5D,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,IAAA,CAAK,SAAA,EAAW,GAAG,CAAA;AACpD,EAAA,MAAM,QAAQA,SAAAA,CAAS,QAAA,CAAS,SAAS,CAAA,GAAI,SAAS,SAAA,GAAY,MAAA;AAElE,EAAA,MAAM,WAAW,OAAO,QAAA,CAAS,aAAA,KAAkB,QAAA,GAAW,SAAS,aAAA,GAAgB,gBAAA;AAEvF,EAAA,OAAO;AAAA,IACL,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,OAAA,EAAS,KAAK,MAAA,IAAU,EAAA;AAAA,IACxB,IAAA,EAAM,aAAA,CAAc,QAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAAA,IAC7C,UAAA,EAAY,mBAAA,CAAoB,QAAA,CAAS,cAAA,EAAgB,kBAAkB,CAAA;AAAA,IAC3E,QAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA,EAAU,iBAAiB,QAAQ,CAAA;AAAA,IACnC,SAAA;AAAA,IACA,cAAA,EAAgB,cAAA,CAAe,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AAAA,IACxD,WAAA,EAAa;AAAA,GACf;AACF;AAKA,SAAS,UAAA,CAAW,OAAoB,KAAA,EAAyC;AAC/E,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA;AACT,IAAA,OAAO,KAAA;AACT,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAM,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAO,KAAA,CAAM,KAAA,CAAkC,CAAC,MAAM,CAAC,CAAA;AAClG;AAiBA,SAAS,uBAAuB,IAAA,EAAyD;AACvF,EAAA,MAAM,iBAAiB,IAAA,CAAK,cAAA;AAC5B,EAAA,MAAM,YAAY,IAAA,CAAK,aAAA;AACvB,EAAA,MAAM,UAAU,IAAA,CAAK,aAAA;AAErB,EAAA,IAAI,OAAA,EAAS,SAAS,QAAA,EAAU;AAC9B,IAAA,OAAOhB,EAAAA,CAAG;AAAA,MACR,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa;AAAA,QACX,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,KAAK,OAAA,CAAQ,GAAA;AAAA,UACb,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,cAAA;AAAA,UACA,GAAI,SAAA,GAAY,EAAE,WAAW,kBAAA,EAAoB,SAAA,KAAc;AAAC;AAClE;AACF,KACD,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,OAAA,EAAS,SAAS,UAAA,EAAY;AAChC,IAAA,OAAOA,EAAAA,CAAG;AAAA,MACR,QAAA,EAAU,UAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa;AAAA,QACX,QAAA,EAAU,UAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,QAAQ,OAAA,CAAQ,QAAA;AAAA,UAChB,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,kBAAkB,OAAA,CAAQ,gBAAA;AAAA,UAC1B,cAAA;AAAA,UACA,GAAI,SAAA,GAAY,EAAE,WAAW,kBAAA,EAAoB,SAAA,KAAc;AAAC;AAClE;AACF,KACD,CAAA;AAAA,EACH;AAIA,EAAA,IAAI,OAAA,IAAW,CAAC,IAAA,CAAK,MAAA,CAAO,sBAAA,EAAwB;AAClD,IAAA,OAAOC,GAAAA;AAAA,MACL,UAAA,CAAW,mBAAA;AAAA,MACX,GAAA,CAAI,oCAAoC,EAAE,MAAA,EAAQ,EAAE,OAAA,EAAS,OAAA,CAAQ,IAAA,EAAK,EAAG;AAAA,KAC/E;AAAA,EACF;AACA,EAAA,IAAI,OAAA;AACF,IAAAJ,SAAO,IAAA,CAAK,4GAAA,EAA8G,EAAE,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAA;AACrJ,EAAA,OAAOG,EAAAA,CAAG;AAAA,IACR,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ,WAAA,EAAa;AAAA,MACX,QAAA,EAAU,QAAA;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,cAAA;AAAA,QACA,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc;AAAC;AACnC;AACF,GACD,CAAA;AACH;AAGA,SAAS,gBAAgB,IAAA,EAAmG;AAC1H,EAAA,MAAM,cAAc,iBAAA,CAAkB,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,cAAc,MAAA,EAAW;AAAA,IAChF,oBAAA,EAAsB,IAAI,gBAAA,EAAkB,EAAE,QAAQ,EAAE,KAAA,EAAO,kCAAA,EAAmC,EAAG;AAAA,GACtG,CAAA;AACD,EAAA,IAAI,CAAC,WAAA,CAAY,OAAA;AACf,IAAA,OAAO,WAAA;AAET,EAAA,MAAM,mBAAmB,iBAAA,CAAkB,IAAA,CAAK,QAAA,CAAS,GAAA,EAAK,aAAa,MAAA,EAAW;AAAA,IACpF,oBAAA,EAAsB,IAAI,gBAAA,EAAkB,EAAE,QAAQ,EAAE,KAAA,EAAO,uCAAA,EAAwC,EAAG;AAAA,GAC3G,CAAA;AACD,EAAA,IAAI,CAAC,gBAAA,CAAiB,OAAA;AACpB,IAAA,OAAO,gBAAA;AAET,EAAA,MAAM,cAAA,GAAiB,uBAAuB,IAAI,CAAA;AAClD,EAAA,IAAI,CAAC,cAAA,CAAe,OAAA;AAClB,IAAA,OAAO,cAAA;AAET,EAAA,OAAOA,EAAAA,CAAG;AAAA,IACR,cAAA,EAAgB,eAAe,IAAA,CAAK,QAAA;AAAA,IACpC,UAAA,EAAY,eAAe,IAAA,CAAK,UAAA;AAAA,IAChC,MAAA,EAAQ;AAAA,MACN,GAAA,EAAK;AAAA,QACH,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,MAAA,EAAQ,YAAY,IAAA,CAAK,MAAA;AAAA,UACzB,KAAA,EAAO,YAAY,IAAA,CAAK,KAAA;AAAA,UACxB,OAAA,EAAS,YAAY,IAAA,CAAK,OAAA;AAAA,UAC1B,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ;AAAA,UACN,MAAA,EAAQ,iBAAiB,IAAA,CAAK,MAAA;AAAA,UAC9B,KAAA,EAAO,iBAAiB,IAAA,CAAK,KAAA;AAAA,UAC7B,OAAA,EAAS,iBAAiB,IAAA,CAAK,OAAA;AAAA,UAC/B,GAAI,KAAK,aAAA,GAAgB,EAAE,eAAe,IAAA,CAAK,aAAA,KAAkB;AAAC;AACpE,OACF;AAAA,MACA,WAAA,EAAa,eAAe,IAAA,CAAK,WAAA;AAAA,MACjC,cAAA,EAAgB,IAAA;AAAA,MAChB,kBAAA,EAAoB,KAAK,MAAA,CAAO;AAAA;AAClC,GACD,CAAA;AACH;AAEA,eAAeqB,gBAAAA,CAAgB,OAAA,EAAyB,QAAA,EAAyB,OAAA,EAAmE;AAClJ,EAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,OAAA,CAAQ,eAAA;AAI9C,EAAA,MAAM,SAAA,GAAY,MAAM,eAAA,CAAqB,OAAA,CAAQ,KAAK,QAAA,EAAU;AAAA,IAClE,OAAO,OAAA,EAAS,KAAA;AAAA,IAChB,OAAO,OAAA,EAAS,KAAA;AAAA,IAChB,eAAe,OAAA,EAAS,aAAA;AAAA,IACxB,YAAA,EAAc,OAAA,EAAS,YAAA,IAAgB,OAAA,CAAQ,YAAA;AAAA,IAC/C,QAAA;AAAA,IACA,WAAW,OAAA,EAAS;AAAA,GACrB,CAAA;AACD,EAAA,IAAI,CAAC,SAAA,CAAU,OAAA;AACb,IAAA,OAAO,SAAA;AACT,EAAA,IAAI,SAAA,CAAU,KAAK,MAAA,KAAW,CAAA;AAC5B,IAAA,OAAOrB,EAAAA,CAAG,EAAE,CAAA;AAEd,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,UAAU,IAAA,CAAK,GAAA,CAAI,OAAO,KAAA,KAAU;AACnE,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG;AAAA,QACpF,MAAA,EAAQ,QAAA;AAAA,QACR,UAAU,aAAA,CAAc,EAAE,IAAA,EAAM,KAAA,CAAM,MAAM,UAAA,EAAY,KAAA,CAAM,UAAA,EAAY,KAAA,EAAO,SAAS,KAAA,EAAO,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,QAAQ,CAAA;AAAA,QACrI,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AAC/B,MAAA,OAAO,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,QAAQ,CAAA,GAAI,KAAA,CAAA;AAAA,IAChD,CAAC,CAAC,CAAA;AACF,IAAA,OAAOA,GAAG,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAgC,KAAA,KAAU,MAAS,CAAC,CAAA;AAAA,EAC/E,SACO,KAAA,EAAO;AACZ,IAAAH,QAAAA,CAAO,KAAA,CAAM,yBAAA,EAA2B,EAAE,OAAO,CAAA;AACjD,IAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,qBAAA,EAAuB,GAAA,CAAI,0BAA0B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,EACzH;AACF;AAEA,eAAe,cAAA,CAAe,OAAA,EAAyB,KAAA,EAAe,OAAA,EAAwN;AAC5R,EAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,OAAA,CAAQ,eAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,OAAA,EAAS,IAAA,IAAQ,OAAA,CAAQ,WAAA;AACtC,EAAA,MAAM,sBAAsB,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,EAAS,mBAAA,IAAuB,QAAQ,mBAAmB,CAAA;AACnG,EAAA,IAAI;AAGF,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MAClD,OAAA,EAAS,EAAE,MAAA,EAAQ,QAAA,EAAS;AAAA,MAC5B,MAAM,IAAA,GAAO;AAAA,KACd,CAAA;AACD,IAAA,IAAI,OAAA,GAAU,SAAS,OAAA,CACpB,GAAA,CAAI,UAAQ,aAAA,CAAc,IAAA,EAAM,QAAQ,CAAC,CAAA,CAEzC,OAAO,CAAA,KAAA,KAAS,KAAA,CAAM,aAAa,QAAQ,CAAA,CAE3C,OAAO,CAAA,KAAA,KAAS,CAAC,OAAA,EAAS,KAAA,IAAS,UAAA,CAAW,KAAA,EAAO,QAAQ,KAAK,CAAC,EAEnE,MAAA,CAAO,CAAA,KAAA,KAAS,CAAC,OAAA,EAAS,KAAA,EAAO,UAAU,OAAA,CAAQ,KAAA,CAAM,SAAS,KAAA,CAAM,IAAI,CAAC,CAAA,CAC7E,MAAA,CAAO,WAAS,KAAA,CAAM,UAAA,KAAe,OAAA,EAAS,aAAA,IAAiB,CAAA,CAAE,CAAA;AAGpE,IAAA,MAAM,gBAAgB,OAAA,EAAS,aAAA;AAC/B,IAAA,IAAI,aAAA,IAAiB,aAAA,GAAgB,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC5D,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,KAAS,MAAM,SAAS,CAAA;AAClD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,GAAG,KAAK,CAAA;AACjC,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAG,KAAK,CAAA,GAAI,OAAO,CAAA;AACrD,MAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,MAAA,OAAA,GAAU,OAAA,CACP,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AACrB,QAAA,MAAM,SAAA,GAAY,CAAA,GAAI,KAAA,IAAS,KAAA,GAAQ,CAAA,CAAA;AACvC,QAAA,MAAM,OAAA,GAAA,CAAW,KAAA,CAAM,SAAA,GAAY,OAAA,IAAW,IAAA;AAC9C,QAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,aAAa,CAAA,GAAI,aAAA,CAAA,GAAiB,UAAU,aAAA,EAAc;AAAA,MACnF,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA,CAChC,GAAA,CAAI,CAAA,MAAA,KAAU,OAAO,KAAK,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAOD,EAAAA,CAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,EAClC,SACO,KAAA,EAAO;AACZ,IAAAH,QAAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,OAAO,CAAA;AAChD,IAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,EACvH;AACF;AAEA,eAAe,SAAA,CAAU,SAAyB,KAAA,EAA0D;AAC1G,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,OAAA,CAAQ,eAAA;AAC3C,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG;AAAA,MACpF,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,aAAA,CAAc,KAAA,EAAO,QAAQ,CAAA;AAAA,MACvC,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA;AACH,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAC7D,IAAA,OAAOD,EAAAA,CAAG,aAAA,CAAc,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAAA,EAC3C,SACO,KAAA,EAAO;AACZ,IAAAH,QAAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,OAAO,CAAA;AAC7C,IAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,wBAAwB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,EACrH;AACF;AAYA,eAAe,YAAA,CAAa,OAAA,EAAyB,QAAA,EAAkB,OAAA,EAA4B,WAAA,EAAkE;AACnK,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,QAAQ,CAAA;AAC9C,IAAA,IAAI,CAAC,IAAA;AACH,MAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,mBAAA,EAAqB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,QAAA,EAAS,EAAG,CAAC,CAAA;AAEhG,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,IAAA,EAAM,OAAA,CAAQ,eAAe,CAAA;AAC5D,IAAA,IAAI,oBAAA,CAAqB,UAAU,WAAW,CAAA;AAC5C,MAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,mBAAA,EAAqB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,QAAA,EAAS,EAAG,CAAC,CAAA;AAChG,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,IAAY,OAAA,CAAQ,eAAA;AAG9C,IAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,OAAA,KAAY,KAAA,CAAA,IAC1C,OAAA,CAAQ,IAAA,KAAS,KAAA,CAAA,IACjB,OAAA,CAAQ,UAAA,KAAe,KAAA,CAAA,IACvB,OAAA,CAAQ,QAAA,KAAa,KAAA,CAAA;AAC1B,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,QAAQ,OAAQ,CAAA;AACtD,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,QAAQ,CAAA;AACnD,MAAA,OAAOD,EAAAA,CAAG,SAAA,GAAY,aAAA,CAAc,SAAA,EAAW,QAAQ,CAAA,GAAI,EAAE,GAAG,QAAA,EAAU,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAU,CAAA;AAAA,IACvG;AAGA,IAAA,MAAM,MAAA,GAA2B;AAAA,MAC/B,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,QAAA,CAAS,OAAA;AAAA,MACrC,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,QAAA,CAAS,IAAA;AAAA,MAC/B,UAAA,EAAY,OAAA,CAAQ,UAAA,IAAc,QAAA,CAAS,UAAA;AAAA,MAC3C,QAAA;AAAA,MACA,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,QAAA,CAAS;AAAA,KACzC;AACA,IAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AACpC,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,CAAA,EAAG;AAAA,MACrF,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU,aAAA,CAAc,MAAA,EAAQ,QAAQ,CAAA;AAAA,MACxC,KAAA,EAAO,KAAA;AAAA,MACP,WAAW,QAAA,CAAS;AAAA,KACrB,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA;AACH,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAC9D,IAAA,OAAOA,EAAAA,CAAG,aAAA,CAAc,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAAA,EAC3C,SACO,KAAA,EAAO;AACZ,IAAAH,SAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,EAAA,EAAI,QAAA,EAAU,OAAO,CAAA;AAC9D,IAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,wBAAwB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,EACrH;AACF;AAEA,eAAe,SAAA,CAAU,OAAA,EAAyB,QAAA,EAAkB,WAAA,EAAkE;AACpI,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,QAAQ,CAAA;AAC9C,IAAA,IAAI,CAAC,IAAA;AACH,MAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,mBAAA,EAAqB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,QAAA,EAAS,EAAG,CAAC,CAAA;AAChG,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,EAAM,OAAA,CAAQ,eAAe,CAAA;AACzD,IAAA,IAAI,oBAAA,CAAqB,OAAO,WAAW,CAAA;AACzC,MAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,mBAAA,EAAqB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,QAAA,EAAS,EAAG,CAAC,CAAA;AAChG,IAAA,OAAOD,GAAG,KAAK,CAAA;AAAA,EACjB,SACO,KAAA,EAAO;AACZ,IAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,EACvH;AACF;AAEA,eAAe,YAAA,CAAa,OAAA,EAAyB,QAAA,EAAkB,WAAA,EAA2D;AAChI,EAAA,IAAI;AACF,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,QAAQ,CAAA;AAC9C,MAAA,IAAI,CAAC,QAAQ,oBAAA,CAAqB,aAAA,CAAc,MAAM,OAAA,CAAQ,eAAe,GAAG,WAAW,CAAA;AACzF,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,mBAAA,EAAqB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,QAAA,EAAS,EAAG,CAAC,CAAA;AAAA,IAClG;AACA,IAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AACpC,IAAA,OAAOD,GAAG,KAAA,CAAS,CAAA;AAAA,EACrB,SACO,KAAA,EAAO;AACZ,IAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,wBAAwB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,EACrH;AACF;AASA,eAAe,YAAA,CAAa,SAAyB,OAAA,EAAgI;AACnL,EAAA,MAAM,QAAA,GAAW,OAAA,EAAS,QAAA,IAAY,OAAA,CAAQ,eAAA;AAE9C,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,MAAA,EAAQ,QAAA,EAAS,EAAG,CAAA;AAC9E,EAAA,IAAI,OAAA,GAAU,QAAA,CAAS,OAAA,CACpB,GAAA,CAAI,UAAQ,aAAA,CAAc,IAAA,EAAM,QAAQ,CAAC,CAAA,CACzC,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,aAAa,QAAQ,CAAA;AAC9C,EAAA,IAAI,SAAS,KAAA,EAAO,MAAA;AAClB,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAO,CAAA,KAAA,KAAS,OAAA,CAAQ,MAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAC,CAAA;AACvE,EAAA,IAAI,OAAA,EAAS,KAAA;AACX,IAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAA,KAAA,KAAS,WAAW,KAAA,EAAO,OAAA,CAAQ,KAAM,CAAC,CAAA;AACrE,EAAA,OAAO,OAAA,EAAS,UAAU,MAAA,GAAY,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA,GAAI,OAAA;AAC1E;AASA,eAAsB,8BAA8B,IAAA,EAAkD;AACpG,EAAA,MAAM,YAAA,GAAe,gBAAgB,IAAI,CAAA;AACzC,EAAA,IAAI,CAAC,YAAA,CAAa,OAAA;AAChB,IAAA,MAAM,YAAA,CAAa,KAAA;AAErB,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,MAAM,OAAO,YAAY,CAAA;AAAA,EACjC,SACO,KAAA,EAAO;AACZ,IAAAJ,QAAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,OAAO,CAAA;AACnD,IAAA,MAAM,IAAI,MAAM,kFAAkF,CAAA;AAAA,EACpG;AAGA,EAAAA,QAAAA,CAAO,KAAK,6BAAA,EAA+B;AAAA,IACzC,cAAA,EAAgB,aAAa,IAAA,CAAK,cAAA;AAAA,IAClC,UAAA,EAAY,aAAa,IAAA,CAAK;AAAA,GAC/B,CAAA;AAED,EAAA,MAAM,OAAA,GAA0B;AAAA,IAC9B,QAAQ,IAAI,GAAA,CAAI,MAAA,CAAO,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,IAC/C,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,YAAA,EAAc,KAAK,MAAA,CAAO,YAAA;AAAA,IAC1B,eAAA,EAAiB,iBAAA;AAAA,IACjB,WAAA,EAAa,KAAK,MAAA,CAAO,WAAA;AAAA,IACzB,mBAAA,EAAqB,KAAK,MAAA,CAAO;AAAA,GACnC;AAEA,EAAA,MAAM,SAAyC,CAAC,KAAA,EAAO,OAAA,KAAY,cAAA,CAAe,SAAS,KAAA,EAAO;AAAA,IAChG,IAAA,EAAM,OAAA,EAAS,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,WAAA;AAAA,IACnC,qBAAqB,OAAA,EAAS,mBAAA;AAAA,IAC9B,UAAU,OAAA,EAAS,QAAA;AAAA,IACnB,eAAe,OAAA,EAAS,aAAA;AAAA,IACxB,OAAO,OAAA,EAAS,KAAA;AAAA,IAChB,eAAe,OAAA,EAAS,aAAA;AAAA,IACxB,OAAO,OAAA,EAAS;AAAA,GACjB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAS,CAAC,QAAA,EAAU,YAAYwB,gBAAAA,CAAgB,OAAA,EAAS,UAAU,OAAO,CAAA;AAAA,IAC1E,MAAA;AAAA,IACA,gBAAgB,CAAC,QAAA,EAAU,YAAY,sBAAA,CAAuB,QAAA,EAAU,SAAS,MAAM,CAAA;AAAA,IACvF,GAAA,EAAK,CAAA,KAAA,KAAS,SAAA,CAAU,OAAA,EAAS,KAAK,CAAA;AAAA,IACtC,MAAA,EAAQ,CAAC,QAAA,EAAU,OAAA,EAAS,gBAAgB,YAAA,CAAa,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,WAAW,CAAA;AAAA,IAChG,KAAK,CAAC,QAAA,EAAU,gBAAgB,SAAA,CAAU,OAAA,EAAS,UAAU,WAAW,CAAA;AAAA,IACxE,QAAQ,CAAC,QAAA,EAAU,gBAAgB,YAAA,CAAa,OAAA,EAAS,UAAU,WAAW,CAAA;AAAA,IAC9E,MAAM,KAAK,OAAA,EAAS;AAClB,MAAA,IAAI;AACF,QAAA,OAAOrB,EAAAA,CAAG,MAAM,YAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,MAChD,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACvH;AAAA,IACF,CAAA;AAAA,IACA,MAAM,SAAS,OAAA,EAAS;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,CAAA;AAClC,QAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,EAAA;AAEhC,QAAA,MAAM,GAAA,GAAM,MAAM,YAAA,CAAa,OAAA,EAAS,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,OAAO,CAAA;AACrH,QAAA,OAAOD,EAAAA,CAAG,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,MAAA,GAAS,KAAK,CAAA,EAAG,KAAA,EAAO,GAAA,CAAI,MAAA,EAAQ,CAAA;AAAA,MAC3E,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACvH;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAM,MAAM,OAAA,EAAS;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,cAAA,GAAiB,QAAQ,OAAA,EAAS,KAAA,EAAO,MAAM,CAAA,IAAK,OAAA,CAAQ,SAAS,KAAK,CAAA;AAEhF,QAAA,IAAI,CAAC,OAAA,EAAS,QAAA,IAAY,CAAC,cAAA,EAAgB;AACzC,UAAA,MAAM,OAAA,CAAQ,OAAO,KAAA,EAAM;AAC3B,UAAA,OAAOD,GAAG,KAAA,CAAS,CAAA;AAAA,QACrB;AAEA,QAAA,IAAI,OAAA,EAAS,QAAA,IAAY,CAAC,cAAA,EAAgB;AACxC,UAAA,MAAM,QAAQ,MAAA,CAAO,SAAA,CAAU,EAAE,MAAA,EAAQ,OAAA,CAAQ,UAAU,CAAA;AAC3D,UAAA,OAAOA,GAAG,KAAA,CAAS,CAAA;AAAA,QACrB;AAGA,QAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,OAAA,EAAS,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,OAAO,CAAA;AACzH,QAAA,KAAA,MAAW,KAAA,IAAS,OAAA;AAClB,UAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AACtC,QAAAH,SAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,OAAA,EAAS,OAAA,CAAQ,QAAQ,QAAA,EAAU,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,SAAS,KAAA,EAAO,MAAA,EAAQ,QAAQ,OAAA,EAAS,KAAK,GAAG,CAAA;AAC1J,QAAA,OAAOG,GAAG,KAAA,CAAS,CAAA;AAAA,MACrB,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,wBAAwB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACrH;AAAA,IACF;AAAA,GACF;AACF;ACtkBA,IAAMJ,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,sBAAA,EAAwB,CAAA;AAChF,IAAM0B,mBAAAA,GAAqB,GAAA;AAC3B,IAAMC,aAAAA,uBAAmB,GAAA,CAAgB,CAAC,QAAQ,YAAA,EAAc,OAAA,EAAS,QAAA,EAAU,aAAa,CAAC,CAAA;AACjG,IAAM,wBAAA,GAA2B,kBAAA;AACjC,IAAM,yBAAA,GAA4B,SAAA;AAElC,IAAM,kCAAA,GAAqC;AAAA,EACzC,+EAAA;AAAA,EACA,oFAAA;AAAA,EACA,yFAAA;AAAA,EACA,kHAAA;AAAA,EACA,uBAAA;AAAA,EACA,gDAAA;AAAA,EACA,4EAAA;AAAA,EACA,6EAAA;AAAA,EACA,gGAAA;AAAA,EACA,QAAA;AAAA,EACA,wEAAA;AAAA,EACA,sCAAA;AAAA,EACA,kFAAA;AAAA,EACA,qEAAA;AAAA,EACA,iFAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI,CAAA;AAyBX,SAAS,gBAAgB,OAAA,EAAyB;AAChD,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA;AAC3B,IAAA,OAAO,OAAA;AACT,EAAA,OAAO,OAAA,CAAQ,QAAQ,wBAAA,EAA0B,EAAE,EAAE,OAAA,CAAQ,yBAAA,EAA2B,EAAE,CAAA,CAAE,IAAA,EAAK;AACnG;AAEA,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,OAAO,QAAQ,IAAA,EAAK,CAAE,QAAQ,MAAA,EAAQ,GAAG,EAAE,iBAAA,EAAkB;AAC/D;AAEA,SAASC,cAAAA,CAAc,OAAgB,QAAA,EAAkC;AACvE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAYD,cAAa,GAAA,CAAI,KAAmB,IACpE,KAAA,GACA,QAAA;AACN;AAEA,SAASE,oBAAAA,CAAoB,OAAgB,QAAA,EAA0B;AACrE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,SAAS,KAAK,CAAA,GACrD,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA,GAC9B,QAAA;AACN;AAGA,eAAe,cAAA,CACb,IAAA,EACA,UAAA,EACA,OAAA,EACmC;AACnC,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,GAAA;AAAA,IAClC,WAAW,GAAA,CAAI,CAAA,SAAA,KAAa,IAAA,CAAK,MAAA,CAAO,UAAU,OAAA,EAAS;AAAA,MACzD,MAAM,IAAA,CAAK,WAAA;AAAA,MACX,QAAA,EAAU,SAAA,CAAU,QAAA,IAAY,OAAA,EAAS,QAAA;AAAA,MACzC,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,OAAO,OAAA,EAAS;AAAA,KACjB,CAAC;AAAA,GACJ;AAEA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAyB;AAC7C,EAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,MAAA,OAAO,MAAA;AACT,IAAA,KAAA,MAAW,SAAS,MAAA,CAAO,IAAA;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AAAA,EAC/B;AACA,EAAA,OAAOzB,GAAG,CAAC,GAAG,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AACjC;AAQA,SAAS,qBAAA,CACP,GAAA,EACA,UAAA,EACA,UAAA,EACmB;AACnB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,GAAG,CAAC,CAAA;AAC9C,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAC7B,MAAA,GACA,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,IAAQ,MAAM,OAAA,CAAS,MAAA,CAAgC,MAAM,CAAA,GACnG,MAAA,CAAiC,SAClC,EAAC;AAEP,EAAA,MAAM,eAAA,GAAkB,IAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAA,SAAA,KAAa,CAAC,aAAA,CAAc,SAAA,CAAU,OAAO,CAAA,EAAG,SAAS,CAAC,CAAC,CAAA;AAC1G,EAAA,MAAM,MAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA;AACvC,MAAA;AACF,IAAA,MAAM,MAAA,GAAS,IAAA;AACf,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,IAAA,KAAS,WAAW,MAAA,CAAO,IAAA,CAAK,MAAK,GAAI,EAAA;AACpE,IAAA,IAAI,CAAC,IAAA;AACH,MAAA;AAEF,IAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,CAAO,KAAA,IAAS,KAAK,EAAE,WAAA,EAAY;AACxD,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,GAAA,CAAI,aAAA,CAAc,IAAI,CAAC,CAAA;AACxD,IAAA,MAAM,OAAOwB,cAAAA,CAAc,MAAA,CAAO,IAAA,EAAM,QAAA,EAAU,QAAQ,MAAM,CAAA;AAChE,IAAA,MAAM,aAAaC,oBAAAA,CAAoB,MAAA,CAAO,UAAA,EAAY,QAAA,EAAU,cAAcH,mBAAkB,CAAA;AACpG,IAAA,MAAM,WAAW,OAAO,MAAA,CAAO,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,IACpF,MAAA,CAAO,QAAA,CAAS,MAAK,GACrB,YAAA,CAAa,UAAU,QAAQ,CAAA;AACnC,IAAA,MAAM,KAAK,OAAO,MAAA,CAAO,EAAA,KAAO,QAAA,GAAW,OAAO,EAAA,GAAK,MAAA;AAEvD,IAAA,IAAI,UAAU,QAAA,IAAY,EAAA,IAAM,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA,EAAG;AAClD,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,QAAA,EAAU,IAAI,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,CAAA;AAAA,IACpE,WACS,KAAA,KAAU,QAAA,IAAY,MAAM,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA,EAAG;AACvD,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,QAAA,EAAU,IAAI,IAAA,EAAM,IAAA,EAAM,YAAY,CAAA;AAAA,IAC1D,CAAA,MAAA,IACS,UAAU,MAAA,EAAQ;AAEzB,MAAA;AAAA,IACF,CAAA,MACK;AACH,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,EAAO,MAAM,IAAA,EAAM,UAAA,EAAY,UAAU,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,aAAa,QAAA,EAAmE;AACvF,EAAA,MAAM,QAAQ,QAAA,EAAU,QAAA;AACxB,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,GAAI,MAAA;AAC/E;AAGA,SAAS,YAAA,CAAa,UAA+C,QAAA,EAAmE;AACtI,EAAA,IAAI,CAAC,QAAA;AACH,IAAA,OAAO,QAAA;AACT,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,QAAA,EAAS;AACjC;AAQA,eAAe,qBAAA,CACb,IAAA,EACA,GAAA,EACA,OAAA,EACmC;AACnC,EAAA,MAAM,UAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,IAAI,EAAA,CAAG,KAAA,KAAU,QAAA,IAAY,EAAA,CAAG,EAAA,EAAI;AAClC,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA,CAAO,GAAG,EAAE,CAAA;AAC5C,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA;AAChB,QAAAzB,QAAAA,CAAO,IAAA,CAAK,8BAAA,EAAgC,EAAE,EAAA,EAAI,EAAA,CAAG,EAAA,EAAI,KAAA,EAAO,YAAA,CAAa,KAAA,CAAM,OAAA,EAAS,CAAA;AAC9F,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,EAAA,CAAG,KAAA,KAAU,QAAA,IAAY,EAAA,CAAG,EAAA,EAAI;AAClC,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA,CAAO,GAAG,EAAA,EAAI;AAAA,QAC5C,SAAS,EAAA,CAAG,IAAA;AAAA,QACZ,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,YAAY,EAAA,CAAG,UAAA;AAAA,QACf,UAAU,EAAA,CAAG,QAAA,GAAW,EAAE,QAAA,EAAU,EAAA,CAAG,UAAS,GAAI;AAAA,OACrD,CAAA;AACD,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA;AAChB,QAAA,OAAO,YAAA;AACT,MAAA,OAAA,CAAQ,IAAA,CAAK,aAAa,IAAI,CAAA;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,GAAA,CAAI;AAAA,MAC/B,SAAS,EAAA,CAAG,IAAA;AAAA,MACZ,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,YAAY,EAAA,CAAG,UAAA;AAAA,MACf,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,QAAA,EAAU,YAAA,CAAa,MAAA,EAAW,EAAA,CAAG,QAAQ;AAAA,KAC9C,CAAA;AACD,IAAA,IAAI,CAAC,SAAA,CAAU,OAAA;AACb,MAAA,OAAO,SAAA;AACT,IAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,EAC7B;AAEA,EAAA,OAAOG,GAAG,OAAO,CAAA;AACnB;AAYA,eAAsB,qBAAA,CACpB,IAAA,EACA,QAAA,EACA,OAAA,EACmC;AACnC,EAAAH,SAAO,KAAA,CAAM,uBAAA,EAAyB,EAAE,YAAA,EAAc,QAAA,CAAS,QAAQ,CAAA;AAEvE,EAAA,MAAM,aAAA,GAAgB,MAAM,eAAA,CAAgB,IAAA,CAAK,KAAK,QAAA,EAAU;AAAA,IAC9D,OAAO,OAAA,EAAS,KAAA;AAAA,IAChB,OAAO,OAAA,EAAS,KAAA;AAAA,IAChB,eAAe,OAAA,EAAS,aAAA;AAAA,IACxB,UAAU,OAAA,EAAS,QAAA;AAAA,IACnB,YAAA,EAAc,OAAA,EAAS,YAAA,IAAgB,IAAA,CAAK,YAAA;AAAA,IAC5C,WAAW,OAAA,EAAS;AAAA,GACrB,CAAA;AACD,EAAA,IAAI,CAAC,aAAA,CAAc,OAAA;AACjB,IAAA,OAAO,aAAA;AAET,EAAA,MAAM,aAAa,aAAA,CAAc,IAAA;AACjC,EAAA,IAAI,WAAW,MAAA,KAAW,CAAA;AACxB,IAAA,OAAOG,EAAAA,CAAG,EAAE,CAAA;AAEd,EAAA,MAAM,aAAA,GAAgB,MAAM,cAAA,CAAe,IAAA,EAAM,YAAY,OAAO,CAAA;AACpE,EAAA,IAAI,CAAC,aAAA,CAAc,OAAA;AACjB,IAAA,OAAO,aAAA;AACT,EAAA,MAAM,UAAU,aAAA,CAAc,IAAA;AAE9B,EAAA,MAAM,mBAAA,GAAsB,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK;AAAA,IAC9C,OAAO,OAAA,EAAS,KAAA;AAAA,IAChB,GAAI,SAAS,SAAA,GAAY,EAAE,WAAW,OAAA,CAAQ,SAAA,KAAc,EAAC;AAAA,IAC7D,QAAA,EAAU;AAAA,MACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,kCAAA,EAAmC;AAAA,MAC9D;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,KAAK,SAAA,CAAU;AAAA,UACtB,gBAAA,EAAkB,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,YACtC,IAAI,KAAA,CAAM,EAAA;AAAA,YACV,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,YAAY,KAAA,CAAM,UAAA;AAAA,YAClB,QAAA,EAAU,YAAA,CAAa,KAAA,CAAM,QAAQ;AAAA,WACvC,CAAE,CAAA;AAAA,UACF,QAAA,EAAU,UAAA,CAAW,GAAA,CAAI,CAAA,SAAA,MAAc;AAAA,YACrC,MAAM,SAAA,CAAU,OAAA;AAAA,YAChB,MAAM,SAAA,CAAU,IAAA;AAAA,YAChB,UAAA,EAAY,UAAU,UAAA,IAAcsB;AAAA,WACtC,CAAE;AAAA,SACH;AAAA;AACH,KACF;AAAA,IACA,WAAA,EAAa;AAAA,GACd,CAAA;AACD,EAAA,IAAI,CAAC,oBAAoB,OAAA,EAAS;AAChC,IAAA,OAAOrB,IAAI,UAAA,CAAW,qBAAA,EAAuB,IAAI,wBAAA,EAA0B,EAAE,QAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,mBAAA,CAAoB,MAAM,OAAO,CAAA,IAAK,CAAA,EAAG,oBAAoB,KAAK,CAAA;AAAA,EACzK;AAEA,EAAA,MAAM,aAAa,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAC5E,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,KAAA,KAAS,KAAA,CAAM,EAAE,CAAC,CAAA;AACzD,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,qBAAA,CAAsB,UAAA,EAAY,UAAA,EAAY,UAAU,CAAA;AAAA,EAChE,CAAA,CAAA,MACM;AAEJ,IAAAJ,QAAAA,CAAO,IAAA,CAAK,8DAAA,EAAgE,EAAE,OAAA,EAAS,WAAW,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AACjH,IAAA,GAAA,GAAM,UAAA,CAAW,IAAI,CAAA,SAAA,MAAc;AAAA,MACjC,KAAA,EAAO,KAAA;AAAA,MACP,MAAM,SAAA,CAAU,OAAA;AAAA,MAChB,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,UAAA,EAAY,UAAU,UAAA,IAAcyB;AAAA,KACtC,CAAE,CAAA;AAAA,EACJ;AAEA,EAAA,MAAM,WAAA,GAAc,MAAM,qBAAA,CAAsB,IAAA,EAAM,KAAK,OAAO,CAAA;AAClE,EAAA,IAAI,CAAC,WAAA,CAAY,OAAA;AACf,IAAA,OAAO,WAAA;AAET,EAAAzB,SAAO,KAAA,CAAM,yBAAA,EAA2B,EAAE,UAAA,EAAY,WAAW,MAAA,EAAQ,OAAA,EAAS,OAAA,CAAQ,MAAA,EAAQ,KAAK,GAAA,CAAI,MAAA,EAAQ,SAAS,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAA;AACrJ,EAAA,OAAOG,EAAAA,CAAG,YAAY,IAAI,CAAA;AAC5B;;;ACjSA,IAAMH,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,eAAA,EAAiB,CAAA;AAGzE,IAAM,mBAAA,GAAsB,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAO/C,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACrE;AAOA,SAAS,gBAAA,CAAiB,GAAa,CAAA,EAAqB;AAC1D,EAAA,IAAI,CAAA,CAAE,WAAW,CAAA,CAAE,MAAA;AACjB,IAAA,OAAO,CAAA;AACT,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,GAAA,IAAO,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACjB,IAAA,KAAA,IAAS,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACnB,IAAA,KAAA,IAAS,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,EACrB;AACA,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAK,KAAK,CAAA;AAChD,EAAA,OAAO,KAAA,KAAU,CAAA,GAAI,CAAA,GAAI,GAAA,GAAM,KAAA;AACjC;AAYA,SAAS8B,WAAAA,CAAW,OAAoB,KAAA,EAAyC;AAC/E,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA;AACT,IAAA,OAAO,KAAA;AACT,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAM,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,KAAA,CAAM,KAAA,CAAO,CAAC,MAAM,CAAC,CAAA;AACtE;AAeO,SAAS,4BAAA,CACd,MAAA,EACA,GAAA,EACA,SAAA,EACA,OACA,WAAA,EACsB;AAItB,EAAA,eAAe,cAAc,IAAA,EAA6C;AACxE,IAAA,IAAI,CAAC,MAAA,CAAO,gBAAA,IAAoB,CAAC,SAAA;AAC/B,MAAA,OAAO,MAAA;AAET,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AAC7C,IAAA,IAAI,MAAA,CAAO,OAAA;AACT,MAAA,OAAO,MAAA,CAAO,IAAA;AAEhB,IAAA7B,SAAO,IAAA,CAAK,wCAAA,EAA0C,EAAE,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AAC7E,IAAA,OAAO,MAAA;AAAA,EACT;AAOA,EAAA,eAAe,YAAY,UAAA,EAA0C;AACnE,IAAA,IAAI,WAAW,MAAA,KAAW,CAAA;AACxB,MAAA;AAEF,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,WAAA,GAAc,QAAA;AAClB,IAAA,IAAI,QAAA,GAA0B,IAAA;AAE9B,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,SAAA;AACxB,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,MAAM,mBAAmB,CAAA;AACzD,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,GAAa,GAAA,GAAM,OAAA,GAAU,GAAA;AACjD,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,WAAA,GAAc,KAAA;AACd,QAAA,QAAA,GAAW,KAAA,CAAM,EAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,KAAA,CAAM,OAAO,QAAQ,CAAA;AAC3B,MAAA,MAAM,WAAA,CAAY,OAAO,QAAQ,CAAA;AAAA,IACnC;AAAA,EACF;AAYA,EAAA,eAAe,cAAc,QAAA,EAAkC;AAE7D,IAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,KAAA,EAAM;AACtC,IAAA,IAAI,WAAA,IAAe,OAAO,gBAAA,EAAkB;AAC1C,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAa,SAAA,EAAW,KAAA,EAAM,EAAG,KAAA,EAAO,aAAa,CAAA;AACvG,MAAA,MAAM,YAAY,GAAG,CAAA;AAAA,IACvB;AAGA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,cAAc,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,UAAU,CAAA;AAClD,MAAA,IAAI,WAAA,IAAe,OAAO,mBAAA,EAAqB;AAC7C,QAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,QAAA,EAAU,OAAA,EAAS,EAAE,KAAA,EAAO,aAAa,SAAA,EAAW,KAAA,EAAM,EAAG,KAAA,EAAO,aAAa,CAAA;AAC3H,QAAA,MAAM,YAAY,aAAa,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAKA,EAAA,eAAe,SAAA,CAAU,OAAyB,MAAA,EAAyC;AACzF,IAAA,MAAM,aAAA,CAAc,MAAM,QAAQ,CAAA;AAElC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,KAAA,GAAqB;AAAA,MACzB,IAAI,UAAA,EAAW;AAAA,MACf,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,MAAA;AAAA,MACA,SAAA,EAAW,GAAA;AAAA,MACX,cAAA,EAAgB,GAAA;AAAA,MAChB,WAAA,EAAa;AAAA,KACf;AAEA,IAAA,MAAM,KAAA,CAAM,KAAK,KAAA,CAAM,EAAA,EAAI,OAAO,EAAE,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,CAAA;AAE9D,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,WAAA,CAAY,MAAA,CAAO,KAAA,CAAM,EAAA,EAAI,MAAA,EAAQ;AAAA,QACzC,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,MAAM,KAAA,CAAM;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAMA,EAAA,eAAe,WAAA,CAAY,QAAA,EAAkB,OAAA,EAA4B,WAAA,EAAkE;AACzI,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACzC,MAAA,IAAI,CAAC,QAAA,IAAY,oBAAA,CAAqB,QAAA,EAAU,WAAW,CAAA,EAAG;AAC5D,QAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,mBAAA,EAAqB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,QAAA,EAAS,EAAG,CAAC,CAAA;AAAA,MAChG;AAEA,MAAA,IAAI,QAAQ,OAAA,KAAY,KAAA,CAAA;AACtB,QAAA,QAAA,CAAS,UAAU,OAAA,CAAQ,OAAA;AAC7B,MAAA,IAAI,QAAQ,IAAA,KAAS,KAAA,CAAA;AACnB,QAAA,QAAA,CAAS,OAAO,OAAA,CAAQ,IAAA;AAC1B,MAAA,IAAI,QAAQ,UAAA,KAAe,KAAA,CAAA;AACzB,QAAA,QAAA,CAAS,aAAa,OAAA,CAAQ,UAAA;AAChC,MAAA,IAAI,QAAQ,QAAA,KAAa,KAAA,CAAA;AACvB,QAAA,QAAA,CAAS,WAAW,OAAA,CAAQ,QAAA;AAG9B,MAAA,IAAI,OAAA,CAAQ,YAAY,KAAA,CAAA,EAAW;AACjC,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,OAAA,CAAQ,OAAO,CAAA;AAClD,QAAA,QAAA,CAAS,MAAA,GAAS,MAAA;AAClB,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,MAAA,EAAQ;AAAA,YACzC,UAAU,QAAA,CAAS,QAAA;AAAA,YACnB,MAAM,QAAA,CAAS;AAAA,WAChB,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,CAAM,KAAK,QAAA,EAAU,QAAA,EAAU,EAAE,QAAA,EAAU,QAAA,CAAS,UAAU,CAAA;AACpE,MAAAJ,SAAO,KAAA,CAAM,gBAAA,EAAkB,EAAE,EAAA,EAAI,UAAU,CAAA;AAC/C,MAAA,OAAOG,GAAG,QAAQ,CAAA;AAAA,IACpB,SACO,KAAA,EAAO;AACZ,MAAAH,SAAO,KAAA,CAAM,sBAAA,EAAwB,EAAE,EAAA,EAAI,QAAA,EAAU,OAAO,CAAA;AAC5D,MAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,wBAAwB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,IACrH;AAAA,EACF;AAYA,EAAA,eAAe,aAAA,CACb,KAAA,EACA,OAAA,EACA,iBAAA,GAAoB,IAAA,EACe;AACnC,IAAA,MAAM,IAAA,GAAO,OAAA,EAAS,IAAA,IAAQ,MAAA,CAAO,WAAA;AACrC,IAAA,MAAM,aAAA,GAAgB,OAAA,EAAS,aAAA,IAAkB,CAAA,GAAI,MAAA,CAAO,YAAA;AAC5D,IAAA,MAAM,sBAAsB,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,EAAS,mBAAA,IAAuB,OAAO,mBAAmB,CAAA;AAElG,IAAAJ,QAAAA,CAAO,KAAA,CAAM,oBAAA,EAAsB,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,IAAA,EAAM,iBAAA,EAAmB,CAAA;AAE1F,IAAA,IAAI;AACF,MAAA,MAAM,QAAkC,EAAC;AAEzC,MAAA,MAAM,QAAQ,OAAA,EAAS,KAAA;AACvB,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC/B,QAAA,KAAA,CAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAAA,MACtB,CAAA,MAAA,IACS,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAClC,QAAA,KAAA,CAAM,IAAA,GAAO,EAAE,GAAA,EAAK,KAAA,EAAM;AAAA,MAC5B;AAEA,MAAA,IAAI,OAAA,EAAS,aAAA,IAAiB,OAAA,CAAQ,aAAA,GAAgB,CAAA,EAAG;AACvD,QAAA,KAAA,CAAM,UAAA,GAAa,EAAE,IAAA,EAAM,OAAA,CAAQ,aAAA,EAAc;AAAA,MACnD;AAEA,MAAA,MAAM,aAAA,GAAgB,MAAM,KAAA,CAAM,KAAA,CAAM;AAAA,QACtC,UAAU,OAAA,EAAS,QAAA;AAAA,QACnB,OAAO,OAAA,EAAS,KAAA;AAAA,QAChB,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,IAAI,KAAA,GAAQ,KAAA;AAAA,OAChD,CAAA;AAGD,MAAA,MAAM,UAAA,GAAa,OAAA,EAAS,KAAA,GACxB,aAAA,CAAc,MAAA,CAAO,CAAA,CAAA,KAAK6B,WAAAA,CAAW,CAAA,EAAG,OAAA,CAAQ,KAAM,CAAC,CAAA,GACvD,aAAA;AAEJ,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,OAAO1B,EAAAA,CAAG,EAAE,CAAA;AAAA,MACd;AAEA,MAAA,IAAI,WAAA;AACJ,MAAA,IAAI,MAAA,CAAO,oBAAoB,SAAA,EAAW;AACxC,QAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,SAAA,CAAU,KAAK,CAAA;AACnD,QAAA,IAAI,YAAY,OAAA,EAAS;AACvB,UAAA,WAAA,GAAc,WAAA,CAAY,IAAA;AAAA,QAC5B;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,uBAAmB,GAAA,EAAoB;AAC7C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,aAAA,GAAgB,MAAM,WAAA,CAAY,MAAA,CAAO,WAAA,EAAa;AAAA,UAC1D,MAAM,IAAA,GAAO,mBAAA;AAAA,UACb,QAAQ,OAAA,EAAS,QAAA,GAAW,EAAE,QAAA,EAAU,OAAA,CAAQ,UAAS,GAAI,KAAA;AAAA,SAC9D,CAAA;AACD,QAAA,KAAA,MAAW,KAAK,aAAA,EAAe;AAC7B,UAAA,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,KAAK,CAAA;AAAA,QAChC;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,KAAU;AACvC,QAAA,IAAI,UAAA,GAAa,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,IAAK,CAAA;AAC/C,QAAA,IAAI,CAAC,UAAA,IAAc,WAAA,IAAe,KAAA,CAAM,MAAA,EAAQ;AAC9C,UAAA,UAAA,GAAa,gBAAA,CAAiB,WAAA,EAAa,KAAA,CAAM,MAAM,CAAA;AAAA,QACzD,CAAA,MAAA,IACS,CAAC,UAAA,EAAY;AACpB,UAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY;AAC/C,UAAA,UAAA,GAAa,YAAA,CAAa,QAAA,CAAS,UAAU,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,QACzD;AAEA,QAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,SAAA;AACxB,QAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,MAAM,mBAAmB,CAAA;AACzD,QAAA,MAAM,SAAA,GAAY,UAAA,GAAa,GAAA,GAAM,KAAA,CAAM,UAAA,GAAa,GAAA;AACxD,QAAA,MAAM,KAAA,GAAQ,SAAA,IAAa,CAAA,GAAI,aAAA,CAAA,GAAiB,OAAA,GAAU,aAAA;AAE1D,QAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AAAA,MACxB,CAAC,CAAA;AAED,MAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AACvC,MAAA,MAAM,UAAyB,EAAC;AAChC,MAAA,KAAA,MAAW,EAAE,KAAA,EAAM,IAAK,OAAO,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,EAAG;AAC7C,QAAA,IAAI,iBAAA,EAAmB;AACrB,UAAA,KAAA,CAAM,cAAA,GAAiB,GAAA;AACvB,UAAA,KAAA,CAAM,WAAA,EAAA;AACN,UAAA,MAAM,KAAA,CAAM,KAAK,KAAA,CAAM,EAAA,EAAI,OAAO,EAAE,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,CAAA;AAC9D,UAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,UAAA;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,GAAG,KAAA,EAAO,CAAA;AAAA,MAC3B;AAEA,MAAAH,QAAAA,CAAO,KAAA,CAAM,yBAAA,EAA2B,EAAE,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG,WAAA,EAAa,OAAA,CAAQ,MAAA,EAAQ,mBAAmB,CAAA;AACrH,MAAA,OAAOG,GAAG,OAAO,CAAA;AAAA,IACnB,SACO,KAAA,EAAO;AACZ,MAAAH,QAAAA,CAAO,KAAA,CAAM,sBAAA,EAAwB,EAAE,OAAO,CAAA;AAC9C,MAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,yBAAyB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,IACvH;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAmC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWvC,MAAM,OAAA,CAAQ,QAAA,EAAyB,OAAA,EAAmE;AACxG,MAAA,OAAO,qBAAA,CAAsB;AAAA,QAC3B,GAAA;AAAA,QACA,QAAQ,CAAC,KAAA,EAAO,kBAAkB,aAAA,CAAc,KAAA,EAAO,eAAe,KAAK,CAAA;AAAA,QAC3E,GAAA,EAAK,CAAA,KAAA,KAAS,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AAAA,QAClC,QAAQ,CAAC,QAAA,EAAU,OAAA,KAAY,WAAA,CAAY,UAAU,OAAO,CAAA;AAAA,QAC5D,MAAA,EAAQ,CAAA,QAAA,KAAY,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AAAA,QAC9C,aAAa,MAAA,CAAO,oBAAA;AAAA,QACpB,cAAc,MAAA,CAAO;AAAA,OACvB,EAAG,UAAU,OAAO,CAAA;AAAA,IACtB,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,MAAA,CAAO,KAAA,EAAe,OAAA,EAAkE;AAC5F,MAAA,OAAO,aAAA,CAAc,KAAA,EAAO,OAAA,EAAS,IAAI,CAAA;AAAA,IAC3C,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,cAAA,CAAe,QAAA,EAAyB,OAAA,EAAqE;AACjH,MAAA,OAAO,sBAAA,CAAuB,QAAA,EAAU,OAAA,EAAS,aAAa,CAAA;AAAA,IAChE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,MAAM,IAAI,KAAA,EAA0D;AAClE,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,KAAA,CAAM,OAAO,CAAA;AAChD,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AAC5C,QAAAJ,QAAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,EAAA,EAAI,OAAO,EAAA,EAAI,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AACjE,QAAA,OAAOG,GAAG,MAAM,CAAA;AAAA,MAClB,SACO,KAAA,EAAO;AACZ,QAAAH,QAAAA,CAAO,KAAA,CAAM,mBAAA,EAAqB,EAAE,OAAO,CAAA;AAC3C,QAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,wBAAwB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACrH;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,MAAA,CAAO,QAAA,EAAkB,OAAA,EAA4B,WAAA,EAAkE;AAC3H,MAAA,OAAO,WAAA,CAAY,QAAA,EAAU,OAAA,EAAS,WAAW,CAAA;AAAA,IACnD,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,MAAM,GAAA,CAAI,QAAA,EAAkB,WAAA,EAAkE;AAC5F,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACtC,MAAA,IAAI,CAAC,KAAA,IAAS,oBAAA,CAAqB,KAAA,EAAO,WAAW,CAAA,EAAG;AACtD,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,mBAAA,EAAqB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,QAAA,EAAS,EAAG,CAAC,CAAA;AAAA,MAChG;AACA,MAAA,KAAA,CAAM,cAAA,GAAiB,KAAK,GAAA,EAAI;AAChC,MAAA,KAAA,CAAM,WAAA,EAAA;AACN,MAAA,MAAM,KAAA,CAAM,KAAK,QAAA,EAAU,KAAA,EAAO,EAAE,QAAA,EAAU,KAAA,CAAM,UAAU,CAAA;AAC9D,MAAA,OAAOD,GAAG,KAAK,CAAA;AAAA,IACjB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,MAAM,MAAA,CAAO,QAAA,EAAkB,WAAA,EAA2D;AACxF,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACzC,QAAA,IAAI,CAAC,QAAA,IAAY,oBAAA,CAAqB,QAAA,EAAU,WAAW,CAAA,EAAG;AAC5D,UAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,mBAAA,EAAqB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,QAAA,EAAS,EAAG,CAAC,CAAA;AAAA,QAChG;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAC3C,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,mBAAA,EAAqB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,QAAA,EAAS,EAAG,CAAC,CAAA;AAAA,MAChG;AACA,MAAA,MAAM,WAAA,CAAY,OAAO,QAAQ,CAAA;AACjC,MAAAJ,SAAO,KAAA,CAAM,gBAAA,EAAkB,EAAE,EAAA,EAAI,UAAU,CAAA;AAC/C,MAAA,OAAOG,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,MAAM,KAAK,OAAA,EAAgE;AACzE,MAAA,MAAM,QAAkC,EAAC;AACzC,MAAA,IAAI,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,MAAA,KAAW,CAAA;AAC7C,QAAA,KAAA,CAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAAA,WAAA,IACrB,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,MAAA,GAAS,CAAA;AAChD,QAAA,KAAA,CAAM,IAAA,GAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,KAAA,EAAM;AAEpC,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,KAAA,CAAM;AAAA,QAChC,UAAU,OAAA,EAAS,QAAA;AAAA,QACnB,OAAO,OAAA,EAAS,KAAA;AAAA,QAChB,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,IAAI,KAAA,GAAQ,MAAA;AAAA,QAC/C,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAa,WAAW,MAAA,EAAO;AAAA;AAAA,QAEjD,KAAA,EAAO,OAAA,EAAS,KAAA,GAAQ,MAAA,GAAY,OAAA,EAAS;AAAA,OAC9C,CAAA;AAED,MAAA,IAAI,CAAC,OAAA,EAAS,KAAA;AACZ,QAAA,OAAOA,GAAG,OAAO,CAAA;AAEnB,MAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAK0B,YAAW,CAAA,EAAG,OAAA,CAAQ,KAAM,CAAC,CAAA;AAClE,MAAA,OAAO1B,EAAAA,CAAG,QAAQ,KAAA,GAAQ,QAAA,CAAS,MAAM,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA,GAAI,QAAQ,CAAA;AAAA,IACvE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,MAAM,SAAS,OAAA,EAA6E;AAC1F,MAAA,MAAM,QAAkC,EAAC;AACzC,MAAA,IAAI,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,MAAA,KAAW,CAAA;AAC7C,QAAA,KAAA,CAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAAA,WAAA,IACrB,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,MAAA,GAAS,CAAA;AAChD,QAAA,KAAA,CAAM,IAAA,GAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,KAAA,EAAM;AAEpC,MAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,CAAA;AAClC,MAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,EAAA;AAEhC,MAAA,IAAI,CAAC,SAAS,KAAA,EAAO;AACnB,QAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,SAAA;AAAA,UACvB;AAAA,YACE,UAAU,OAAA,EAAS,QAAA;AAAA,YACnB,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,IAAI,KAAA,GAAQ,MAAA;AAAA,YAC/C,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAa,WAAW,MAAA;AAAO,WACnD;AAAA,UACA,EAAE,QAAQ,KAAA;AAAM,SAClB;AACA,QAAA,OAAOA,GAAG,IAAI,CAAA;AAAA,MAChB;AAEA,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,KAAA,CAAM;AAAA,QAC5B,UAAU,OAAA,EAAS,QAAA;AAAA,QACnB,OAAO,OAAA,EAAS,KAAA;AAAA,QAChB,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,IAAI,KAAA,GAAQ,MAAA;AAAA,QAC/C,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAa,WAAW,MAAA;AAAO,OAClD,CAAA;AACD,MAAA,MAAM,QAAA,GAAW,IAAI,MAAA,CAAO,CAAA,CAAA,KAAK0B,YAAW,CAAA,EAAG,OAAA,CAAQ,KAAM,CAAC,CAAA;AAC9D,MAAA,OAAO1B,EAAAA,CAAG,EAAE,KAAA,EAAO,QAAA,CAAS,KAAA,CAAM,MAAA,EAAQ,MAAA,GAAS,KAAK,CAAA,EAAG,KAAA,EAAO,QAAA,CAAS,MAAA,EAAQ,CAAA;AAAA,IACrF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWA,MAAM,MAAM,OAAA,EAAwD;AAClE,MAAA,IAAI,CAAC,SAAS,KAAA,IAAS,CAAC,SAAS,QAAA,IAAY,CAAC,SAAS,KAAA,EAAO;AAC5D,QAAA,MAAM,MAAM,KAAA,EAAM;AAClB,QAAA,MAAM,YAAY,KAAA,EAAM;AACxB,QAAAH,QAAAA,CAAO,MAAM,sBAAsB,CAAA;AACnC,QAAA,OAAOG,GAAG,MAAS,CAAA;AAAA,MACrB;AAEA,MAAA,MAAM,QAAkC,EAAC;AACzC,MAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,MAAA,KAAW,CAAA;AAC5C,QAAA,KAAA,CAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAAA,WAAA,IACrB,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,MAAA,GAAS,CAAA;AAC/C,QAAA,KAAA,CAAM,IAAA,GAAO,EAAE,GAAA,EAAK,OAAA,CAAQ,KAAA,EAAM;AAEpC,MAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,KAAA,CAAM;AAAA,QACnC,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,IAAI,KAAA,GAAQ;AAAA,OAChD,CAAA;AACD,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,GACrB,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK0B,WAAAA,CAAW,CAAA,EAAG,OAAA,CAAQ,KAAM,CAAC,CAAA,GACpD,UAAA;AAEJ,MAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,QAAA,MAAM,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AAC3B,QAAA,MAAM,WAAA,CAAY,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AAAA,MACnC;AACA,MAAA7B,SAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,OAAA,EAAS,QAAA,CAAS,QAAQ,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,QAAQ,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC/I,MAAA,OAAOG,GAAG,MAAS,CAAA;AAAA,IACrB;AAAA,GACF;AAEA,EAAA,OAAO,UAAA;AACT;AC3jBA,IAAMH,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,CAAA;AAGnE,IAAM+B,kBAAAA,GAAoB,QAAA;AAG1B,SAAS,UAAA,CAAW,UAAkB,EAAA,EAAoB;AACxD,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,CAAC,QAAA,EAAU,EAAE,CAAC,CAAA;AACtC;AAOA,SAAS,oBAAoB,OAAA,EAAiC;AAC5D,EAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,KAAW,CAAA;AAC5B,IAAA,OAAO,OAAA,CAAQ,YAAA;AACjB,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC9D,EAAA,OAAO,CAAA,EAAG,QAAQ,YAAY;;AAAA;AAAA,EAAc,UAAU,CAAA,CAAA;AACxD;AAQO,SAAS,wBAAwB,KAAA,EAAsD;AAC5F,EAAA,OAAO;AAAA,IACL,MAAM,KAAK,KAAA,EAAgE;AACzE,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,QAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAYA,kBAAAA;AACnC,QAAA,MAAM,GAAA,GAAM,UAAA,CAAW,QAAA,EAAU,KAAA,CAAM,EAAE,CAAA;AACzC,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACpC,QAAA,MAAM,OAAA,GAA0B;AAAA,UAC9B,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,QAAA;AAAA,UACA,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,EAAC;AAAA,UACzB,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,SAAA,EAAW,UAAU,SAAA,IAAa,GAAA;AAAA,UAClC,SAAA,EAAW;AAAA,SACb;AACA,QAAA,MAAM,MAAM,IAAA,CAAK,GAAA,EAAK,OAAA,EAAS,EAAE,UAAU,CAAA;AAC3C,QAAA9B,QAAAA,CAAO,MAAM,eAAA,EAAiB,EAAE,IAAI,OAAA,CAAQ,EAAA,EAAI,UAAU,CAAA;AAC1D,QAAA,OAAOG,GAAG,OAAO,CAAA;AAAA,MACnB,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,wBAAwB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACrH;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,GAAA,CAAI,EAAA,EAAY,OAAA,EAAmE;AACvF,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY0B,kBAAAA;AACtC,MAAA,MAAM,UAAU,MAAM,KAAA,CAAM,IAAI,UAAA,CAAW,QAAA,EAAU,EAAE,CAAC,CAAA;AACxD,MAAA,IAAI,CAAC,OAAA;AACH,QAAA,OAAO1B,GAAAA,CAAI,UAAA,CAAW,iBAAA,EAAmB,GAAA,CAAI,oBAAA,EAAsB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAG,EAAG,CAAC,CAAA;AACxF,MAAA,OAAOD,GAAG,OAAO,CAAA;AAAA,IACnB,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,OAAA,EAA+B,OAAA,EAAmE;AACzH,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY2B,kBAAAA;AACtC,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,QAAA,EAAU,EAAE,CAAA;AACnC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACpC,MAAA,IAAI,CAAC,QAAA;AACH,QAAA,OAAO1B,GAAAA,CAAI,UAAA,CAAW,iBAAA,EAAmB,GAAA,CAAI,oBAAA,EAAsB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAG,EAAG,CAAC,CAAA;AACxF,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAA0B;AAAA,UAC9B,GAAG,QAAA;AAAA,UACH,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,QAAA,CAAS,IAAA;AAAA,UAC/B,YAAA,EAAc,OAAA,CAAQ,YAAA,IAAgB,QAAA,CAAS,YAAA;AAAA,UAC/C,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,QAAA,CAAS,MAAA;AAAA,UACnC,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,QAAA,CAAS,QAAA;AAAA,UACvC,SAAA,EAAW,KAAK,GAAA;AAAI,SACtB;AACA,QAAA,MAAM,MAAM,IAAA,CAAK,GAAA,EAAK,OAAA,EAAS,EAAE,UAAU,CAAA;AAC3C,QAAA,OAAOD,GAAG,OAAO,CAAA;AAAA,MACnB,SACO,KAAA,EAAO;AACZ,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,GAAA,CAAI,wBAAwB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACrH;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,EAAA,EAAY,OAAA,EAAyD;AAChF,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY0B,kBAAAA;AACtC,MAAA,MAAM,KAAA,CAAM,MAAA,CAAO,UAAA,CAAW,QAAA,EAAU,EAAE,CAAC,CAAA;AAC3C,MAAA,OAAO3B,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,MAAM,KAAK,OAAA,EAAqE;AAC9E,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY2B,kBAAAA;AACtC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,QAAA,EAAU,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAa,SAAA,EAAW,KAAA,IAAS,CAAA;AAClG,MAAA,OAAO3B,GAAG,QAAQ,CAAA;AAAA,IACpB,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,EAAA,EAAY,OAAA,EAA2D;AACnF,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY2B,kBAAAA;AACtC,MAAA,MAAM,UAAU,MAAM,KAAA,CAAM,IAAI,UAAA,CAAW,QAAA,EAAU,EAAE,CAAC,CAAA;AACxD,MAAA,IAAI,CAAC,OAAA;AACH,QAAA,OAAO1B,GAAAA,CAAI,UAAA,CAAW,iBAAA,EAAmB,GAAA,CAAI,oBAAA,EAAsB,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAG,EAAG,CAAC,CAAA;AACxF,MAAA,OAAOD,EAAAA,CAAG,mBAAA,CAAoB,OAAO,CAAC,CAAA;AAAA,IACxC;AAAA,GACF;AACF;ACpGA,IAAMH,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,CAAA;AAI/D,IAAM,yBAAA,GAA4B,CAAA;AAAA;AAAA,wFAAA,CAAA;AAOlC,SAAS,qBAAqB,KAAA,EAAiC;AAC7D,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA;AACnB,IAAA,OAAO,4BAAA;AAET,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM;AAChB,IAAA,MAAM,cAAc,IAAA,CAAK,QAAA,EAAU,SAAS,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AACvE,IAAA,MAAM,OAAA,GAAU,KAAK,QAAA,EAAU,GAAA,GAAM,KAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,CAAA,CAAA,GAAM,EAAA;AACjE,IAAA,OAAO,IAAI,CAAA,GAAI,CAAC,CAAA,UAAA,EAAa,WAAW,GAAG,OAAO;AAAA,EAAK,KAAK,OAAO,CAAA,CAAA;AAAA,EACrE,CAAC,CAAA,CACA,IAAA,CAAK,MAAM,CAAA;AAChB;AASO,SAAS,mBAAA,CAAoB,KAAoB,SAAA,EAA+C;AACrG,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaL,MAAM,KAAA,CAAM,KAAA,EAAe,OAAA,EAAqD;AAC9E,MAAAC,QAAAA,CAAO,KAAA,CAAM,oBAAA,EAAsB,EAAE,KAAA,EAAO,MAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AAEjE,MAAA,IAAI;AAEF,QAAA,MAAM,cAAA,GAAiB,MAAM,SAAA,CAAU,QAAA,CAAS;AAAA,UAC9C,KAAA;AAAA,UACA,SAAS,OAAA,EAAS,OAAA;AAAA,UAClB,IAAA,EAAM,SAAS,IAAA,IAAQ,CAAA;AAAA,UACvB,UAAU,OAAA,EAAS,QAAA;AAAA,UACnB,cAAc,OAAA,EAAS,YAAA;AAAA,UACvB,aAAa,OAAA,EAAS;AAAA,SACvB,CAAA;AAED,QAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC3B,UAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,wBAAA,EAA0B,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,4BAAA,EAA6B,EAAG,CAAA,EAAG,eAAe,KAAK,CAAA;AAAA,QACpJ;AAGA,QAAA,MAAM,YAAA,GAAiC,cAAA,CAAe,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAA,MAAS;AAAA,UAC5E,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,UAAU,IAAA,CAAK;AAAA,SACjB,CAAE,CAAA;AAGF,QAAA,MAAM,QAAA,GAAW,SAAS,aAAA,IAAiB,oBAAA;AAC3C,QAAA,MAAM,WAAA,GAAc,SAAS,YAAY,CAAA;AAGzC,QAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,yBAAA;AAC9C,QAAA,MAAM,aAAA,GAAgB,GAAG,YAAY;;AAAA;AAAA,EAAwB,WAAW;AAAA,mBAAA,CAAA;AAExE,QAAA,MAAM,QAAA,GAA0B;AAAA,UAC9B,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,aAAA;AAAc,SAC3C;AAGA,QAAA,IAAI,SAAS,QAAA,EAAU;AACrB,UAAA,QAAA,CAAS,IAAA,CAAK,GAAG,OAAA,CAAQ,QAAQ,CAAA;AAAA,QACnC;AAGA,QAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAG9C,QAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,IAAA,CAAK;AAAA,UAChC,OAAO,OAAA,EAAS,KAAA;AAAA,UAChB,QAAA;AAAA,UACA,aAAa,OAAA,EAAS,WAAA;AAAA,UACtB,UAAU,OAAA,EAAS,QAAA;AAAA,UACnB,WAAW,OAAA,EAAS,SAAA;AAAA,UACpB,eAAe,OAAA,EAAS,aAAA;AAAA,UACxB,QAAQ,OAAA,EAAS;AAAA,SAClB,CAAA;AAED,QAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,UAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,UAAA,EAAY,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,uBAAA,EAAwB,EAAG,CAAA,EAAG,WAAW,KAAK,CAAA;AAAA,QAC7H;AAEA,QAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AACxC,QAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,OAAA,EAAS,OAAA,IAAW,EAAA;AAE3C,QAAAJ,QAAAA,CAAO,MAAM,qBAAA,EAAuB;AAAA,UAClC,cAAc,YAAA,CAAa,MAAA;AAAA,UAC3B,KAAA,EAAO,WAAW,IAAA,CAAK;AAAA,SACxB,CAAA;AAGD,QAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAC9C,QAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,UAAA,IAAI,IAAI,QAAA,EAAU;AAChB,YAAA,MAAM,MAAM,GAAA,CAAI,QAAA,CAAS,cAAc,GAAA,CAAI,QAAA,CAAS,WAAW,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,CAAA,EAAI,GAAA,CAAI,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAC9H,YAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,cAAA,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,GAAA,CAAI,QAAQ,CAAA;AAAA,YACnC;AAAA,UACF;AAAA,QACF;AACA,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAEjD,QAAA,OAAOG,EAAAA,CAAG;AAAA,UACR,MAAA;AAAA,UACA,OAAA,EAAS,YAAA;AAAA,UACT,SAAA;AAAA,UACA,KAAA;AAAA,UACA,KAAA,EAAO,WAAW,IAAA,CAAK,KAAA;AAAA,UACvB,KAAA,EAAO,UAAA,CAAW,IAAA,CAAK,KAAA,GACnB;AAAA,YACE,aAAA,EAAe,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,aAAA;AAAA,YACrC,iBAAA,EAAmB,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,iBAAA;AAAA,YACzC,YAAA,EAAc,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM;AAAA,WACtC,GACA,KAAA;AAAA,SACL,CAAA;AAAA,MACH,SACO,KAAA,EAAO;AACZ,QAAAH,QAAAA,CAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,OAAO,CAAA;AAC1C,QAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,UAAA,EAAY,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MACxG;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,WAAA,CAAY,KAAA,EAAe,OAAA,EAAqD;AACrF,MAAAJ,QAAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,KAAA,EAAO,MAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AAGlE,MAAA,MAAM,cAAA,GAAiB,MAAM,SAAA,CAAU,QAAA,CAAS;AAAA,QAC9C,KAAA;AAAA,QACA,SAAS,OAAA,EAAS,OAAA;AAAA,QAClB,IAAA,EAAM,SAAS,IAAA,IAAQ,CAAA;AAAA,QACvB,UAAU,OAAA,EAAS,QAAA;AAAA,QACnB,cAAc,OAAA,EAAS,YAAA;AAAA,QACvB,aAAa,OAAA,EAAS;AAAA,OACvB,CAAA;AAED,MAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC3B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,OAAO,cAAA,CAAe,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MAC7E;AAEA,MAAA,MAAM,YAAA,GAAiC,cAAA,CAAe,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,IAAA,MAAS;AAAA,QAC5E,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,UAAU,IAAA,CAAK;AAAA,OACjB,CAAE,CAAA;AAGF,MAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAC9C,MAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,QAAA,IAAI,IAAI,QAAA,EAAU;AAChB,UAAA,MAAM,MAAM,GAAA,CAAI,QAAA,CAAS,cAAc,GAAA,CAAI,QAAA,CAAS,WAAW,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,CAAA,EAAI,GAAA,CAAI,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAC9H,UAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,YAAA,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,GAAA,CAAI,QAAQ,CAAA;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAGjD,MAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,cAAc,SAAA,EAAU;AAGxD,MAAA,MAAM,QAAA,GAAW,SAAS,aAAA,IAAiB,oBAAA;AAC3C,MAAA,MAAM,WAAA,GAAc,SAAS,YAAY,CAAA;AACzC,MAAA,MAAM,YAAA,GAAe,SAAS,YAAA,IAAgB,yBAAA;AAC9C,MAAA,MAAM,aAAA,GAAgB,GAAG,YAAY;;AAAA;AAAA,EAAwB,WAAW;AAAA,mBAAA,CAAA;AAExE,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC9B,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,aAAA;AAAc,OAC3C;AACA,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,QAAA,CAAS,IAAA,CAAK,GAAG,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACnC;AACA,MAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAE9C,MAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW;AAAA,QAC5B,OAAO,OAAA,EAAS,KAAA;AAAA,QAChB,QAAA;AAAA,QACA,aAAa,OAAA,EAAS,WAAA;AAAA,QACtB,UAAU,OAAA,EAAS,QAAA;AAAA,QACnB,WAAW,OAAA,EAAS,SAAA;AAAA,QACpB,eAAe,OAAA,EAAS,aAAA;AAAA,QACxB,QAAQ,OAAA,EAAS;AAAA,OAClB,CAAA;AAED,MAAA,IAAI,UAAA,GAAa,EAAA;AACjB,MAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,MAAA,IAAI,KAAA;AAEJ,MAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,QAAA,IAAI,CAAC,SAAS,KAAA,CAAM,KAAA;AAClB,UAAA,KAAA,GAAQ,KAAA,CAAM,KAAA;AAChB,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,CAAC,GAAG,KAAA,EAAO,OAAA;AACzC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,UAAA,IAAc,KAAA;AACd,UAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,KAAA,EAAM;AAAA,QACrC;AACA,QAAA,IAAI,MAAM,KAAA,EAAO;AACf,UAAA,KAAA,GAAQ;AAAA,YACN,aAAA,EAAe,MAAM,KAAA,CAAM,aAAA;AAAA,YAC3B,iBAAA,EAAmB,MAAM,KAAA,CAAM,iBAAA;AAAA,YAC/B,YAAA,EAAc,MAAM,KAAA,CAAM;AAAA,WAC5B;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,UAAA,EAAY,OAAO,KAAA,EAAM;AAAA,IACzD;AAAA,GACF;AACF;AC9OA,IAAMA,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,WAAA,EAAa,CAAA;AAIrE,IAAM,mBAAA,GAAsB,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,wCAAA,CAAA;AAS5B,IAAM,iBAAA,GAAoB,CAAA;AAAA;AAAA;AAAA,8DAAA,CAAA;AAK1B,IAAM,0BAAA,GAA6B,CAAA;AAAA;AAAA;AAAA;;AAAA,oCAAA,CAAA;AAc5B,SAAS,yBAAA,CAA0B,QAAkB,GAAA,EAAyC;AAInG,EAAA,SAAS,aAAA,CAAc,UAAyB,QAAA,EAAuC;AACrF,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,MAAA,CAAO,GAAA,EAAK,UAAU,QAAQ,CAAA;AAC/D,IAAA,OAAO,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,KAAA,GAAQ,QAAA;AAAA,EAC9C;AAIA,EAAA,eAAe,QAAA,CACb,OACA,OAAA,EACqC;AACrC,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,EAAA;AACvC,IAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,mBAAA;AAC7C,IAAA,MAAM,QAAyB,EAAC;AAChC,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,MAAM,QAAA,GAA0B;AAAA,MAC9B,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,YAAA,EAAa;AAAA,MACxC,GAAI,OAAA,CAAQ,QAAA,IAAY,EAAC;AAAA,MACzB,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAA;AAAM,KACjC;AAEA,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,SAAA,EAAW,KAAA,EAAA,EAAS;AAE9C,MAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,IAAA,CAAK;AAAA,QAChC,KAAA,EAAO,aAAA,CAAc,WAAA,EAAa,OAAA,CAAQ,KAAK,CAAA;AAAA,QAC/C,QAAA;AAAA,QACA,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,cAAA,EAAe;AAAA,QACrC,WAAA,EAAa,OAAA,CAAQ,KAAA,GAAQ,MAAA,GAAS,MAAA;AAAA,QACtC,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AAED,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA;AACd,QAAA,OAAO,UAAA;AAET,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AACxC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAOK,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,kBAAA,EAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,sBAAA,EAAuB,EAAG,CAAC,CAAA;AAAA,MAChH;AAEA,MAAA,MAAM,mBAAmB,MAAA,CAAO,OAAA;AAGhC,MAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAM,SAAA;AAAA,UACN,SAAS,OAAO,gBAAA,CAAiB,OAAA,KAAY,QAAA,GAAW,iBAAiB,OAAA,GAAU,EAAA;AAAA,UACnF,KAAA,EAAO,SAAA;AAAA,SACR,CAAA;AAAA,MACH;AAGA,MAAA,QAAA,CAAS,KAAK,gBAAgB,CAAA;AAG9B,MAAA,IAAI,iBAAiB,UAAA,IAAc,gBAAA,CAAiB,WAAW,MAAA,GAAS,CAAA,IAAK,QAAQ,KAAA,EAAO;AAC1F,QAAA,KAAA,MAAW,QAAA,IAAY,iBAAiB,UAAA,EAAY;AAClD,UAAA,IAAI,SAAS,IAAA,KAAS,UAAA;AACpB,YAAA;AAEF,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EAAS,CAAA,cAAA,EAAiB,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,CAAA;AAAA,YAChD,QAAA,EAAU;AAAA,cACR,IAAA,EAAM,SAAS,QAAA,CAAS,IAAA;AAAA,cACxB,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,SAAS,SAAS;AAAA,aACnD;AAAA,YACA,KAAA,EAAO,SAAA;AAAA,WACR,CAAA;AAGD,UAAA,MAAM,aAAa,MAAM,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,UAAU,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,UAAU,OAAA,CAAQ,QAAA,EAAU,SAAA,EAAW,OAAA,CAAQ,WAAW,CAAA;AAC7I,UAAA,MAAM,cAAA,GAAiB,WAAW,OAAA,GAC9B,UAAA,CAAW,KAAK,OAAA,GAChB,CAAA,YAAA,EAAe,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA,CAAA;AAC3C,UAAA,MAAM,WAAA,GAAc,OAAO,cAAA,KAAmB,QAAA,GAC1C,cAAA,GACC,cAAA,CAA4C,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAGhF,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,IAAA,EAAM,aAAA;AAAA,YACN,OAAA,EAAS,WAAA;AAAA,YACT,KAAA,EAAO,SAAA;AAAA,WACR,CAAA;AAGD,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,MAAA;AAAA,YACN,cAAc,QAAA,CAAS,EAAA;AAAA,YACvB,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,kBAAkB,MAAA,EAAQ;AACnC,QAAA,MAAM,SAAS,OAAO,gBAAA,CAAiB,OAAA,KAAY,QAAA,GAAW,iBAAiB,OAAA,GAAU,EAAA;AACzF,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,MAAA,EAAQ,KAAA,EAAO,WAAW,CAAA;AAEhE,QAAA,OAAOD,EAAAA,CAAG;AAAA,UACR,MAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAA,EAAU,OAAA;AAAA,UACV,QAAQ,KAAA,GAAQ,CAAA;AAAA,UAChB;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,YAAA,EAAe,SAAS,CAAA,SAAA,CAAA,EAAY,EAAG,CAAC,CAAA;AAAA,EACjI;AAKA,EAAA,eAAe,MAAA,CACb,OACA,OAAA,EACqC;AACrC,IAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,iBAAA;AAC7C,IAAA,MAAM,QAAyB,EAAC;AAEhC,IAAA,MAAM,QAAA,GAA0B;AAAA,MAC9B,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,YAAA,EAAa;AAAA,MACxC,GAAI,OAAA,CAAQ,QAAA,IAAY,EAAC;AAAA,MACzB,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,GAAG,KAAK;;AAAA,0BAAA,CAAA;AAAiC,KACpE;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,IAAA,CAAK;AAAA,MAChC,KAAA,EAAO,aAAA,CAAc,WAAA,EAAa,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC/C,QAAA;AAAA,MACA,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAED,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA;AACd,MAAA,OAAO,UAAA;AAET,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AACxC,IAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,OAAA,EAAS,OAAA,IAAW,EAAA;AAG3C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AAChE,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,MAAA,IAAI,OAAA,CAAQ,WAAA,EAAY,CAAE,UAAA,CAAW,cAAc,CAAA,IAAK,OAAA,CAAQ,WAAA,EAAY,CAAE,UAAA,CAAW,SAAS,CAAA,EAAG;AACnG,QAAA,QAAA,GAAW,IAAA;AAAA,MACb;AAEA,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,WAAW,QAAA,GAAW,SAAA;AAAA,QAC5B,OAAA,EAAS,OAAA;AAAA,QACT,KAAA,EAAO,SAAA;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,QAAQ,CAAA;AAEpD,IAAA,OAAOD,EAAAA,CAAG;AAAA,MACR,MAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ,CAAA;AAAA,MACR;AAAA,KACD,CAAA;AAAA,EACH;AAKA,EAAA,eAAe,cAAA,CACb,OACA,OAAA,EACqC;AACrC,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,EAAA;AACvC,IAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,0BAAA;AAC7C,IAAA,MAAM,QAAyB,EAAC;AAChC,IAAA,IAAI,SAAA,GAAY,CAAA;AAGhB,IAAA,MAAM,YAAA,GAA8B;AAAA,MAClC,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,YAAA,EAAa;AAAA,MACxC,GAAI,OAAA,CAAQ,QAAA,IAAY,EAAC;AAAA,MACzB,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,CAAA;AAAA,EAAiC,KAAK,CAAA,CAAA;AAAG,KACpE;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,IAAA,CAAK;AAAA,MAChC,OAAO,aAAA,CAAc,MAAA,EAAQ,OAAA,CAAQ,SAAA,IAAa,QAAQ,KAAK,CAAA;AAAA,MAC/D,QAAA,EAAU,YAAA;AAAA,MACV,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,eAAe,OAAA,CAAQ,aAAA;AAAA,MACvB,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAED,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA;AACd,MAAA,OAAO,UAAA;AAET,IAAA,MAAM,OAAO,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAC7D,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,IAAA,EAAM,KAAA,EAAO,aAAa,CAAA;AAG9D,IAAA,MAAM,eAAA,GAAiC;AAAA,MACrC,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,YAAA,EAAa;AAAA,MACxC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAM;AAAA,MAC/B,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,IAAA,EAAK;AAAA,MACnC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,4DAAA;AAA6D,KACxF;AAEA,IAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,SAAA,EAAW,KAAA,EAAA,EAAS;AAC9C,MAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,IAAA,CAAK;AAAA,QAChC,OAAO,aAAA,CAAc,SAAA,EAAW,OAAA,CAAQ,YAAA,IAAgB,QAAQ,KAAK,CAAA;AAAA,QACrE,QAAA,EAAU,eAAA;AAAA,QACV,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,cAAA,EAAe;AAAA,QACrC,WAAA,EAAa,OAAA,CAAQ,KAAA,GAAQ,MAAA,GAAS,MAAA;AAAA,QACtC,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AAED,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA;AACd,QAAA,OAAO,UAAA;AAET,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA;AACxC,MAAA,IAAI,CAAC,MAAA;AACH,QAAA;AAEF,MAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AAEnB,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,GAAA,CAAI,OAAA,GAAU,EAAA,EAAI,KAAA,EAAO,aAAa,CAAA;AAAA,MACjH;AAEA,MAAA,eAAA,CAAgB,KAAK,GAAG,CAAA;AAGxB,MAAA,IAAI,IAAI,UAAA,IAAc,GAAA,CAAI,WAAW,MAAA,GAAS,CAAA,IAAK,QAAQ,KAAA,EAAO;AAChE,QAAA,KAAA,MAAW,QAAA,IAAY,IAAI,UAAA,EAAY;AACrC,UAAA,IAAI,SAAS,IAAA,KAAS,UAAA;AACpB,YAAA;AACF,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,IAAA,EAAM,QAAA;AAAA,YACN,OAAA,EAAS,CAAA,WAAA,EAAc,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,CAAA;AAAA,YAC7C,QAAA,EAAU;AAAA,cACR,IAAA,EAAM,SAAS,QAAA,CAAS,IAAA;AAAA,cACxB,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,SAAS,SAAS;AAAA,aACnD;AAAA,YACA,KAAA,EAAO,SAAA;AAAA,WACR,CAAA;AAED,UAAA,MAAM,aAAa,MAAM,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,UAAU,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,UAAU,OAAA,CAAQ,QAAA,EAAU,SAAA,EAAW,OAAA,CAAQ,WAAW,CAAA;AAC7I,UAAA,MAAM,cAAA,GAAiB,WAAW,OAAA,GAC9B,UAAA,CAAW,KAAK,OAAA,GAChB,CAAA,YAAA,EAAe,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA,CAAA;AAC3C,UAAA,MAAM,WAAA,GAAc,OAAO,cAAA,KAAmB,QAAA,GAC1C,cAAA,GACC,cAAA,CAA4C,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAEhF,UAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,aAAA,EAAe,SAAS,WAAA,EAAa,KAAA,EAAO,aAAa,CAAA;AAC5E,UAAA,eAAA,CAAgB,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,cAAc,QAAA,CAAS,EAAA,EAAI,OAAA,EAAS,WAAA,EAAa,CAAA;AAAA,QACxF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,kBAAkB,MAAA,EAAQ;AACnC,QAAA,MAAM,SAAS,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,IAAI,OAAA,GAAU,EAAA;AAC/D,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,MAAA,EAAQ,KAAA,EAAO,WAAW,CAAA;AAChE,QAAA,OAAOA,EAAAA,CAAG;AAAA,UACR,MAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAA,EAAU,cAAA;AAAA,UACV,QAAQ,KAAA,GAAQ,CAAA;AAAA,UAChB,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,YAAA,EAAe,SAAS,CAAA,SAAA,CAAA,EAAY,EAAG,CAAC,CAAA;AAAA,EACjI;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,KAAA,EAAe,OAAA,EAAiE;AACxF,MAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,OAAA;AACtC,MAAAJ,QAAAA,CAAO,MAAM,oBAAA,EAAsB,EAAE,UAAU,SAAA,EAAW,OAAA,EAAS,WAAW,CAAA;AAE9E,MAAA,IAAI;AACF,QAAA,QAAQ,QAAA;AAAU,UAChB,KAAK,OAAA;AACH,YAAA,OAAO,MAAM,QAAA,CAAS,KAAA,EAAO,OAAA,IAAW,EAAE,CAAA;AAAA,UAC5C,KAAK,KAAA;AACH,YAAA,OAAO,MAAM,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,EAAE,CAAA;AAAA,UAC1C,KAAK,cAAA;AACH,YAAA,OAAO,MAAM,cAAA,CAAe,KAAA,EAAO,OAAA,IAAW,EAAE,CAAA;AAAA,UAClD;AACE,YAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,4BAAA,EAA8B,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAG,EAAG,CAAC,CAAA;AAAA;AACvI,MACF,SACO,KAAA,EAAO;AACZ,QAAAJ,QAAAA,CAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,OAAO,CAAA;AAC1C,QAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC9G;AAAA,IACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,OAAO,SAAA,CAAU,KAAA,EAAe,OAAA,EAAiE;AAC/F,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,OAAO,OAAO,CAAA;AAE5C,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,MAAM,MAAA,CAAO,KAAA;AAAA,MACf;AAEA,MAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,MAAA,CAAO,IAAA;AAGjC,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,UAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AAAA,QAC7B;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO;AAAA,MACtC;AAGA,MAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,OAAO,IAAA,EAAK;AAAA,IAC5C;AAAA,GACF;AACF;ACpYA,IAAMJ,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,CAAA;AA8B3D,SAAS,uBAAuB,MAAA,EAAoC;AAEzE,EAAA,SAAS,mBAAmB,SAAA,EAG1B;AACA,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAO,EAAE,KAAA,EAAO,EAAC,EAAG,GAAA,EAAK,EAAC,EAAE;AAAA,IAC9B;AACA,IAAA,IAAI,OAAO,SAAA,CAAU,CAAC,CAAA,KAAM,QAAA,EAAU;AACpC,MAAA,MAAM,IAAA,GAAO,SAAA;AACb,MAAA,OAAO,EAAE,OAAO,IAAA,EAAM,GAAA,EAAK,KAAK,GAAA,CAAI,MAAM,MAAS,CAAA,EAAE;AAAA,IACvD;AACA,IAAA,MAAM,IAAA,GAAO,SAAA;AACb,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AAAA,MAC3B,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE;AAAA,KACzB;AAAA,EACF;AAKA,EAAA,eAAe,cAAc,OAAA,EAA4D;AACvF,IAAA,MAAM,iBAAiB,iBAAA,CAAkB,MAAA,CAAO,GAAA,EAAK,QAAA,EAAU,QAAQ,KAAA,EAAO;AAAA,MAC5E,oBAAA,EAAsB,IAAI,gBAAA,EAAkB,EAAE,QAAQ,EAAE,KAAA,EAAO,gCAAA,EAAiC,EAAG;AAAA,KACpG,CAAA;AACD,IAAA,IAAI,CAAC,cAAA,CAAe,OAAA;AAClB,MAAA,OAAO,cAAA;AACT,IAAA,MAAM,WAAW,cAAA,CAAe,IAAA;AAEhC,IAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAI,GAAI,kBAAA,CAAmB,QAAQ,SAAS,CAAA;AAC3D,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAOK,GAAAA,CAAI,UAAA,CAAW,sBAAA,EAAwB,GAAA,CAAI,yBAAA,EAA2B,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,2BAAA,EAA4B,EAAG,CAAC,CAAA;AAAA,IACnI;AAEA,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,SAAA,EAAW;AAAA,KACb;AACA,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW;AAC9B,MAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA;AAAA,IACvB;AACA,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AAEA,IAAAJ,QAAAA,CAAO,KAAA,CAAM,oBAAA,EAAsB,EAAE,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,aAAA,EAAe,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,CAAQ,MAAM,CAAA;AAE7G,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,QAAA,CAAS,OAAO,CAAA,UAAA,CAAA,EAAc;AAAA,QAC5D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA;AAAA,SAC5C;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,OAC1B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,MAAM,SAAS,UAAU,CAAA;AACvE,QAAAA,QAAAA,CAAO,MAAM,2BAAA,EAA6B,EAAE,QAAQ,QAAA,CAAS,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,CAAA;AACvF,QAAA,OAAOI,IAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,oBAAA,EAAsB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA,EAAG,EAAG,CAAC,CAAA;AAAA,MACnI;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,MAAA,MAAM,OAAA,GAAwB,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,QACtD,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,EAAA,EAAI,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAAA,QAClB,gBAAgB,IAAA,CAAK,eAAA;AAAA,QACrB,QAAA,EAAU,KAAK,QAAA,EAAU;AAAA,OAC3B,CAAE,CAAA;AAEF,MAAAJ,SAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,WAAA,EAAa,OAAA,CAAQ,QAAQ,CAAA;AAEhE,MAAA,OAAOG,GAAG,EAAE,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,SAAS,CAAA;AAAA,IAC9C,SACO,KAAA,EAAO;AACZ,MAAAH,QAAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,OAAO,CAAA;AAChD,MAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,sBAAsB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,IAChH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASL,MAAM,OAAO,OAAA,EAA4D;AACvE,MAAA,OAAO,cAAc,OAAO,CAAA;AAAA,IAC9B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,MAAM,WAAA,CAAY,KAAA,EAAe,KAAA,EAAiB,IAAA,EAAiD;AACjG,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,EAAE,OAAO,SAAA,EAAW,KAAA,EAAO,MAAM,CAAA;AACpE,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,QAAA,OAAO,MAAA;AACT,MAAA,OAAOD,EAAAA,CAAG,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,IAC/B;AAAA,GACF;AACF;AC7IA,IAAMH,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,WAAA,EAAa,CAAA;AAU9D,SAAS,yBAAA,CACd,YAAA,EACA,aAAA,EACA,WAAA,EACA,SAAA,EACqB;AAErB,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAA8D;AAC3F,EAAA,SAAS,eAAe,UAAA,EAAoB;AAC1C,IAAA,IAAI,KAAA,GAAQ,gBAAA,CAAiB,GAAA,CAAI,UAAU,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ,aAAA,CAAc,kBAAkB,UAAU,CAAA;AAClD,MAAA,gBAAA,CAAiB,GAAA,CAAI,YAAY,KAAK,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUL,MAAM,UAAU,MAAA,EAAmD;AACjE,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,GAAA,CAAI,OAAO,EAAE,CAAA;AAChD,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAOK,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,WAAW,MAAA,CAAO,EAAE,CAAA,gBAAA,CAAA,EAAmB,EAAG,CAAC,CAAA;AAAA,MAChI;AACA,MAAA,MAAM,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AACxC,MAAAJ,QAAAA,CAAO,KAAA,CAAM,wBAAA,EAA0B,EAAE,QAAA,EAAU,OAAO,EAAA,EAAI,UAAA,EAAY,MAAA,CAAO,UAAA,EAAY,CAAA;AAC7F,MAAA,OAAOG,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,MAAM,aAAa,QAAA,EAA4C;AAC7D,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAC/C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,0BAAA,EAA4B,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,QAAA,EAAW,QAAQ,CAAA,WAAA,CAAA,EAAc,EAAG,CAAC,CAAA;AAAA,MACpI;AACA,MAAA,MAAM,WAAA,CAAY,OAAO,QAAQ,CAAA;AACjC,MAAAJ,QAAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,EAAE,UAAU,CAAA;AACrD,MAAA,OAAOG,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,WAAA,GAA0C;AAC9C,MAAA,OAAO,WAAA,CAAY,KAAA,CAAM,EAAE,CAAA;AAAA,IAC7B,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaA,MAAM,SAAS,OAAA,EAAgE;AAC7E,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,MAAA,MAAM,aAAA,GAAgB,MAAM,WAAA,CAAY,KAAA;AAAA,QACtC,OAAA,CAAQ,OAAA,EAAS,MAAA,GACb,EAAE,OAAO,EAAE,EAAA,EAAI,EAAE,GAAA,EAAK,OAAA,CAAQ,OAAA,EAAQ,EAAE,KACxC;AAAC,OACP;AAEA,MAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,QAAA,OAAOC,GAAAA,CAAI,UAAA,CAAW,0BAAA,EAA4B,GAAA,CAAI,kBAAA,EAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,iCAAA,EAAkC,EAAG,CAAC,CAAA;AAAA,MACrI;AAEA,MAAA,IAAI;AAEF,QAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,SAAA,CAAU,QAAQ,KAAK,CAAA;AAC9D,QAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,UAAA,OAAOA,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,uBAAA,EAAwB,EAAG,CAAA,EAAG,YAAY,KAAK,CAAA;AAAA,QACpI;AAEA,QAAA,MAAM,cAAc,WAAA,CAAY,IAAA;AAGhC,QAAA,MAAM,WAAkC,EAAC;AAEzC,QAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,GAAA,CAAI,OAAO,MAAA,KAAW;AACzD,UAAA,MAAM2B,KAAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,MAAA,CAAO,IAAA,IAAQ,CAAA;AAC5C,UAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,MAAA,CAAO,QAAA;AAE5C,UAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,CAAO,UAAU,CAAA;AACpD,UAAA,MAAM,aAAA,GAAgB,MAAM,WAAA,CAAY,MAAA,CAAO,WAAA,EAAa;AAAA,YAC1D,IAAA,EAAAA,KAAAA;AAAA,YACA,QAAA;AAAA,YACA,QAAQ,MAAA,CAAO;AAAA,WAChB,CAAA;AAED,UAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAEhC,YAAA,MAAM,QAAA,GAAqB;AAAA,cACzB,UAAA,EAAY,KAAK,QAAA,EAAU,UAAA;AAAA,cAC3B,KAAA,EAAO,IAAA,CAAK,QAAA,EAAU,KAAA,IAA+B,MAAA,CAAO,IAAA;AAAA,cAC5D,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,GAAA,IAA6B,MAAA,CAAO,GAAA;AAAA,cACxD,QAAA,EAAU,KAAK,QAAA,EAAU,QAAA;AAAA,cACzB,SAAS,IAAA,CAAK,EAAA;AAAA,cACd,YAAY,MAAA,CAAO;AAAA,aACrB;AAEA,YAAA,QAAA,CAAS,IAAA,CAAK;AAAA,cACZ,IAAI,IAAA,CAAK,EAAA;AAAA,cACT,OAAA,EAAS,KAAK,OAAA,IAAW,EAAA;AAAA,cACzB,OAAO,IAAA,CAAK,KAAA;AAAA,cACZ,UAAU,MAAA,CAAO,EAAA;AAAA,cACjB,UAAU,IAAA,CAAK,QAAA;AAAA,cACf;AAAA,aACD,CAAA;AAAA,UACH;AAAA,QACF,CAAC,CAAA;AAED,QAAA,MAAM,OAAA,CAAQ,IAAI,cAAc,CAAA;AAGhC,QAAA,IAAI,OAAA,CAAQ,YAAA,IAAgB,SAAA,IAAa,QAAA,CAAS,SAAS,CAAA,EAAG;AAC5D,UAAA,MAAM,YAAA,GAAe,MAAM,SAAA,CAAU,MAAA,CAAO;AAAA,YAC1C,OAAO,OAAA,CAAQ,KAAA;AAAA,YACf,SAAA,EAAW,QAAA,CAAS,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,OAAO,CAAA;AAAA,YAC5C,OAAO,OAAA,CAAQ,WAAA;AAAA,YACf,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,YACtB,eAAA,EAAiB;AAAA,WAClB,CAAA;AACD,UAAA,IAAI,aAAa,OAAA,EAAS;AACxB,YAAA,MAAM,QAAA,GAAW,YAAA,CAAa,IAAA,CAAK,OAAA,CAChC,IAAI,CAAA,CAAA,MAAM,EAAE,GAAG,QAAA,CAAS,EAAE,KAAK,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,gBAAe,CAAE,CAAA;AAC/D,YAAA,QAAA,CAAS,MAAA,GAAS,CAAA;AAClB,YAAA,QAAA,CAAS,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,UAC3B,CAAA,MACK;AACH,YAAA/B,SAAO,IAAA,CAAK,8CAAA,EAAgD,EAAE,KAAA,EAAO,YAAA,CAAa,OAAO,CAAA;AAAA,UAC3F;AAAA,QACF;AAGA,QAAA,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAGzC,QAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,EAAA;AAC7B,QAAA,MAAM,YAAA,GAAe,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA;AAE3C,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,QAAAA,QAAAA,CAAO,KAAA,CAAM,qBAAA,EAAuB,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,WAAA,EAAa,YAAA,CAAa,MAAA,EAAQ,QAAA,EAAU,CAAA;AAExG,QAAA,OAAOG,EAAAA,CAAG;AAAA,UACR,KAAA,EAAO,YAAA;AAAA,UACP,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf;AAAA,SACD,CAAA;AAAA,MACH,SACO,KAAA,EAAO;AACZ,QAAAH,QAAAA,CAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,OAAO,CAAA;AAC1C,QAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,oBAAoB,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,MAC9G;AAAA,IACF;AAAA,GACF;AACF;ACjMA,IAAMJ,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,CAAA;AAInE,IAAM,uBAAA,GAA0B,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,CAAA;AAahC,IAAM,4BAAA,GAA+B,CAAA;;AAAA;AAAA;;AAAA,8LAAA,CAAA;AAgB9B,SAAS,uBAAA,CACd,SAAA,EACA,GAAA,EACA,KAAA,EACA,MAAA,EACmB;AACnB,EAAA,MAAM,EAAE,cAAa,GAAI,MAAA;AAKzB,EAAA,SAAS,mBAAmB,OAAA,EAAkC;AAC5D,IAAA,MAAM,UAAA,GAAa,OAAA,EAAS,YAAA,IAAgB,YAAA,IAAgB,uBAAA;AAC5D,IAAA,IAAI,CAAC,OAAA,EAAS,eAAA;AACZ,MAAA,OAAO,UAAA;AAET,IAAA,OAAO,GAAG,UAAU;;AAAA,EAAO,4BAAA,CAA6B,OAAA,CAAQ,mBAAA,EAAqB,OAAA,CAAQ,eAAe,CAAC,CAAA,CAAA;AAAA,EAC/G;AAKA,EAAA,SAAS,cAAc,QAAA,EAAuC;AAC5D,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,SAAA,EAAW,SAAA,EAAW,QAAQ,CAAA;AAC/D,IAAA,OAAO,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,KAAA,GAAQ,QAAA;AAAA,EAC9C;AAKA,EAAA,eAAe,QAAA,CACb,UACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,gBAAA,GAAmB,QAAA,CACtB,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA,CAC/B,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,MAAM,OAAA,GAAU,EAAE,IAAA,KAAS,WAAA,GACtB,EAAE,OAAA,IAAW,aAAA,GACd,CAAA,CAAE,IAAA,KAAS,MAAA,GACT,CAAA,cAAA,EAAiB,EAAE,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,CAAA,GACvC,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,CAAA,CAAE,OAAA,GAAU,cAAA;AACnD,MAAA,OAAO,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AAAA,IAC9B,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,IAAA,MAAM,MAAA,GAAS,mBAAmB,OAAO,CAAA;AAEzC,IAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,IAAA,CAAK;AAAA,MAChC,KAAA,EAAO,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AAAA,MACnC,QAAA,EAAU;AAAA,QACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAO;AAAA,QAClC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,gBAAA;AAAiB,OAC5C;AAAA,MACA,WAAA,EAAa,SAAS,WAAA,IAAe,GAAA;AAAA,MACrC,aAAA,EAAe;AAAA,KAChB,CAAA;AAED,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,OAAOK,IAAI,UAAA,CAAW,wBAAA,EAA0B,IAAI,2BAAA,EAA6B,EAAE,QAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,UAAA,CAAW,MAAM,OAAO,CAAA,IAAK,CAAA,EAAG,WAAW,KAAK,CAAA;AAAA,IAC7J;AAEA,IAAA,OAAOD,EAAAA,CAAG,WAAW,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAA,EAAS,WAAW,EAAE,CAAA;AAAA,EAC9D;AAKA,EAAA,eAAe,SAAA,CACb,UACA,OAAA,EACmC;AACnC,IAAAH,SAAO,KAAA,CAAM,sBAAA,EAAwB,EAAE,YAAA,EAAc,QAAA,CAAS,QAAQ,CAAA;AAEtE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAC/C,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,QAAA,OAAO,MAAA;AAET,MAAA,MAAM,UAAU,MAAA,CAAO,IAAA;AACvB,MAAA,OAAOG,EAAAA,CAAG;AAAA,QACR,OAAA;AAAA,QACA,UAAA,EAAY,KAAA,CAAM,YAAA,CAAa,OAAO,CAAA;AAAA,QACtC,iBAAiB,QAAA,CAAS,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,CAAE;AAAA,OAC5D,CAAA;AAAA,IACH,SACO,KAAA,EAAO;AACZ,MAAAH,QAAAA,CAAO,KAAA,CAAM,8BAAA,EAAgC,EAAE,OAAO,CAAA;AACtD,MAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,wBAAA,EAA0B,GAAA,CAAI,6BAA6B,EAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,OAAO,KAAK,CAAA,EAAE,EAAG,GAAG,KAAK,CAAA;AAAA,IAC/H;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA;AAAA,GACF;AACF;;;AChIO,SAAS,kBAAA,CAAmB,IAAA,EAAc,UAAA,GAAa,IAAA,EAAc;AAC1E,EAAA,IAAI,CAAC,IAAA;AACH,IAAA,OAAO,CAAA;AAGT,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAEpC,IAAA,IACG,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,IACvB,IAAA,IAAQ,KAAA,IAAU,IAAA,IAAQ,KAAA,IAC1B,IAAA,IAAQ,MAAA,IAAW,IAAA,IAAQ,MAAA,EAC/B;AACA,MAAA,QAAA,EAAA;AAAA,IACF,CAAA,MACK;AACH,MAAA,UAAA,EAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,GAAA,GAAM,aAAa,UAAU,CAAA;AAC3D;AAWO,SAAS,sBAAA,CAAuB,QAAA,EAAyB,UAAA,GAAa,IAAA,EAAc;AACzF,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAE1B,IAAA,KAAA,IAAS,CAAA;AAET,IAAA,MAAM,OAAA,GAAU,kBAAkB,GAAG,CAAA;AACrC,IAAA,KAAA,IAAS,kBAAA,CAAmB,SAAS,UAAU,CAAA;AAAA,EACjD;AAGA,EAAA,KAAA,IAAS,CAAA;AAET,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,kBAAkB,GAAA,EAA0B;AACnD,EAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,IAAA,MAAM,IAAI,GAAA,CAAI,OAAA;AACd,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA;AACf,MAAA,OAAO,CAAA;AACT,IAAA,IAAI,KAAA,CAAM,QAAQ,CAAC,CAAA;AACjB,MAAA,OAAQ,CAAA,CAA6C,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,MAAM,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AACrH,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,IAAA,MAAM,IAAI,GAAA,CAAI,OAAA;AACd,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA;AACf,MAAA,OAAO,CAAA;AACT,IAAA,IAAI,KAAA,CAAM,QAAQ,CAAC,CAAA;AACjB,MAAA,OAAQ,CAAA,CAA6C,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,MAAM,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AACrH,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAW,GAAA,CAAqE,OAAA;AACtF,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA;AACrB,IAAA,OAAO,OAAA;AACT,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,OAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAA2C,EAAE,IAAA,KAAS,MAAM,CAAA,CACpE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CACf,KAAK,GAAG,CAAA;AAAA,EACb;AACA,EAAA,OAAO,EAAA;AACT;AAQO,SAAS,sBAAsB,MAAA,EAAsC;AAC1E,EAAA,MAAM,EAAE,YAAW,GAAI,MAAA;AACvB,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAC,IAAA,KAAiB,kBAAA,CAAmB,MAAM,UAAU,CAAA;AAAA,IACnE,gBAAA,EAAkB,CAAC,QAAA,KAA4B,sBAAA,CAAuB,UAAU,UAAU;AAAA,GAC5F;AACF;;;ACtEA,IAAMJ,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,WAAA,EAAa,CAAA;AAkCrE,eAAsB,kBAAA,CAAmB,QAAkB,IAAA,EAA8C;AACvG,EAAA,MAAM,EAAE,aAAA,EAAe,QAAA,EAAU,WAAA,EAAY,GAAI,IAAA;AAGjD,EAAA,MAAM,eAAe,kBAAA,CAAmB,KAAA,CAAM,MAAA,CAAO,MAAA,IAAU,EAAE,CAAA;AACjE,EAAA,MAAM,UAAA,GAAa,aAAa,QAAA,KAAa,MAAA;AAG7C,EAAA,MAAM,eAAA,GAAkB,cAAc,cAAA,CAA2B,qBAAA,EAAuB,EAAE,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,CAAA;AACjI,EAAA,MAAM,eAAe,aAAA,CAAc,cAAA,CAA4B,mBAAmB,EAAE,WAAA,EAAa,MAAM,CAAA;AACvG,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,cAAA,CAAgC,0BAA0B,CAAA;AAC5F,EAAA,MAAM,WAAA,GAAc,UAAA,GAAa,IAAA,GAAO,aAAA,CAAc,cAAA,CAA4B,eAAA,EAAiB,EAAE,WAAA,EAAa,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,CAAA;AAC7I,EAAA,MAAM,YAAA,GAAe,cAAc,cAAA,CAA2F,gBAAA,EAAkB,EAAE,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,CAAA;AACzL,EAAA,MAAM,eAAe,aAAA,CAAc,cAAA,CAA+B,kBAAkB,EAAE,WAAA,EAAa,MAAM,CAAA;AAGzG,EAAA,MAAM,iBAAA,GAAoB,UAAA,GAAa,IAAA,GAAO,aAAA,CAAc,kBAAkB,uBAAuB,CAAA;AAGrG,EAAA,MAAM,cAAc,UAAA,EAAW;AAE/B,EAAA,MAAM,eAAe,oBAAA,CAAqB,MAAA,EAAQ,EAAE,WAAA,EAAa,eAAA,EAAiB,cAAc,CAAA;AAChG,EAAA,MAAM,MAAM,YAAA,CAAa,GAAA;AAGzB,EAAA,MAAM,GAAA,GAAM,oBAAA,CAA+B,CAAA;AAG3C,EAAA,MAAM,SAAA,GAAY,0BAA0B,MAAM,CAAA;AAGlD,EAAA,MAAM,SAAA,GAAY,yBAAA,CAA0B,MAAA,EAAQ,GAAG,CAAA;AAGvD,EAAA,MAAM,MAAA,GAAS,uBAAuB,MAAM,CAAA;AAE5C,EAAA,MAAM,SAAA,GAAY,yBAAA,CAA0B,SAAA,EAAW,aAAA,EAAe,aAAa,MAAM,CAAA;AAGzF,EAAA,IAAI,MAAA,CAAO,SAAA,EAAW,OAAA,EAAS,MAAA,EAAQ;AACrC,IAAA,MAAM,gBAAgB,qBAAA,CAAsB,KAAA,CAAM,OAAO,SAAS,CAAA,CAAE,WAAW,EAAC;AAChF,IAAA,WAAA,CACG,QAAA,CAAS,cAAc,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,CAAA,EAAE,CAAE,CAAC,CAAA,CACxD,KAAA,CAAM,CAAC,CAAA,KAAeC,QAAAA,CAAO,IAAA,CAAK,4CAA4C,EAAE,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAAA,EAChG;AAGA,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,GAAA,EAAK,SAAS,CAAA;AAG9C,EAAA,MAAM,kBAAkB,qBAAA,CAAsB,KAAA,CAAM,MAAA,CAAO,SAAA,IAAa,EAAE,CAAA;AAC1E,EAAA,MAAM,cAAA,GAAiB,cAAc,oBAAA,IAAuB;AAC5D,EAAA,MAAM,YAAY,yBAAA,CAA0B,eAAA,EAAiB,GAAA,EAAK,SAAA,EAAW,aAAa,cAAc,CAAA;AAExG,EAAA,MAAM,UAAA,GAAa,WAAA,IAAe,iBAAA,GAC9B,4BAAA,CAA6B,YAAA,EAAc,GAAA,EAAK,SAAA,EAAW,WAAA,EAAa,iBAAiB,CAAA,GACzF,MAAM,6BAAA,CAA8B;AAAA,IAClC,MAAA,EAAQ,YAAA;AAAA,IACR,QAAA,EAAU,MAAA;AAAA,IACV,GAAA;AAAA,IACA,cAAA,EAAgB,eAAA;AAAA,IAChB,aAAA,EAAe,OAAO,SAAA,EAAW,UAAA;AAAA,IACjC,aAAA,EAAe,cAAc,gBAAA;AAAmB,GACjD,CAAA;AAEL,EAAA,MAAM,MAAA,GAA2B,uBAAuB,UAAU,CAAA;AAGlE,EAAA,MAAM,cAAc,iBAAA,CAAkB,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA;AAC9D,EAAA,MAAM,gBAAgB,mBAAA,CAAoB,KAAA,CAAM,MAAA,CAAO,OAAA,IAAW,EAAE,CAAA;AACpE,EAAA,MAAM,iBAAiB,oBAAA,CAAqB,KAAA,CAAM,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA;AAEvE,EAAA,MAAM,KAAA,GAAQ,sBAAsB,WAAW,CAAA;AAC/C,EAAA,MAAM,UAAU,uBAAA,CAAwB,MAAA,CAAO,GAAA,EAAK,GAAA,EAAK,OAAO,aAAa,CAAA;AAC7E,EAAA,MAAM,QAAA,GAAW,yBAAyB,cAAA,EAAgB,KAAA,EAAO,SAAS,MAAA,CAAO,GAAA,CAAI,aAAa,IAAI,CAAA;AAEtG,EAAA,MAAM,UAAU,uBAAA,CAAwB,cAAA,EAAgB,KAAA,EAAO,QAAA,EAAU,cAAc,YAAA,EAAc;AAAA,IACnG,GAAA;AAAA,IACA,QAAQ,MAAA,IAAU,MAAA;AAAA,IAClB,KAAK,GAAA,IAAO,MAAA;AAAA,IACZ,WAAW,SAAA,IAAa,MAAA;AAAA,IACxB;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,OAAA,GAAU,wBAAwB,YAAY,CAAA;AAGpD,EAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,MAAA,EAAQ,GAAG,CAAA;AAG7C,EAAA,MAAM,KAAA,GAAQ,sBAAsB,MAAM,CAAA;AAE1C,EAAA,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,SAAA,EAAW,SAAA,EAAW,QAAQ,SAAA,EAAW,GAAA,EAAK,SAAA,EAAW,MAAA,EAAQ,SAAS,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,MAAM,KAAA,EAAM;AAC9I;AClKA,IAAMA,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,mBAAA,EAAqB,CAAA;AAG7E,IAAM,oBAAA,GAAuB,GAAA;AAU7B,IAAM,kBAAN,MAAkD;AAAA,EAC/B,GAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EAEjB,WAAA,CAAY,GAAA,EAAoB,KAAA,EAAe,OAAA,EAAuB,QAAgB,OAAA,EAA6B;AACjH,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,SAAS,WAAA,IAAe,KAAA;AAC3C,IAAA,IAAA,CAAK,YAAA,GAAe,SAAS,YAAA,IAAgB,KAAA;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,SAAS,SAAA,IAAa,KAAA;AACvC,IAAA,IAAA,CAAK,QAAA,GAAW,SAAS,QAAA,IAAY,KAAA;AACrC,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAS,aAAA,IAAiB,KAAA;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,WAAA,GAA6B;AACjC,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA;AACf,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA;AAChB,IAAA,MAAM,MAAA,GAAS,EAAA,KAAO,OAAA,GAAU,cAAA,GAAiB,MAAA;AACjD,IAAA,MAAM,SAAA,GAAY,EAAA,KAAO,OAAA,GAAU,cAAA,GAAiB,MAAA;AACpD,IAAA,MAAM,WAAW,EAAA,KAAO,YAAA,GAAe,OAAA,GAAU,EAAA,KAAO,UAAU,MAAA,GAAS,MAAA;AAE3E,IAAA,MAAM,IAAA,GAAiB,CAAC,CAAA,GAAA,EAAM,MAAM,CAAA,YAAA,CAAc,CAAA;AAClD,IAAA,IAAI,IAAA,CAAK,WAAA;AACP,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AACpC,IAAA,IAAI,IAAA,CAAK,YAAA;AACP,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,WAAA,EAAc,SAAS,CAAA,CAAE,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,SAAA;AACP,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,OAAA,EAAU,SAAS,CAAA,CAAE,CAAA;AACjC,IAAA,IAAI,IAAA,CAAK,QAAA;AACP,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,OAAA,EAAU,SAAS,CAAA,CAAE,CAAA;AACjC,IAAA,IAAA,CAAK,IAAA,CAAK,CAAA,KAAA,EAAQ,QAAQ,CAAA,SAAA,CAAA,EAAa,8BAA8B,CAAA,0BAAA,CAA4B,CAAA;AAEjG,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,2BAAA,EAA8B,CAAC,KAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAE7E,IAAA,IAAI,IAAA,CAAK,WAAA;AACP,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,kCAAkC,CAAC,CAAA,cAAA,EAAiB,CAAC,CAAA,WAAA,CAAa,CAAA;AAC3F,IAAA,IAAI,IAAA,CAAK,YAAA;AACP,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,kCAAkC,CAAC,CAAA,eAAA,EAAkB,CAAC,CAAA,YAAA,CAAc,CAAA;AAC7F,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,CAAK,YAAA;AAC3B,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,kCAAkC,CAAC,CAAA,mBAAA,EAAsB,CAAC,CAAA,uBAAA,CAAyB,CAAA;AAC5G,IAAA,IAAI,IAAA,CAAK,SAAA;AACP,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,kCAAkC,CAAC,CAAA,WAAA,EAAc,CAAC,CAAA,QAAA,CAAU,CAAA;AACrF,IAAA,IAAI,IAAA,CAAK,QAAA;AACP,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,kCAAkC,CAAC,CAAA,WAAA,EAAc,CAAC,CAAA,QAAA,CAAU,CAAA;AAErF,IAAA,IAAI,IAAA,CAAK,iBAAiB,EAAA,KAAO,YAAA;AAC/B,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,kCAAkC,CAAC,CAAA,aAAA,EAAgB,CAAC,CAAA,gCAAA,CAAkC,CAAA;AAAA,EACjH;AAAA,EAEA,MAAM,IAAA,CAAK,EAAA,EAAY,IAAA,EAAS,KAAA,EAAmC;AACjE,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAEhC,IAAA,MAAM,QAAA,GAAW,CAAC,IAAI,CAAA;AACtB,IAAA,MAAM,MAAA,GAAoB,CAAC,EAAE,CAAA;AAC7B,IAAA,MAAM,YAAA,GAAyB,CAAC,GAAG,CAAA;AAEnC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,QAAA,CAAS,KAAK,WAAW,CAAA;AACzB,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,QAAA,IAAY,IAAI,CAAA;AACnC,MAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,IACvB;AACA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,SAAA,IAAa,IAAI,CAAA;AACpC,MAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,IACvB;AACA,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,MAAA,IAAU,IAAI,CAAA;AACjC,MAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,IACvB;AACA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,KAAA,IAAS,IAAI,CAAA;AAChC,MAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,IACvB;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,MAAA,EAAQ,YAAA,EAAc,YAAY,CAAA;AAChD,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA;AAC1B,IAAA,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAE/B,IAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS;AAC3B,MAAA,MAAM,WAAA,GAAwB,CAAC,qBAAA,EAAuB,iCAAiC,CAAA;AACvF,MAAA,IAAI,IAAA,CAAK,WAAA;AACP,QAAA,WAAA,CAAY,KAAK,+BAA+B,CAAA;AAClD,MAAA,IAAI,IAAA,CAAK,YAAA;AACP,QAAA,WAAA,CAAY,KAAK,iCAAiC,CAAA;AACpD,MAAA,IAAI,IAAA,CAAK,SAAA;AACP,QAAA,WAAA,CAAY,KAAK,yBAAyB,CAAA;AAC5C,MAAA,IAAI,IAAA,CAAK,QAAA;AACP,QAAA,WAAA,CAAY,KAAK,yBAAyB,CAAA;AAC5C,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AAAA,QACb,eAAe,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,QAAA,CAAS,KAAK,IAAI,CAAC,CAAA,UAAA,EAAa,YAAA,CAAa,KAAK,IAAI,CAAC,6BAA6B,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QACxI;AAAA,OACF;AAAA,IACF,CAAA,MACK;AACH,MAAA,MAAM,WAAA,GAAwB,CAAC,sBAAA,EAAwB,kCAAkC,CAAA;AACzF,MAAA,IAAI,IAAA,CAAK,WAAA;AACP,QAAA,WAAA,CAAY,KAAK,gCAAgC,CAAA;AACnD,MAAA,IAAI,IAAA,CAAK,YAAA;AACP,QAAA,WAAA,CAAY,KAAK,kCAAkC,CAAA;AACrD,MAAA,IAAI,IAAA,CAAK,SAAA;AACP,QAAA,WAAA,CAAY,KAAK,0BAA0B,CAAA;AAC7C,MAAA,IAAI,IAAA,CAAK,QAAA;AACP,QAAA,WAAA,CAAY,KAAK,0BAA0B,CAAA;AAC7C,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AAAA,QACb,eAAe,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,QAAA,CAAS,KAAK,IAAI,CAAC,CAAA,UAAA,EAAa,YAAA,CAAa,KAAK,IAAI,CAAC,mCAAmC,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QAC9I;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,KAAA,EAA0E;AACvF,IAAA,IAAI,MAAM,MAAA,KAAW,CAAA;AACnB,MAAA;AAEF,IAAA,MAAM,QAAA,GAAW,KAAK,oBAAA,EAAqB;AAC3C,IAAA,MAAM,YAAA,GAAe,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,oBAAA,GAAuB,QAAA,CAAS,MAAM,CAAC,CAAA;AAGnF,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,YAAA,EAAc;AAE/D,MAAA,MAAM,IAAA,CAAK,cAAc,KAAA,CAAM,KAAA,CAAM,OAAO,KAAA,GAAQ,YAAY,GAAG,QAAQ,CAAA;AAAA,IAC7E;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAsB,CAAA,iBAAA,EAAoB,IAAA,CAAK,KAAK,CAAA,aAAA,CAAA,EAAiB,CAAC,EAAE,CAAC,CAAA;AACvG,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,IAAA;AAC7B,MAAA,OAAO,MAAA;AACT,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,MAAM,MAAA,EAAsC;AAChD,IAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,IAAA,CAAK,WAAW,MAAM,CAAA;AAC9C,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAwB,KAAK,MAAM,CAAA;AACjE,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,MAAA,OAAO,EAAC;AACV,IAAA,OAAO,MAAA,CAAO,KAAK,GAAA,CAAI,CAAA,GAAA,KAAO,KAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAM,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,SAAA,CAAU,MAAA,EAAwB,IAAA,EAAgE;AACtG,IAAA,MAAM,cAAyB,EAAC;AAChC,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,WAAW,CAAA;AACnE,IAAA,IAAI,QAAA,GAAW,CAAA,4BAAA,EAA+B,IAAA,CAAK,KAAK,CAAA,CAAA;AACxD,IAAA,IAAI,gBAAgB,MAAA,GAAS,CAAA;AAC3B,MAAA,QAAA,IAAY,CAAA,OAAA,EAAU,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AACrD,IAAA,MAAM,cAAc,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAqB,UAAU,WAAW,CAAA;AAC7E,IAAA,MAAM,KAAA,GAAQ,YAAY,OAAA,IAAW,WAAA,CAAY,QAAQ,IAAA,GAAO,WAAA,CAAY,KAAK,GAAA,GAAM,CAAA;AAEvF,IAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,IAAA,CAAK,UAAA,CAAW,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAW,CAAA;AACvE,IAAA,MAAM,QAAA,GAAW,GAAG,GAAG,CAAA,iBAAA,CAAA;AACvB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAwB,QAAA,EAAU,CAAC,GAAG,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AACpG,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAM,IAAI,EAAC;AAEpF,IAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AAAA,EACxB;AAAA,EAEA,MAAM,OAAO,EAAA,EAA8B;AACzC,IAAA,MAAM,IAAA,CAAK,IAAI,OAAA,CAAQ,CAAA,YAAA,EAAe,KAAK,KAAK,CAAA,aAAA,CAAA,EAAiB,CAAC,EAAE,CAAC,CAAA;AACrE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,MAAA,EAAyC;AACtD,IAAA,MAAM,SAAoB,EAAC;AAC3B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,MAAM,CAAA;AAEzD,IAAA,IAAI,QAAA,GAAW,CAAA,4BAAA,EAA+B,IAAA,CAAK,KAAK,CAAA,CAAA;AACxD,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,WAAA,GAAc,CAAA,OAAA,EAAU,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AACtD,MAAA,QAAA,IAAY,WAAA;AACZ,MAAA,MAAMiC,YAAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,IAAqB,QAAA,EAAU,CAAC,GAAG,MAAM,CAAC,CAAA;AAC7E,MAAA,MAAMC,MAAAA,GAAQD,aAAY,OAAA,IAAWA,YAAAA,CAAY,QAAQ,IAAA,GAAOA,YAAAA,CAAY,KAAK,GAAA,GAAM,CAAA;AACvF,MAAA,MAAM,IAAA,CAAK,IAAI,OAAA,CAAQ,CAAA,YAAA,EAAe,KAAK,KAAK,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,MAAM,CAAA;AACxE,MAAA,OAAOC,MAAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,GAAA,CAAI,IAAqB,QAAQ,CAAA;AAChE,IAAA,MAAM,KAAA,GAAQ,YAAY,OAAA,IAAW,WAAA,CAAY,QAAQ,IAAA,GAAO,WAAA,CAAY,KAAK,GAAA,GAAM,CAAA;AACvF,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAClD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,MAAA,EAA0C;AACpD,IAAA,IAAI,CAAC,MAAA,EAAQ,KAAA,IAAS,CAAC,QAAQ,QAAA,IAAY,CAAC,MAAA,EAAQ,SAAA,IAAa,CAAC,MAAA,EAAQ,MAAA,IAAU,CAAC,QAAQ,KAAA,EAAO;AAClG,MAAA,MAAMnB,OAAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAqB,CAAA,4BAAA,EAA+B,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAC9F,MAAA,OAAOA,QAAO,OAAA,IAAWA,OAAAA,CAAO,QAAQ,IAAA,GAAOA,OAAAA,CAAO,KAAK,GAAA,GAAM,CAAA;AAAA,IACnE;AACA,IAAA,MAAM,SAAoB,EAAC;AAC3B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAS,MAAM,CAAA;AAC1D,IAAA,IAAI,GAAA,GAAM,CAAA,4BAAA,EAA+B,IAAA,CAAK,KAAK,CAAA,CAAA;AACnD,IAAA,IAAI,WAAW,MAAA,GAAS,CAAA;AACtB,MAAA,GAAA,IAAO,CAAA,OAAA,EAAU,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AAC3C,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAqB,KAAK,MAAM,CAAA;AAC9D,IAAA,OAAO,OAAO,OAAA,IAAW,MAAA,CAAO,QAAQ,IAAA,GAAO,MAAA,CAAO,KAAK,GAAA,GAAM,CAAA;AAAA,EACnE;AAAA,EAEA,MAAM,MAAM,MAAA,EAAwC;AAClD,IAAA,IAAI,CAAC,MAAA,EAAQ,KAAA,IAAS,CAAC,QAAQ,QAAA,IAAY,CAAC,MAAA,EAAQ,SAAA,IAAa,CAAC,MAAA,EAAQ,MAAA,IAAU,CAAC,QAAQ,KAAA,EAAO;AAClG,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAClD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,SAAS,MAAO,CAAA;AAAA,EAC7B;AAAA;AAAA,EAGQ,oBAAA,GAAiC;AACvC,IAAA,MAAM,QAAA,GAAW,CAAC,IAAI,CAAA;AACtB,IAAA,IAAI,IAAA,CAAK,WAAA;AACP,MAAA,QAAA,CAAS,KAAK,WAAW,CAAA;AAC3B,IAAA,IAAI,IAAA,CAAK,YAAA;AACP,MAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,SAAA;AACP,MAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AACxB,IAAA,IAAI,IAAA,CAAK,QAAA;AACP,MAAA,QAAA,CAAS,KAAK,QAAQ,CAAA;AACxB,IAAA,QAAA,CAAS,IAAA,CAAK,MAAA,EAAQ,YAAA,EAAc,YAAY,CAAA;AAChD,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA,EAGQ,eAAA,CAAgB,EAAA,EAAY,IAAA,EAAS,KAAA,EAA+B,GAAA,EAAwB;AAClG,IAAA,MAAM,MAAA,GAAoB,CAAC,EAAE,CAAA;AAC7B,IAAA,IAAI,IAAA,CAAK,WAAA;AACP,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,QAAA,IAAY,IAAI,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,YAAA;AACP,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,SAAA,IAAa,IAAI,CAAA;AACtC,IAAA,IAAI,IAAA,CAAK,SAAA;AACP,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,MAAA,IAAU,IAAI,CAAA;AACnC,IAAA,IAAI,IAAA,CAAK,QAAA;AACP,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,KAAA,IAAS,IAAI,CAAA;AAClC,IAAA,MAAA,CAAO,KAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG,KAAK,GAAG,CAAA;AAC1C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGQ,oBAAA,GAAiC;AACvC,IAAA,MAAM,QAAA,GAAW,CAAC,MAAA,KAAmB,IAAA,CAAK,MAAA,KAAW,UAAU,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,CAAA,GAAM,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA;AACvG,IAAA,MAAM,WAAA,GAAwB,CAAC,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAC,CAAA,CAAA,EAAI,CAAA,aAAA,EAAgB,QAAA,CAAS,YAAY,CAAC,CAAA,CAAE,CAAA;AACrG,IAAA,IAAI,IAAA,CAAK,WAAA;AACP,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,YAAA,EAAe,QAAA,CAAS,WAAW,CAAC,CAAA,CAAE,CAAA;AACzD,IAAA,IAAI,IAAA,CAAK,YAAA;AACP,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAA,CAAS,YAAY,CAAC,CAAA,CAAE,CAAA;AAC3D,IAAA,IAAI,IAAA,CAAK,SAAA;AACP,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,SAAA,EAAY,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAE,CAAA;AACnD,IAAA,IAAI,IAAA,CAAK,QAAA;AACP,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,SAAA,EAAY,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAE,CAAA;AACnD,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,aAAA,CAAc,KAAA,EAA2D,QAAA,EAAmC;AACxH,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,SAAoB,EAAC;AAC3B,IAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,CAAC,EAAE,EAAA,EAAI,IAAA,EAAM,OAAM,KAAM;AACtD,MAAA,MAAM,YAAY,IAAA,CAAK,eAAA,CAAgB,EAAA,EAAI,IAAA,EAAM,OAAO,GAAG,CAAA;AAC3D,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,SAAS,CAAA;AACxB,MAAA,OAAO,CAAA,CAAA,EAAI,UAAU,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,IAChD,CAAC,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,KAAK,oBAAA,EAAqB;AAC9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,KAAW,OAAA,GAChC,2BAA2B,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GACjD,CAAA,8BAAA,EAAiC,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAE3D,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AAAA,MACb,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,SAAS,IAAA,CAAK,IAAI,CAAC,CAAA,SAAA,EAAY,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,IAAI,WAAW,CAAA,CAAA;AAAA,MACnG;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,WAAW,MAAA,EAA4D;AAC7E,IAAA,IAAI,GAAA,GAAM,CAAA,iBAAA,EAAoB,IAAA,CAAK,KAAK,CAAA,CAAA;AACxC,IAAA,MAAM,SAAoB,EAAC;AAC3B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,MAAM,CAAA;AACzD,IAAA,IAAI,WAAW,MAAA,GAAS,CAAA;AACtB,MAAA,GAAA,IAAO,CAAA,OAAA,EAAU,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA;AAE3C,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,SAAA,KAAc,QAAQ,KAAA,GAAQ,MAAA;AACzD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACzC,MAAA,IAAI,UAAU,WAAA,EAAa;AACzB,QAAA,GAAA,IAAO,wBAAwB,GAAG,CAAA,CAAA;AAAA,MACpC,CAAA,MAAA,IACS,UAAU,WAAA,EAAa;AAC9B,QAAA,GAAA,IAAO,wBAAwB,GAAG,CAAA,CAAA;AAAA,MACpC,CAAA,MACK;AACH,QAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAW,GAAI,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AACtF,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,UAAU,CAAA;AACzB,QAAA,GAAA,IAAO,CAAA,UAAA,EAAa,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,MACpC;AAAA,IACF,CAAA,MACK;AACH,MAAA,GAAA,IAAO,CAAA,yBAAA,CAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,GAAA,IAAO,CAAA,QAAA,CAAA;AACP,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,EAAE,KAAK,MAAA,EAAO;AAAA,EACvB;AAAA,EAEQ,kBAAA,CAAmB,QAAwB,MAAA,EAA6B;AAC9E,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,IAAI,MAAA,CAAO,QAAA,IAAY,IAAA,CAAK,WAAA,EAAa;AACvC,MAAA,UAAA,CAAW,KAAK,eAAe,CAAA;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,IAC7B;AACA,IAAA,IAAI,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,YAAA,EAAc;AACzC,MAAA,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,IAC9B;AACA,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,SAAA,EAAW;AACnC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AAChC,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,WAAA,EAAc,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACxE,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAAA,MAC9B,CAAA,MACK;AACH,QAAA,UAAA,CAAW,KAAK,YAAY,CAAA;AAC5B,QAAA,MAAA,CAAO,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,MAC3B;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,KAAA,IAAS,IAAA,CAAK,QAAA,EAAU;AACjC,MAAA,UAAA,CAAW,KAAK,YAAY,CAAA;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,YAAA,EAAc;AACxF,MAAA,UAAA,CAAW,KAAK,kBAAkB,CAAA;AAClC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAK,SAAA,CAAU,EAAE,OAAO,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,MAAA,CAAO,KAAA;AACT,MAAA,UAAA,CAAW,KAAK,GAAG,IAAA,CAAK,qBAAqB,MAAA,CAAO,KAAA,EAAO,MAAM,CAAC,CAAA;AACpE,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,oBAAA,CAAqB,OAAuB,MAAA,EAA6B;AAC/E,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,MAAA,MAAM,KAAA,GAAS,MAAkC,GAAG,CAAA;AACpD,MAAA,MAAM,IAAA,GAAO,KAAK,GAAG,CAAA,CAAA;AACrB,MAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC/B,QAAA,MAAM,EAAA,GAAK,KAAA;AACX,QAAA,IAAI,GAAG,GAAA,KAAQ,MAAA,IAAa,MAAM,OAAA,CAAQ,EAAA,CAAG,GAAG,CAAA,EAAG;AACjD,UAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,UAAA,KAAe,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AAC9E,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,UAAU,CAAA;AACzB,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,KAAA,EAAQ,EAAA,CAAG,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AACrE,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,EAAA,CAAG,GAAG,CAAA;AAAA,QACvB;AACA,QAAA,IAAI,EAAA,CAAG,SAAS,MAAA,EAAW;AACzB,UAAA,MAAM,EAAE,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,KAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AAC/D,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAChB,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,KAAA,CAAO,CAAA;AAC3B,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,QACrB;AACA,QAAA,IAAI,EAAA,CAAG,QAAQ,MAAA,EAAW;AACxB,UAAA,MAAM,EAAE,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,KAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AAC/D,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAChB,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,IAAA,CAAM,CAAA;AAC1B,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA;AAAA,QACpB;AACA,QAAA,IAAI,EAAA,CAAG,SAAS,MAAA,EAAW;AACzB,UAAA,MAAM,EAAE,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,KAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AAC/D,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAChB,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,KAAA,CAAO,CAAA;AAC3B,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,QACrB;AACA,QAAA,IAAI,EAAA,CAAG,QAAQ,MAAA,EAAW;AACxB,UAAA,MAAM,EAAE,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,KAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AAC/D,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAChB,UAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA,IAAA,CAAM,CAAA;AAC1B,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,GAAG,CAAA;AAAA,QACpB;AAAA,MACF,CAAA,MACK;AACH,QAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,UAAA,KAAe,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AAC9E,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,UAAU,CAAA;AACzB,QAAA,UAAA,CAAW,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,IAAA,CAAM,CAAA;AAChC,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,gBAAmB,KAAA,EAA2C;AACpE,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,KAAA,CAAM,QAAQ,KAAK,CAAA;AACpE,MAAA,OAAO,KAAA;AACT,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,MAAM,CAAA,CAAA,KAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAQ,KAAK,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EAC7F;AACF,CAAA;AAUA,IAAM,qBAAN,MAAkD;AAAA,EAC/B,KAAA;AAAA,EACA,UAAA;AAAA,EACT,mBAAA,GAAqC,IAAA;AAAA,EAE7C,WAAA,CAAYoB,QAAuB,UAAA,EAAoB;AACrD,IAAA,IAAA,CAAK,KAAA,GAAQA,MAAAA;AACb,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEA,MAAc,iBAAiB,SAAA,EAAkC;AAC/D,IAAA,IAAI,KAAK,mBAAA,KAAwB,SAAA;AAC/B,MAAA;AACF,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAM,UAAA,CAAW,MAAA,CAAO,KAAK,UAAU,CAAA;AACjE,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,IAAA;AAC5B,MAAA,MAAM,IAAA,CAAK,MAAM,UAAA,CAAW,MAAA,CAAO,KAAK,UAAA,EAAY,EAAE,WAAW,CAAA;AACnE,IAAA,IAAA,CAAK,mBAAA,GAAsB,SAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,MAAA,CAAO,EAAA,EAAY,MAAA,EAAkB,QAAA,EAAmD;AAC5F,IAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,MAAM,CAAA;AACzC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,CAAC,EAAE,EAAA,EAAI,MAAA,EAAQ,QAAA,EAAU,CAAC,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAM,MAAA,CAAO,MAAA,EAAkB,OAAA,EAAuL;AACpN,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,MAAA,CAAO,IAAA,CAAK,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAA;AAC9E,IAAA,OAAO,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,IAAA,GAAO,EAAC;AAAA,EACzC;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,MAAM,MAAA,CAAO,MAAA,CAAO,KAAK,UAAA,EAAY,CAAC,EAAE,CAAC,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,MAAM,OAAA,EAAkD;AAC5D,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAM,UAAA,CAAW,MAAA,CAAO,KAAK,UAAU,CAAA;AACjE,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,IAAA,CAAK,KAAK,UAAU,CAAA;AAChD,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAAA,IAC7B;AAAA,EACF;AACF,CAAA;AAKA,SAAS,+BAA+B,MAAA,EAA0B;AAChE,EAAA,MAAM,EAAA,GAAK,MAAA,KAAW,OAAA,GAAU,cAAA,GAAiB,MAAA;AACjD,EAAA,MAAM,OAAA,GAAU,MAAA,KAAW,OAAA,GAAU,cAAA,GAAiB,MAAA;AACtD,EAAA,MAAM,QAAA,GAAW,MAAA;AAEjB,EAAA,OAAO;AAAA,IACL,CAAA;AAAA,cAAA,EACY,EAAE,CAAA;AAAA,cAAA,EACF,OAAO,CAAA;AAAA,cAAA,EACP,OAAO,CAAA;AAAA,cAAA,EACP,OAAO,CAAA;AAAA,cAAA,EACP,QAAQ,CAAA;AAAA,cAAA,EACR,QAAQ,CAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAAA,IAIpB,CAAA,4FAAA,CAAA;AAAA,IACA,CAAA,4FAAA,CAAA;AAAA,IACA,CAAA,wGAAA,CAAA;AAAA,IACA,CAAA;AAAA,cAAA,EACY,EAAE,CAAA;AAAA,cAAA,EACF,EAAE,CAAA;AAAA,cAAA,EACF,EAAE,CAAA;AAAA,cAAA,EACF,OAAO,CAAA;AAAA;AAAA,cAAA,EAEP,QAAQ,CAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAAA,IAIpB,CAAA,4GAAA,CAAA;AAAA,IACA,CAAA,6GAAA,CAAA;AAAA,IACA,CAAA;AAAA,cAAA,EACY,EAAE,CAAA;AAAA,cAAA,EACF,OAAO,CAAA;AAAA,cAAA,EACP,QAAQ,CAAA;AAAA,cAAA,EACR,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAAA,IAKpB,CAAA;AAAA,cAAA,EACY,OAAO,CAAA;AAAA;AAAA;AAAA,CAAA;AAAA,GAIrB;AACF;AAQA,IAAM,mBAAN,MAAiD;AAAA,EAC9B,GAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EAEjB,WAAA,CAAY,GAAA,EAAoB,MAAA,EAAgBA,MAAAA,EAAuB;AACrE,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQA,MAAAA;AAAA,EACf;AAAA,EAEA,MAAM,UAAA,CAAW,UAAA,EAAoB,SAAA,EAAkC;AAErE,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,OAAO,UAAU,CAAA;AAC5D,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,IAAA;AAC5B,MAAA,MAAM,KAAK,KAAA,CAAM,UAAA,CAAW,OAAO,UAAA,EAAY,EAAE,WAAW,CAAA;AAG9D,IAAA,MAAM,UAAA,GAAa,8BAAA,CAA+B,IAAA,CAAK,MAAM,CAAA;AAC7D,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAI,CAAA;AAC1C,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAAlC,QAAAA,CAAO,KAAA,CAAM,kCAAA,EAAoC,EAAE,KAAK,IAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AACvG,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,MAAA,EAAiI;AAClJ,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,MAAA,GAAS,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,UAAU,IAAA,CAAK,SAAA,CAAU,OAAO,OAAO,CAAA,GAAI,MAAM,MAAA,CAAO,WAAA,IAAe,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA;AACpK,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,KAAW,OAAA,GACzB,CAAA,+UAAA,CAAA,GACA,CAAA,2VAAA,CAAA;AACJ,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAM,MAAM,CAAA;AAClD,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,kBAAA,CAAmB,OAAA,EAAiB,UAAA,EAAoG;AAC5I,IAAA,MAAM,OAAA,GAAU,IAAI,OAAO,CAAA,CAAA,CAAA;AAC3B,IAAA,IAAI,IAAA,GAAO,CAAA,iGAAA,CAAA;AACX,IAAA,MAAM,MAAA,GAAoB,CAAC,OAAA,EAAS,OAAO,CAAA;AAC3C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,IAAQ,qBAAA;AACR,MAAA,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,IACxB;AACA,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAA+B,MAAM,MAAM,CAAA;AACzE,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,MAAA,OAAO,EAAC;AACV,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,MAC7B,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,IAAI,OAAA,GAAU,IAAA,CAAK,MAAM,GAAA,CAAI,OAAiB,IAAgB;AAAC,KAC1E,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,aAAa,OAAA,EAAmP;AACpQ,IAAA,IAAI,IAAA,GAAO,4GAAA;AACX,IAAA,MAAM,SAAoB,EAAC;AAC3B,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,IAAA,IAAQ,qBAAA;AACR,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,UAAU,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,IAAA,IAAQ,eAAA;AACR,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,IAC1B;AACA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,IAAA,IAAQ,sCAAA;AACR,MAAA,MAAM,CAAA,GAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAO,CAAA,CAAA,CAAA;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IAClB;AACA,IAAA,IAAA,IAAQ,gBAAA;AACR,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,IAAA,IAAQ,UAAA;AACR,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,IAC3B;AACA,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAA+B,MAAM,MAAM,CAAA;AACzE,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,MAAA,OAAO,EAAC;AACV,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,MAC7B,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,IAAI,OAAA,GAAU,IAAA,CAAK,MAAM,GAAA,CAAI,OAAiB,IAAgB,EAAC;AAAA,MACxE,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,WAAW,GAAA,CAAI,UAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,eAAe,SAAA,EAAoC;AACvD,IAAA,IAAI,UAAU,MAAA,KAAW,CAAA;AACvB,MAAA;AACF,IAAA,MAAM,eAAe,SAAA,CAAU,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACvD,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AAAA,MACb,oDAAoD,YAAY,CAAA,CAAA,CAAA;AAAA,MAChE;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,qBAAqB,QAAA,EAA+I;AACxK,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,SAAS,CAAC,QAAA,CAAS,QAAA,EAAU,QAAA,CAAS,YAAY,QAAA,CAAS,OAAA,IAAW,EAAA,EAAI,QAAA,CAAS,YAAY,QAAA,CAAS,SAAA,IAAa,GAAK,QAAA,CAAS,OAAA,IAAW,MAAM,GAAG,CAAA;AAC7J,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,KAAW,OAAA,GACzB,CAAA,yOAAA,CAAA,GACA,CAAA,+QAAA,CAAA;AACJ,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAM,MAAM,CAAA;AAClD,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,wBAAA,CAAyB,SAAA,EAAqB,UAAA,EAA+J;AACjN,IAAA,IAAI,UAAU,MAAA,KAAW,CAAA;AACvB,MAAA,OAAO,EAAC;AACV,IAAA,MAAM,eAAe,SAAA,CAAU,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACvD,IAAA,IAAI,IAAA,GAAO,qIAAqI,YAAY,CAAA,CAAA,CAAA;AAC5J,IAAA,MAAM,MAAA,GAAoB,CAAC,GAAG,SAAS,CAAA;AACvC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,IAAQ,qBAAA;AACR,MAAA,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,IACxB;AACA,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAA+B,MAAM,MAAM,CAAA;AACzE,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,MAAA,OAAO,EAAC;AACV,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,MAC7B,UAAU,GAAA,CAAI,SAAA;AAAA,MACd,YAAY,GAAA,CAAI,WAAA;AAAA,MAChB,SAAS,GAAA,CAAI,QAAA;AAAA,MACb,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,SAAS,GAAA,CAAI;AAAA,KACf,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,gBAAA,CAAiB,UAAA,EAAoB,OAAA,EAAmS;AAC5U,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,kBAAA,CAAmB,UAAA,EAAY,SAAS,UAAU,CAAA;AAC9E,IAAA,IAAI,QAAA,GAAW,QAAA;AACf,IAAA,IAAI,OAAA,EAAS,IAAA;AACX,MAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,QAAQ,IAAI,CAAA;AACzD,IAAA,IAAI,SAAS,MAAA,KAAW,CAAA;AACtB,MAAA,OAAO,EAAC;AAEV,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE,CAAA;AACxC,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,wBAAA,CAAyB,SAAA,EAAW,SAAS,UAAU,CAAA;AAE/E,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAA2H;AACpJ,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,OAAO,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,QAAQ,KAAK,EAAC;AAChD,MAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,MAAK,GAAI,GAAA;AACzC,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,MAAA,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AAAA,IACrC;AAEA,IAAA,OAAO,QAAA,CAAS,IAAI,CAAA,MAAA,MAAW;AAAA,MAC7B,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,aAAa,IAAA,EAAsB;AAAA,MACxD,WAAW,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,EAAE,KAAK;AAAC,KAC7C,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,sBAAA,CAAuB,UAAA,EAAoB,UAAA,EAAmC;AAElF,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AAAA,MACb,+KAAA;AAAA,MACA,CAAC,UAAA,EAAY,UAAA,EAAY,UAAU;AAAA,KACrC;AAAA,EACF;AAAA,EAEA,MAAM,6BAAA,CAA8B,UAAA,EAAoB,UAAA,EAAmC;AACzF,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AAAA,MACb,uFAAA;AAAA,MACA,CAAC,YAAY,UAAU;AAAA,KACzB;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,GAAA,EAAqI;AACxJ,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,CAAI,UAAA,EAAY,IAAI,UAAA,EAAY,GAAA,CAAI,KAAA,IAAS,IAAA,EAAM,IAAI,GAAA,IAAO,IAAA,EAAM,GAAA,CAAI,UAAA,EAAY,IAAI,SAAS,CAAA;AACjH,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,KAAW,OAAA,GACzB,CAAA,kOAAA,CAAA,GACA,CAAA,gQAAA,CAAA;AACJ,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,WAAA,CAAY,UAAA,EAAoB,UAAA,EAAsK;AAC1M,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA;AAAA,MAC5B,6IAAA;AAAA,MACA,CAAC,YAAY,UAAU;AAAA,KACzB;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,KAAK,MAAA,KAAW,CAAA;AAC5C,MAAA,OAAO,MAAA;AACT,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AACzB,IAAA,OAAO;AAAA,MACL,YAAY,GAAA,CAAI,WAAA;AAAA,MAChB,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,YAAY,GAAA,CAAI,WAAA;AAAA,MAChB,WAAW,GAAA,CAAI;AAAA,KACjB;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,CAAc,UAAA,EAAoB,OAAA,EAA4L;AAClO,IAAA,IAAI,IAAA,GAAO,yHAAA;AACX,IAAA,MAAM,MAAA,GAAoB,CAAC,UAAU,CAAA;AACrC,IAAA,IAAA,IAAQ,2BAAA;AACR,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,IAAA,IAAQ,UAAA;AACR,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,IAAA,IAAQ,WAAA;AACR,MAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC5B;AACA,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAA+B,MAAM,MAAM,CAAA;AACzE,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,MAAA,OAAO,EAAC;AACV,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,MAC7B,YAAY,GAAA,CAAI,WAAA;AAAA,MAChB,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,YAAY,GAAA,CAAI,WAAA;AAAA,MAChB,WAAW,GAAA,CAAI;AAAA,KACjB,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,wBAAA,CAAyB,WAAA,EAAuB,UAAA,EAAkD;AACtG,IAAA,IAAI,YAAY,MAAA,KAAW,CAAA;AACzB,MAAA,2BAAW,GAAA,EAAI;AACjB,IAAA,MAAM,eAAe,WAAA,CAAY,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA;AAAA,MAC5B,oHAAoH,YAAY,CAAA,yCAAA,CAAA;AAAA,MAChI,CAAC,GAAG,WAAA,EAAa,UAAU;AAAA,KAC7B;AACA,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,KAAA,MAAW,GAAA,IAAO,OAAO,IAAA,EAAM,GAAA,CAAI,IAAI,GAAA,CAAI,WAAA,EAAuB,IAAI,GAAa,CAAA;AAAA,IACrF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,cAAA,CAAe,UAAA,EAAoB,UAAA,EAAmC;AAC1E,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,kFAAkF,CAAC,UAAA,EAAY,UAAU,CAAC,CAAA;AAAA,EACnI;AAAA,EAEA,MAAM,aAAA,CAAc,UAAA,EAAoB,OAAA,EAAuH;AAE7J,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,OAAO,UAAU,CAAA;AAC5D,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,IAAA;AAC5B,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,UAAA,EAAY,EAAE,SAAA,EAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ,CAAA;AAAA,IAC1F;AACA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,YAAY,OAAO,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,aAAA,CAAc,UAAA,EAAoB,MAAA,EAAkB,OAAA,EAAuL;AAC/O,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,MAAA,CAAO,UAAA,EAAY,QAAQ,OAAO,CAAA;AACzE,IAAA,OAAO,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,IAAA,GAAO,EAAC;AAAA,EACzC;AAAA,EAEA,MAAM,aAAA,CAAc,UAAA,EAAoB,GAAA,EAA8B;AACpE,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,gBAAA,CAAiB,UAAA,EAAoB,SAAA,EAAkC;AAC3E,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,OAAO,UAAU,CAAA;AAC5D,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,CAAC,MAAA,CAAO,IAAA;AAC5B,MAAA,MAAM,KAAK,KAAA,CAAM,UAAA,CAAW,OAAO,UAAA,EAAY,EAAE,WAAW,CAAA;AAAA,EAChE;AAAA,EAEA,MAAM,kBAAA,CAAmB,UAAA,EAAoB,SAAA,EAAkC;AAC7E,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,KAAW,OAAA,GACzB,CAAA,mJAAA,CAAA,GACA,CAAA,kKAAA,CAAA;AACJ,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAC,UAAA,EAAY,SAAA,EAAW,GAAG,CAAC,CAAA;AACxE,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EACxE;AAAA,EAEA,MAAM,iBAAiB,UAAA,EAAsC;AAC3D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA;AAAA,MAC5B,CAAA,sEAAA,CAAA;AAAA,MACA,CAAC,UAAU;AAAA,KACb;AACA,IAAA,OAAO,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,IAAQ,IAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,iBAAiB,UAAA,EAAmC;AAExD,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,OAAO,UAAU,CAAA;AAC5D,IAAA,IAAI,MAAA,CAAO,WAAW,MAAA,CAAO,IAAA;AAC3B,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAG7C,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,mEAAA,EAAqE,CAAC,UAAU,CAAC,CAAA;AACxG,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,4DAAA,EAA8D,CAAC,UAAU,CAAC,CAAA;AACjG,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,0DAAA,EAA4D,CAAC,UAAU,CAAC,CAAA;AAC/F,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA,CAAQ,+DAAA,EAAiE,CAAC,UAAU,CAAC,CAAA;AAAA,EACtG;AACF,CAAA;AAkBO,SAAS,sBAAsB,IAAA,EAA4C;AAChF,EAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,UAAS,GAAI,IAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,QAAA;AAG9B,EAAA,MAAM,YAAwC,EAAC;AAE/C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,IAAA;AAAA,IAEN,cAAA,CAAkB,MAAc,OAAA,EAA4C;AAC1E,MAAA,MAAM,QAAQ,IAAI,eAAA,CAAmB,KAAK,IAAA,EAAM,OAAA,EAAS,QAAQ,OAAO,CAAA;AACxE,MAAA,SAAA,CAAU,KAAK,KAAiC,CAAA;AAChD,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IAEA,kBAAkB,IAAA,EAA6B;AAC7C,MAAA,OAAO,IAAI,kBAAA,CAAmB,QAAA,EAAU,IAAI,CAAA;AAAA,IAC9C,CAAA;AAAA,IAEA,gBAAA,GAAgD;AAC9C,MAAA,MAAM,aAAa,QAAA,CAAS,aAAA;AAC5B,MAAA,OAAO,UAAA,GAAa,EAAE,GAAG,UAAA,EAAW,GAAI,MAAA;AAAA,IAC1C,CAAA;AAAA,IAEA,oBAAA,GAAuC;AACrC,MAAA,OAAO,IAAI,gBAAA,CAAiB,GAAA,EAAK,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACnD,CAAA;AAAA,IAEA,MAAM,UAAA,GAA4B;AAChC,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,QAAA,MAAM,OAAA,CAAQ,IAAI,SAAA,CAAU,GAAA,CAAI,OAAK,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AACrD,QAAAA,SAAO,KAAA,CAAM,+BAAA,EAAiC,EAAE,UAAA,EAAY,SAAA,CAAU,QAAQ,CAAA;AAAA,MAChF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,KAAA,GAAuB;AAC3B,MAAA,SAAA,CAAU,MAAA,GAAS,CAAA;AAAA,IACrB;AAAA,GACF;AACF;AASO,SAAS,kBAAA,GAA8B;AAC5C,EAAA,OAAO,KAAA,CAAM,iBAAiB,KAAA,CAAM,aAAA;AACtC;AAmBO,SAAS,gCAAA,GAAoD;AAClE,EAAA,OAAO,qBAAA,CAAsB;AAAA,IAC3B,KAAK,KAAA,CAAM,GAAA;AAAA,IACX,SAAS,KAAA,CAAM,IAAA;AAAA,IACf,MAAA,EAAQ,MAAM,MAAA,EAAQ,IAAA;AAAA,IACtB;AAAA,GACD,CAAA;AACH;;;ACj5BA,SAAS,gBAAgB,KAAA,EAAiD;AACxE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IACnB,KAAA,KAAU,QACV,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,KAAK,CAAA,CAAE,IAAA,CAAK,CAAA,GAAA,KAAO,OAAO,KAAK,CAAA;AACrE;AAEA,SAAS,OAAA,CAAQ,MAAe,KAAA,EAAwB;AACtD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA;AAC/C,IAAA,OAAO,IAAA,GAAO,KAAA;AAChB,EAAA,OAAO,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAE,cAAc,MAAA,CAAO,KAAA,IAAS,EAAE,CAAC,CAAA;AAC7D;AAEA,SAAS,eAAA,CAAgB,OAAgB,QAAA,EAA2C;AAClF,EAAA,IAAI,QAAA,CAAS,GAAA,IAAO,CAAC,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,CAAA,SAAA,KAAa,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,KAAK,CAAC,CAAA;AAC7E,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,SAAS,IAAA,KAAS,MAAA,IAAa,QAAQ,KAAA,EAAO,QAAA,CAAS,IAAI,CAAA,GAAI,CAAA;AACjE,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,SAAS,GAAA,KAAQ,MAAA,IAAa,QAAQ,KAAA,EAAO,QAAA,CAAS,GAAG,CAAA,IAAK,CAAA;AAChE,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,SAAS,IAAA,KAAS,MAAA,IAAa,QAAQ,KAAA,EAAO,QAAA,CAAS,IAAI,CAAA,GAAI,CAAA;AACjE,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,SAAS,GAAA,KAAQ,MAAA,IAAa,QAAQ,KAAA,EAAO,QAAA,CAAS,GAAG,CAAA,IAAK,CAAA;AAChE,IAAA,OAAO,KAAA;AACT,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAA,CAAiB,QAAqB,MAAA,EAAiC;AAC9E,EAAA,IAAI,OAAO,QAAA,KAAa,MAAA,IAAa,MAAA,CAAO,KAAA,EAAO,aAAa,MAAA,CAAO,QAAA;AACrE,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,OAAO,SAAA,KAAc,MAAA,IAAa,MAAA,CAAO,KAAA,EAAO,cAAc,MAAA,CAAO,SAAA;AACvE,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,OAAO,KAAA,KAAU,MAAA,IAAa,MAAA,CAAO,KAAA,EAAO,UAAU,MAAA,CAAO,KAAA;AAC/D,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,MAAA,CAAO,WAAW,MAAA,EAAW;AAC/B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,MAAA,CAAO,MAAA,GAAS,CAAC,MAAA,CAAO,MAAM,CAAA;AAC9E,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO,MAAA,IAAU,CAAC,QAAA,CAAS,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AACjE,MAAA,OAAO,KAAA;AAAA,EACX;AAEA,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,KAAA,MAAW,CAAC,KAAK,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC1D,MAAA,MAAM,MAAA,GAAS,KAAK,GAAG,CAAA;AACvB,MAAA,IAAI,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC7B,QAAA,IAAI,CAAC,eAAA,CAAgB,MAAA,EAAQ,QAAQ,CAAA;AACnC,UAAA,OAAO,KAAA;AAAA,MACX,WACS,CAAC,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,QAAQ,CAAA,EAAG;AACrC,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA;AACvB,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,SAAA,KAAc,IAAA;AACjD,MAAA,OAAO,KAAA;AACT,IAAA,KAAA,MAAW,CAAC,KAAK,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC1D,MAAA,IAAI,CAAC,MAAA,CAAO,EAAA,CAAI,SAAA,CAAsC,GAAG,GAAG,QAAQ,CAAA;AAClE,QAAA,OAAO,KAAA;AAAA,IACX;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAkB,OAAA,EAAkD;AAC3E,EAAA,SAAS,OAAO,MAAA,EAA6B;AAC3C,IAAA,IAAI,SAAS,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CACrC,MAAA,CAAO,CAAA,MAAA,KAAU,aAAA,CAAc,QAAQ,MAAM,CAAC,EAC9C,GAAA,CAAI,CAAA,MAAA,KAAU,OAAO,IAAS,CAAA;AAEjC,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,MAAA,CAAO,OAAA;AACpC,MAAA,MAAM,UAAA,GAAa,SAAA,KAAc,KAAA,GAAQ,CAAA,GAAI,EAAA;AAC7C,MAAA,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG,KAAA,CAAM,KAAK,CAAC,IAAI,UAAU,CAAA;AAAA,IACvF;AACA,IAAA,IAAI,OAAO,KAAA,KAAU,MAAA;AACnB,MAAA,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AACpD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO;AAC1B,MAAA,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,IACjC,CAAA;AAAA,IACA,MAAM,SAAS,KAAA,EAAO;AACpB,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA;AACjB,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,EAAE,IAAA,EAAM,KAAK,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAAA,IAC/D,CAAA;AAAA,IACA,MAAM,IAAI,EAAA,EAAI;AACZ,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA;AAAA,IAC1B,CAAA;AAAA,IACA,MAAM,MAAM,MAAA,EAAQ;AAClB,MAAA,OAAO,OAAO,MAAM,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,MAAM,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM;AAC5B,MAAA,MAAM,SAAS,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,QAAW,CAAA;AACrD,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,OAAO,KAAA,CAAM,IAAA,CAAK,QAAQ,IAAA,CAAK,MAAA,GAAS,KAAK,KAAK,CAAA;AAAA,QACzD,OAAO,MAAA,CAAO;AAAA,OAChB;AAAA,IACF,CAAA;AAAA,IACA,MAAM,OAAO,EAAA,EAAI;AACf,MAAA,OAAO,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,MAAM,SAAS,MAAA,EAAQ;AACrB,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,CACrC,MAAA,CAAO,CAAC,GAAG,MAAM,CAAA,KAAM,aAAA,CAAc,MAAA,EAAQ,MAAM,CAAC,CAAA,CACpD,IAAI,CAAC,CAAC,EAAE,CAAA,KAAM,EAAE,CAAA;AACnB,MAAA,KAAA,MAAW,EAAA,IAAM,GAAA;AACf,QAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnB,MAAA,OAAO,GAAA,CAAI,MAAA;AAAA,IACb,CAAA;AAAA,IACA,MAAM,KAAA,CAAM,MAAA,GAAS,EAAC,EAAG;AACvB,MAAA,OAAO,OAAO,EAAE,GAAG,QAAQ,KAAA,EAAO,MAAA,EAAW,CAAA,CAAE,MAAA;AAAA,IACjD,CAAA;AAAA,IACA,MAAM,MAAM,MAAA,EAAQ;AAClB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,KAAA,EAAM;AACd,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,CACrC,MAAA,CAAO,CAAC,GAAG,MAAM,CAAA,KAAM,aAAA,CAAc,MAAA,EAAQ,MAAM,CAAC,CAAA,CACpD,IAAI,CAAC,CAAC,EAAE,CAAA,KAAM,EAAE,CAAA;AACnB,MAAA,KAAA,MAAW,EAAA,IAAM,GAAA;AACf,QAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IACrB;AAAA,GACF;AACF;AAEA,SAASmC,iBAAAA,CAAiB,MAAgB,KAAA,EAAyB;AACjE,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,KAAA,CAAM,MAAA,IAAU,KAAK,MAAA,KAAW,CAAA;AAClD,IAAA,OAAO,CAAA;AACT,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAQ,SAAS,CAAA,EAAG;AACnD,IAAA,GAAA,IAAO,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA,CAAM,KAAK,CAAA;AAChC,IAAA,QAAA,IAAY,IAAA,CAAK,KAAK,CAAA,IAAK,CAAA;AAC3B,IAAA,SAAA,IAAa,KAAA,CAAM,KAAK,CAAA,IAAK,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,QAAA,KAAa,KAAK,SAAA,KAAc,CAAA;AAClC,IAAA,OAAO,CAAA;AACT,EAAA,OAAO,OAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,GAAI,IAAA,CAAK,KAAK,SAAS,CAAA,CAAA;AACzD;AAEA,SAAS,kBAAkB,OAAA,EAAmD;AAC5E,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,EAAA,EAAI,MAAA,EAAQ,QAAA,EAAU;AACjC,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,EAAE,MAAA,EAAQ,CAAC,GAAG,MAAM,CAAA,EAAG,QAAA,EAAU,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,MAAM,MAAA,CAAO,MAAA,EAAQ,OAAA,GAAU,EAAC,EAAG;AACjC,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,CACzC,OAAO,CAAC,GAAG,IAAI,CAAA,KAAM,CAAC,OAAA,CAAQ,MAAA,IAAU,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAA;AAAA,QACtE,CAAC,CAAC,GAAA,EAAK,QAAQ,CAAA,KAAM,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,QAAA,GAAW,GAAG,CAAA,EAAG,QAAQ;AAAA,OAC9D,CAAA,CACA,GAAA,CAAI,CAAC,CAAC,EAAA,EAAI,IAAI,CAAA,MAAO;AAAA,QACpB,EAAA;AAAA,QACA,KAAA,EAAOA,iBAAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,QAC3C,OAAA,EAAS,OAAO,IAAA,CAAK,QAAA,EAAU,YAAY,QAAA,GAAW,IAAA,CAAK,SAAS,OAAA,GAAU,MAAA;AAAA,QAC9E,UAAU,IAAA,CAAK;AAAA,QACf,CAAA,CACD,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,UAAU,OAAA,CAAQ,QAAA,IAAY,CAAA,CAAE,CAAA,CACpD,KAAK,CAAC,IAAA,EAAM,UAAU,KAAA,CAAM,KAAA,GAAQ,KAAK,KAAK,CAAA;AACjD,MAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAAA,IAC5C,CAAA;AAAA,IACA,MAAM,OAAO,EAAA,EAAI;AACf,MAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,MAAM,MAAM,MAAA,EAAQ;AAClB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,KAAA,EAAM;AACd,QAAA;AAAA,MACF;AACA,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,CAAA,IAAK,OAAA,EAAS;AAChC,QAAA,IAAI,OAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,GAAA,EAAK,QAAQ,CAAA,KAAM,OAAO,EAAA,CAAG,IAAA,CAAK,WAAW,GAAG,CAAA,EAAG,QAAQ,CAAC,CAAA;AAC7F,UAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,GACF;AACF;AAGO,SAAS,yBAAA,GAA6C;AAC3D,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsC;AAC5D,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAuC;AAEhE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,eAAkB,IAAA,EAA6B;AAC7C,MAAA,IAAI,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAChC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,uBAAc,GAAA,EAAI;AAClB,QAAA,SAAA,CAAU,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,MAC7B;AACA,MAAA,OAAO,eAAkB,OAAO,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,kBAAkB,IAAA,EAA6B;AAC7C,MAAA,IAAI,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AACnC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,uBAAc,GAAA,EAAI;AAClB,QAAA,YAAA,CAAa,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,MAChC;AACA,MAAA,OAAO,kBAAkB,OAAO,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,UAAA,EAAY,MAAM,OAAA,CAAQ,OAAA,EAAQ;AAAA,IAClC,MAAM,KAAA,GAAQ;AACZ,MAAA,KAAA,MAAW,OAAA,IAAW,UAAU,MAAA,EAAO;AACrC,QAAA,OAAA,CAAQ,KAAA,EAAM;AAChB,MAAA,KAAA,MAAW,OAAA,IAAW,aAAa,MAAA,EAAO;AACxC,QAAA,OAAA,CAAQ,KAAA,EAAM;AAChB,MAAA,SAAA,CAAU,KAAA,EAAM;AAChB,MAAA,YAAA,CAAa,KAAA,EAAM;AAAA,IACrB;AAAA,GACF;AACF;;;ACxMA,IAAMnC,QAAAA,GAASD,KAAK,MAAA,CAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,CAAA;AAKhE,IAAI,cAAA,GAAiB,KAAA;AAErB,IAAI,aAAA,GAAiC,IAAA;AAErC,IAAI,UAAA,GAAmC,IAAA;AAEvC,IAAI,UAAA,GAAmC,IAAA;AAEvC,IAAI,gBAAA,GAA+C,IAAA;AAEnD,IAAI,gBAAA,GAA+C,IAAA;AAEnD,IAAI,gBAAA,GAA+C,IAAA;AAEnD,IAAI,UAAA,GAAmC,IAAA;AAEvC,IAAI,gBAAA,GAA+C,IAAA;AAEnD,IAAI,aAAA,GAAyC,IAAA;AAE7C,IAAI,cAAA,GAA2C,IAAA;AAE/C,IAAI,cAAA,GAA2C,IAAA;AAE/C,IAAI,YAAA,GAAuC,IAAA;AAE3C,IAAI,cAAA,GAA2C,IAAA;AAE/C,IAAI,eAAA,GAA6C,IAAA;AAEjD,IAAI,aAAA,GAAyC,IAAA;AAE7C,IAAI,WAAA,GAAqC,IAAA;AAEzC,IAAI,YAAA,GAAuC,IAAA;AAE3C,IAAI,gBAAA;AAEJ,IAAI,cAAA,GAAuC,IAAA;AAE3C,IAAI,oBAAA,GAA+C,IAAA;AAKnD,IAAM,cAAA,GAAiBA,KAAK,MAAA,CAAO,uBAAA;AAAA,EACjC,UAAA,CAAW,eAAA;AAAA,EACX,MAAM,IAAI,mBAAmB;AAC/B,CAAA;AASA,IAAM,iBAAA,GAAmC;AAAA,EACvC,MAAM,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EACnD,OAAO,UAAA,GAAa;AAClB,IAAA,MAAM,eAAe,KAAA,EAAM;AAAA,EAC7B,CAAA;AAAA,EACA,YAAY,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EACzD,YAAY,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EACzD,cAAc,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EAC3D,KAAK,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EAClD,OAAO,SAAA,GAAY;AACjB,IAAA,MAAM,eAAe,KAAA,EAAM;AAAA,EAC7B,CAAA;AAAA,EACA,gBAAgB,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ;AAC/D,CAAA;AAGA,IAAM,iBAAA,GAAmC;AAAA,EACvC,YAAA,EAAc,MAAM,cAAA,CAAe,MAAA,EAAO;AAAA,EAC1C,gBAAA,EAAkB,MAAM,cAAA,CAAe,MAAA,EAAO;AAAA,EAC9C,cAAA,EAAgB,MAAM,cAAA,CAAe,MAAA,EAAO;AAAA,EAC5C,UAAU,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EACvD,cAAc,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EAC3D,WAAW,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ;AAC1D,CAAA;AAGA,IAAM,uBAAA,GAA0B,eAAe,KAAA,EAA2B;AAG1E,IAAM,uBAAA,GAA+C;AAAA,EACnD,KAAK,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EAClD,OAAO,SAAA,GAAY;AAAE,IAAA,MAAM,eAAe,KAAA,EAAM;AAAA,EAAE;AACpD,CAAA;AAGA,IAAM,uBAAA,GAA+C;AAAA,EACnD,WAAW,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EACxD,cAAc,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EAC3D,WAAA,EAAa,MAAM,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,EACrC,UAAU,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ;AACzD,CAAA;AAGA,IAAM,iBAAA,GAAmC;AAAA,EACvC,OAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EACpD,OAAO,WAAA,GAAc;AAAE,IAAA,MAAM,eAAe,KAAA,EAAM;AAAA,EAAE;AACtD,CAAA;AAGA,IAAM,uBAAA,GAA0B,eAAe,KAAA,EAA2B;AAG1E,IAAM,oBAAA,GAAuB,eAAe,KAAA,EAAwB;AAGpE,IAAM,qBAAA,GAAwB,eAAe,KAAA,EAAyB;AAQtE,IAAM,mBAAA,GAAuC;AAAA,EAC3C,cAAc,MAAM;AAAE,IAAA,MAAM,eAAe,KAAA,EAAM;AAAA,EAAE,CAAA;AAAA,EACnD,kBAAkB,MAAM;AAAE,IAAA,MAAM,eAAe,KAAA,EAAM;AAAA,EAAE;AACzD,CAAA;AAGA,IAAM,qBAAA,GAAwB,eAAe,KAAA,EAAyB;AAGtE,IAAM,sBAAA,GAAyB,eAAe,KAAA,EAA0B;AAGxE,IAAM,qBAAA,GAA2C;AAAA,EAC/C,aAAA,EAAe,MAAM,cAAA,CAAe,MAAA,EAAO;AAAA,EAC3C,gBAAgB,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EAC7D,cAAc,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EAC3D,eAAe,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EAC5D,eAAe,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ;AAC9D,CAAA;AAGA,IAAM,oBAAA,GAAuB,eAAe,KAAA,EAAwB;AAGpE,IAAM,kBAAA,GAAqB,eAAe,KAAA,EAAsB;AAQhE,IAAM,mBAAA,GAAuC;AAAA,EAC3C,YAAY,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EACzD,OAAO,gBAAA,GAAmB;AAAE,IAAA,MAAM,eAAe,KAAA,EAAM;AAAA,EAAE,CAAA;AAAA,EACzD,YAAY,MAAM,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,QAAQ,CAAA;AAAA,EACzD,OAAO,gBAAA,GAAmB;AAAE,IAAA,MAAM,eAAe,KAAA,EAAM;AAAA,EAAE,CAAA;AAAA,EACzD,eAAA,EAAiB,MAAM,cAAA,CAAe,MAAA;AACxC,CAAA;AAGA,IAAM,oBAAmC,kBAAA,CAAmB;AAAA,EAC1D,aAAA,EAAe,MAAM,aAAA,KAAkB,IAAA;AAAA,EACvC,YAAA,EAAc,MAAM,gBAAA,IAAoB,IAAA;AAAA,EACxC,YAAY,MAAM,cAAA;AAAA,EAClB,UAAA,EAAY,CAAC,IAAA,KAAS;AAAE,IAAA,cAAA,GAAiB,IAAA;AAAA,EAAK,CAAA;AAAA,EAC9C,kBAAkB,MAAM,oBAAA;AAAA,EACxB,oBAAA,EAAsB,MAAM,cAAA,CAAe,MAAA;AAC7C,CAAC,CAAA;AAKD,eAAe,aAAA,GAA+B;AAC5C,EAAA,MAAM,aAAA,GAAgB,oBAAA;AAEtB,EAAA,UAAA,GAAa,IAAA;AACb,EAAA,UAAA,GAAa,IAAA;AACb,EAAA,gBAAA,GAAmB,IAAA;AACnB,EAAA,gBAAA,GAAmB,IAAA;AACnB,EAAA,gBAAA,GAAmB,IAAA;AACnB,EAAA,UAAA,GAAa,IAAA;AACb,EAAA,gBAAA,GAAmB,IAAA;AACnB,EAAA,aAAA,GAAgB,IAAA;AAChB,EAAA,cAAA,GAAiB,IAAA;AACjB,EAAA,YAAA,GAAe,IAAA;AACf,EAAA,cAAA,GAAiB,IAAA;AACjB,EAAA,eAAA,GAAkB,IAAA;AAClB,EAAA,cAAA,GAAiB,IAAA;AACjB,EAAA,aAAA,GAAgB,IAAA;AAChB,EAAA,WAAA,GAAc,IAAA;AACd,EAAA,YAAA,GAAe,IAAA;AACf,EAAA,gBAAA,GAAmB,MAAA;AACnB,EAAA,cAAA,GAAiB,IAAA;AACjB,EAAA,oBAAA,GAAuB,IAAA;AACvB,EAAA,aAAA,GAAgB,IAAA;AAEhB,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,cAAc,KAAA,EAAM;AAAA,IAC5B,SACO,KAAA,EAAO;AACZ,MAAAC,QAAAA,CAAO,KAAA,CAAM,gCAAA,EAAkC,EAAE,OAAO,CAAA;AAAA,IAC1D;AAAA,EACF;AACF;AAIA,IAAM,eAAA,GAAmC;AAAA,EACvC,MAAA,EAAQ,UAAA;AAAA,EACR,cAAA,EAAgB;AAClB,CAAA;AAEA,IAAM,gBAAA,GAAqC;AAAA,EACzC,eAAA,EAAiB,qBAAA;AAAA,EACjB,OAAA,EAAS,aAAA;AAAA,EACT,gBAAA;AAAA,EACA;AACF,CAAA;AAuBO,IAAM,EAAA,GAAkB;AAAA,EAC7B,MAAM,IAAA,CAAK,MAAA,EAAwB,OAAA,EAAmD;AAEpF,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAAA,QAAAA,CAAO,KAAK,uDAAuD,CAAA;AACnE,MAAA,OAAOI,GAAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,GAAA,CAAI,mBAAmB,CAAC,CAAA;AAAA,IAClE;AACA,IAAA,cAAA,GAAiB,IAAA;AAEjB,IAAA,IAAI;AAEF,MAAA,IAAI,aAAA,EAAe;AACjB,QAAAJ,QAAAA,CAAO,KAAK,kDAAkD,CAAA;AAC9D,QAAA,MAAM,GAAG,KAAA,EAAM;AAAA,MACjB;AAEA,MAAAA,QAAAA,CAAO,KAAK,wBAAwB,CAAA;AAEpC,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,SAAA,CAAU,MAAA,IAAU,EAAE,CAAA;AACzD,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,QAAAA,QAAAA,CAAO,MAAM,6BAAA,EAA+B,EAAE,OAAO,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA;AAChF,QAAA,OAAOI,GAAAA;AAAA,UACL,UAAA,CAAW,mBAAA;AAAA,UACX,GAAA,CAAI,gBAAA,EAAkB,EAAE,MAAA,EAAQ,EAAE,OAAO,WAAA,CAAY,KAAA,CAAM,OAAA,EAAQ,EAAG,CAAA;AAAA,UACtE,WAAA,CAAY;AAAA,SACd;AAAA,MACF;AACA,MAAA,MAAM,SAAS,WAAA,CAAY,IAAA;AAI3B,MAAA,IAAI,aAAA;AACJ,MAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,QAAA,aAAA,GAAgB,OAAA,CAAQ,aAAA;AAAA,MAC1B,CAAA,MAAA,IACS,oBAAmB,EAAG;AAC7B,QAAA,aAAA,GAAgB,gCAAA,EAAiC;AAAA,MACnD,CAAA,MACK;AACH,QAAA,aAAA,GAAgB,yBAAA,EAA0B;AAC1C,QAAAJ,QAAAA,CAAO,KAAK,4GAA4G,CAAA;AAAA,MAC1H;AACA,MAAA,oBAAA,GAAuB,aAAA;AAGvB,MAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,MAAA,EAAQ;AAAA,QAC5C,aAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,UAAA,GAAa,IAAA,CAAK,GAAA;AAClB,MAAA,UAAA,GAAa,IAAA,CAAK,GAAA;AAClB,MAAA,gBAAA,GAAmB,IAAA,CAAK,SAAA;AACxB,MAAA,gBAAA,GAAmB,IAAA,CAAK,SAAA;AACxB,MAAA,aAAA,GAAgB,IAAA,CAAK,MAAA;AACrB,MAAA,gBAAA,GAAmB,IAAA,CAAK,SAAA;AACxB,MAAA,UAAA,GAAa,IAAA,CAAK,GAAA;AAClB,MAAA,gBAAA,GAAmB,IAAA,CAAK,SAAA;AACxB,MAAA,aAAA,GAAgB,IAAA,CAAK,MAAA;AACrB,MAAA,cAAA,GAAiB,IAAA,CAAK,OAAA;AACtB,MAAA,YAAA,GAAe,IAAA,CAAK,KAAA;AACpB,MAAA,cAAA,GAAiB,IAAA,CAAK,OAAA;AACtB,MAAA,eAAA,GAAkB,IAAA,CAAK,QAAA;AACvB,MAAA,cAAA,GAAiB,IAAA,CAAK,OAAA;AACtB,MAAA,WAAA,GAAc,IAAA,CAAK,IAAA;AACnB,MAAA,YAAA,GAAe,IAAA,CAAK,KAAA;AAEpB,MAAA,gBAAA,GAAmB,MAAA,CAAO,GAAA;AAE1B,MAAA,aAAA,GAAgB,MAAA;AAChB,MAAAA,QAAAA,CAAO,KAAK,uBAAA,EAAyB,EAAE,OAAO,MAAA,CAAO,GAAA,EAAK,OAAO,CAAA;AACjE,MAAA,OAAOG,GAAG,KAAA,CAAS,CAAA;AAAA,IACrB,SACO,KAAA,EAAO;AAEZ,MAAA,MAAM,aAAA,EAAc;AACpB,MAAAH,QAAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,EAAE,OAAO,CAAA;AACzD,MAAA,OAAOI,GAAAA;AAAA,QACL,UAAA,CAAW,mBAAA;AAAA,QACX,IAAI,eAAA,EAAiB;AAAA,UACnB,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA;AAAE,SAChC,CAAA;AAAA,QACD;AAAA,OACF;AAAA,IACF,CAAA,SACA;AACE,MAAA,cAAA,GAAiB,KAAA;AAAA,IACnB;AAAA,EACF,CAAA;AAAA,EAEA,IAAI,GAAA,GAAqB;AAAE,IAAA,OAAO,UAAA,IAAc,iBAAA;AAAA,EAAkB,CAAA;AAAA,EAClE,IAAI,GAAA,GAAqB;AAAE,IAAA,OAAO,UAAA,IAAc,iBAAA;AAAA,EAAkB,CAAA;AAAA,EAClE,IAAI,KAAA,GAAyB;AAAE,IAAA,OAAO,eAAA;AAAA,EAAgB,CAAA;AAAA,EACtD,IAAI,MAAA,GAA2B;AAAE,IAAA,OAAO,gBAAA;AAAA,EAAiB,CAAA;AAAA,EACzD,IAAI,SAAA,GAAiC;AAAE,IAAA,OAAO,gBAAA,IAAoB,uBAAA;AAAA,EAAwB,CAAA;AAAA,EAC1F,IAAI,SAAA,GAAiC;AAAE,IAAA,OAAO,gBAAA,IAAoB,uBAAA;AAAA,EAAwB,CAAA;AAAA,EAC1F,IAAI,SAAA,GAAiC;AAAE,IAAA,OAAO,gBAAA,IAAoB,uBAAA;AAAA,EAAwB,CAAA;AAAA,EAC1F,IAAI,GAAA,GAAqB;AAAE,IAAA,OAAO,UAAA,IAAc,iBAAA;AAAA,EAAkB,CAAA;AAAA,EAClE,IAAI,SAAA,GAAiC;AAAE,IAAA,OAAO,gBAAA,IAAoB,uBAAA;AAAA,EAAwB,CAAA;AAAA,EAC1F,IAAI,MAAA,GAA2B;AAAE,IAAA,OAAO,aAAA,IAAiB,oBAAA;AAAA,EAAqB,CAAA;AAAA,EAC9E,IAAI,OAAA,GAA6B;AAAE,IAAA,OAAO,cAAA,IAAkB,qBAAA;AAAA,EAAsB,CAAA;AAAA,EAClF,IAAI,KAAA,GAAyB;AAAE,IAAA,OAAO,YAAA,IAAgB,mBAAA;AAAA,EAAoB,CAAA;AAAA,EAC1E,IAAI,OAAA,GAA6B;AAAE,IAAA,OAAO,cAAA,IAAkB,qBAAA;AAAA,EAAsB,CAAA;AAAA,EAClF,IAAI,QAAA,GAA+B;AAAE,IAAA,OAAO,eAAA,IAAmB,sBAAA;AAAA,EAAuB,CAAA;AAAA,EACtF,IAAI,OAAA,GAA6B;AAAE,IAAA,OAAO,cAAA,IAAkB,qBAAA;AAAA,EAAsB,CAAA;AAAA,EAClF,IAAI,MAAA,GAA2B;AAAE,IAAA,OAAO,aAAA,IAAiB,oBAAA;AAAA,EAAqB,CAAA;AAAA,EAC9E,IAAI,IAAA,GAAuB;AAAE,IAAA,OAAO,WAAA,IAAe,kBAAA;AAAA,EAAmB,CAAA;AAAA,EACtE,IAAI,KAAA,GAAyB;AAAE,IAAA,OAAO,YAAA,IAAgB,mBAAA;AAAA,EAAoB,CAAA;AAAA,EAC1E,IAAI,GAAA,GAAqB;AAAE,IAAA,OAAO,iBAAA;AAAA,EAAkB,CAAA;AAAA,EACpD,IAAI,MAAA,GAAS;AAAE,IAAA,OAAO,aAAA,GAAgBL,IAAAA,CAAK,QAAA,CAAS,uBAAA,CAAwB,aAAa,CAAA,GAAI,IAAA;AAAA,EAAK,CAAA;AAAA,EAClG,IAAI,aAAA,GAAgB;AAAE,IAAA,OAAO,aAAA,KAAkB,IAAA;AAAA,EAAK,CAAA;AAAA,EAEpD,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAAC,QAAAA,CAAO,KAAK,oCAAoC,CAAA;AAChD,MAAA;AAAA,IACF;AAEA,IAAAA,QAAAA,CAAO,KAAK,mBAAmB,CAAA;AAC/B,IAAA,MAAM,aAAA,EAAc;AACpB,IAAAA,QAAAA,CAAO,KAAK,kBAAkB,CAAA;AAAA,EAChC;AACF;AChXO,SAAS,gBAAgB,OAAA,EAAsC;AACpE,EAAA,OAAO,IAAI,SAAA;AAAA,IACT,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAM,OAAA,EAAS,OAAA,CAAQ,WAAW,OAAA;AAAQ,GAC5D;AACF","file":"index.js","sourcesContent":["/**\n * @h-ai/ai — A2A Server 创建与传输层\n *\n * 基于 `@a2a-js/sdk/server` 封装,提供便捷的 A2A 服务器创建和 SDK 再导出。\n * @module ai-a2a-server\n */\n\nimport type { AgentCard } from '@a2a-js/sdk'\n\nimport type { A2AAgentCardConfig } from './ai-a2a-types.js'\n\n// ─── SDK Server 类型导出 ───\n\n// 仅重导出应用层实现 executor 所需的类型;运行时 SDK 类由 ai.a2a 内部封装,避免暴露额外装配细节。\n\nexport type {\n AgentExecutionEvent,\n AgentExecutor,\n ExecutionEventBus,\n ExecutionEventBusManager,\n PushNotificationSender,\n PushNotificationStore,\n ServerCallContext,\n TaskStore,\n} from '@a2a-js/sdk/server'\n\n// ─── 便捷工厂 ───\n\n/**\n * 从简化配置构建符合 SDK 规范的 AgentCard 对象\n *\n * @param config - 应用层提供的 Agent Card 配置\n * @returns 完整的 AgentCard 对象(可传给 DefaultRequestHandler)\n *\n * @example\n * ```ts\n * import { buildAgentCard } from '@h-ai/ai'\n *\n * const card = buildAgentCard({\n * name: 'my-agent',\n * description: 'An example agent',\n * url: 'https://example.com',\n * skills: [{ id: 'chat', name: 'Chat', description: 'General chat' }],\n * })\n * ```\n */\nexport function buildAgentCard(config: A2AAgentCardConfig): AgentCard {\n const card: AgentCard = {\n name: config.name,\n description: config.description ?? '',\n url: config.url,\n version: config.version ?? '1.0.0',\n protocolVersion: '0.3.0',\n defaultInputModes: ['text'],\n defaultOutputModes: ['text'],\n capabilities: {},\n skills: (config.skills ?? []).map(s => ({\n id: s.id,\n name: s.name,\n description: s.description ?? '',\n tags: s.tags ?? [],\n })),\n }\n\n // 声明安全认证方案到 Agent Card\n if (config.security?.apiKey) {\n const { in: location, name } = config.security.apiKey\n card.securitySchemes = {\n apiKey: { type: 'apiKey', in: location, name },\n }\n card.security = [{ apiKey: [] }]\n }\n\n return card\n}\n","/**\n * @h-ai/ai — A2A 子功能组装\n *\n * 实现 A2A 操作接口:RelDB 持久化 TaskStore、消息日志、远端调用。\n * 包含延迟初始化代理工厂(`createA2ALazyProxy`)和完整操作实例工厂(`createA2AOperations`)。\n * @module ai-a2a-functions\n */\n\nimport type { Message, Task } from '@a2a-js/sdk'\nimport type { AgentExecutor, ExecutionEventBus, ServerCallContext, TaskStore } from '@a2a-js/sdk/server'\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { A2AConfig } from '../ai-config.js'\n\nimport type { AIRelStore, AIStoreProvider } from '../store/ai-store-types.js'\nimport type {\n A2AAgentCardConfig,\n A2ACallOptions,\n A2ACallResult,\n A2AHandleResult,\n A2AMessageRecord,\n A2AOperations,\n A2ATaskFilter,\n} from './ai-a2a-types.js'\n\nimport { A2AClient } from '@a2a-js/sdk/client'\nimport { DefaultExecutionEventBusManager, DefaultRequestHandler, JsonRpcTransportHandler, ServerCallContext as ServerCallContextImpl } from '@a2a-js/sdk/server'\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { buildAgentCard } from './ai-a2a-server.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'a2a' })\nconst DEFAULT_A2A_CALL_TIMEOUT_MS = 60_000\n\ninterface ValidatedRemoteUrl {\n requestUrl: string\n safeLabel: string\n}\n\n/**\n * 校验远端 Agent URL 的基础边界。\n *\n * A2A 目标通常来自服务端配置;这里拒绝非 HTTP(S) 协议和 URL 内嵌凭据,\n * 并生成不含 query/hash 的安全标签用于错误与持久化记录。部署侧仍应对可访问 origin\n * 使用白名单,因为 DNS 解析与重定向策略属于应用网络边界。\n */\nfunction validateRemoteUrl(remoteUrl: string): ValidatedRemoteUrl {\n const parsed = new URL(remoteUrl)\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')\n throw new Error('A2A remote URL must use HTTP or HTTPS')\n if (parsed.username || parsed.password)\n throw new Error('A2A remote URL must not contain credentials')\n\n return {\n requestUrl: parsed.toString(),\n safeLabel: `${parsed.origin}${parsed.pathname}`,\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' ? value as Record<string, unknown> : undefined\n}\n\nfunction isAgentMessageEvent(event: unknown): event is { role: 'agent', parts?: unknown[] } {\n const record = asRecord(event)\n return record?.role === 'agent' && (record.parts === undefined || Array.isArray(record.parts))\n}\n\nfunction isTaskResult(value: unknown): value is Task {\n return asRecord(value)?.status !== undefined\n}\n\nfunction isMessageResult(value: unknown): value is Message {\n return Array.isArray(asRecord(value)?.parts)\n}\n\nfunction getPartText(part: unknown): string | undefined {\n const record = asRecord(part)\n return typeof record?.text === 'string' ? record.text : undefined\n}\n\nfunction getTextParts(parts: readonly unknown[] | undefined): string[] {\n return parts?.map(getPartText).filter((text): text is string => text != null) ?? []\n}\n\nasync function executeRemoteAgentCall(\n remoteUrl: string,\n message: string,\n options?: A2ACallOptions,\n): Promise<HaiResult<A2ACallResult>> {\n let safeLabel = '(invalid or unavailable URL)'\n try {\n const validatedUrl = validateRemoteUrl(remoteUrl)\n const requestUrl = validatedUrl.requestUrl\n safeLabel = validatedUrl.safeLabel\n const customHeaders = options?.headers\n const timeoutMs = Math.max(1, options?.timeout ?? DEFAULT_A2A_CALL_TIMEOUT_MS)\n const client = new A2AClient(requestUrl, {\n fetchImpl: ((input: RequestInfo | URL, init?: RequestInit) => {\n const existingHeaders = init?.headers\n ? Object.fromEntries(new Headers(init.headers as HeadersInit).entries())\n : {}\n const signals = [init?.signal, AbortSignal.timeout(timeoutMs)].filter((signal): signal is AbortSignal => Boolean(signal))\n const fetchInit: RequestInit = {\n ...init,\n headers: { ...existingHeaders, ...customHeaders },\n signal: signals.length > 1 ? AbortSignal.any(signals) : signals[0],\n }\n return globalThis.fetch(input, fetchInit)\n }) as typeof fetch,\n })\n const params: { message: Message } = {\n message: {\n kind: 'message',\n messageId: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,\n role: 'user',\n parts: [{ kind: 'text', text: message }],\n },\n }\n\n const response = await client.sendMessage(params)\n if ('error' in response) {\n return err(HaiAIError.A2A_REMOTE_CALL_FAILED, aiM('ai_a2aRemoteCallFailed', { params: { url: safeLabel, error: 'Remote agent returned an error' } }))\n }\n\n const responseData = response.result\n let result: A2ACallResult\n if (isTaskResult(responseData)) {\n const textParts = responseData.artifacts?.flatMap(artifact => getTextParts(artifact.parts)) ?? []\n result = {\n taskId: responseData.id,\n taskState: responseData.status?.state,\n responseText: textParts.join('\\n') || undefined,\n responseParts: responseData.artifacts?.flatMap(artifact => artifact.parts ?? []),\n }\n }\n else if (isMessageResult(responseData)) {\n const textParts = getTextParts(responseData.parts)\n result = {\n responseText: textParts.join('\\n') || undefined,\n responseParts: responseData.parts,\n }\n }\n else {\n result = {}\n }\n\n return ok(result)\n }\n catch (error) {\n const errorName = error instanceof Error ? error.name : 'UnknownError'\n return err(HaiAIError.A2A_REMOTE_CALL_FAILED, aiM('ai_a2aRemoteCallFailed', { params: { url: safeLabel, error: errorName } }))\n }\n}\n\n// ─── RelDB 持久化 TaskStore ───\n\n/**\n * 基于 ReldbAIStore 的 A2A TaskStore 实现\n *\n * 将 SDK 的 Task 对象桥接到 RelDB 存储,利用 status 和 refId 索引列\n * 实现按状态和上下文查询。\n */\nexport class ReldbA2ATaskStore implements TaskStore {\n constructor(private readonly store: AIRelStore<Task>) {}\n\n async save(task: Task, _context?: ServerCallContext): Promise<void> {\n await this.store.save(task.id, task, {\n objectId: task.contextId,\n status: task.status?.state,\n refId: task.contextId,\n })\n }\n\n async load(taskId: string, _context?: ServerCallContext): Promise<Task | undefined> {\n return this.store.get(taskId)\n }\n}\n\n// ─── A2A 消息日志拦截器 ───\n\n/**\n * 创建带消息日志的 AgentExecutor 包装器\n *\n * 在真实 AgentExecutor.execute 前后记录入站消息和出站响应到 messageStore。\n */\nfunction wrapExecutorWithLogging(\n executor: AgentExecutor,\n messageStore: AIRelStore<A2AMessageRecord>,\n): AgentExecutor {\n return {\n async execute(requestContext, eventBus) {\n // 记录入站消息\n const inboundRecord: A2AMessageRecord = {\n id: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,\n taskId: requestContext.taskId,\n role: 'user',\n parts: requestContext.userMessage.parts ?? [],\n createdAt: Date.now(),\n }\n messageStore.save(inboundRecord.id, inboundRecord, { objectId: requestContext.taskId, status: 'user' })\n .catch(e => logger.warn('Failed to save inbound A2A message', { error: e }))\n\n // 监听出站事件并记录\n const originalPublish = eventBus.publish.bind(eventBus)\n const wrappedBus: ExecutionEventBus = Object.create(eventBus)\n wrappedBus.publish = (event) => {\n // SDK 未提供 ExecutionEvent 的类型守卫;先做最小运行时判别,再记录 agent 消息。\n if (isAgentMessageEvent(event)) {\n const outboundRecord: A2AMessageRecord = {\n id: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,\n taskId: requestContext.taskId,\n role: 'agent',\n parts: event.parts ?? [],\n createdAt: Date.now(),\n }\n messageStore.save(outboundRecord.id, outboundRecord, { objectId: requestContext.taskId, status: 'agent' })\n .catch(e => logger.warn('Failed to save outbound A2A message', { error: e }))\n }\n originalPublish(event)\n }\n\n await executor.execute(requestContext, wrappedBus)\n },\n async cancelTask(taskId, eventBus) {\n await executor.cancelTask(taskId, eventBus)\n },\n }\n}\n\n// ─── 工厂函数 ───\n\n/** A2A 子功能组装依赖 */\nexport interface A2ADeps {\n storeProvider: AIStoreProvider\n}\n\n/** A2A 子功能配置 */\nexport interface A2ACreateOptions {\n /** Agent Card 配置 */\n agentCard: A2AAgentCardConfig\n /** Agent 执行器(由应用层实现) */\n executor: AgentExecutor\n}\n\n/**\n * 创建 A2A 操作接口实例\n *\n * 组装 TaskStore、RequestHandler、消息日志、远端调用等能力。\n */\nexport function createA2AOperations(\n options: A2ACreateOptions,\n deps: A2ADeps,\n): A2AOperations {\n const { storeProvider } = deps\n const agentCardConfig = options.agentCard\n\n // 创建持久化存储\n const taskStore = storeProvider.createRelStore<Task>('hai_ai_a2a_tasks', {\n hasObjectId: true,\n hasStatus: true,\n hasRefId: true,\n })\n const messageStore = storeProvider.createRelStore<A2AMessageRecord>('hai_ai_a2a_messages', {\n hasObjectId: true,\n hasStatus: true,\n })\n\n // 构建 SDK 层\n const agentCard = buildAgentCard(agentCardConfig)\n const a2aTaskStore = new ReldbA2ATaskStore(taskStore)\n const wrappedExecutor = wrapExecutorWithLogging(options.executor, messageStore)\n const eventBusManager = new DefaultExecutionEventBusManager()\n const requestHandler = new DefaultRequestHandler(agentCard, a2aTaskStore, wrappedExecutor, eventBusManager)\n const transportHandler = new JsonRpcTransportHandler(requestHandler)\n\n return {\n registerExecutor() {\n logger.warn('A2A executor already registered, ignoring duplicate registerExecutor call')\n return ok(undefined)\n },\n\n getAgentCard() {\n return ok(agentCardConfig)\n },\n\n async handleRequest(requestBody: unknown, _context?: Record<string, unknown>): Promise<A2AHandleResult> {\n const serverContext = new ServerCallContextImpl()\n\n const result = await transportHandler.handle(requestBody, serverContext)\n\n // 判断是否为 AsyncGenerator(流式响应)\n if (result && typeof result === 'object' && Symbol.asyncIterator in result) {\n return {\n streaming: true,\n stream: result as AsyncGenerator<unknown, void, undefined>,\n }\n }\n\n return {\n streaming: false,\n body: result,\n }\n },\n\n async listMessages(filter: A2ATaskFilter) {\n try {\n const page = await messageStore.queryPage(\n {\n objectId: filter.contextId ?? filter.callerId,\n status: filter.status,\n orderBy: { field: 'createdAt' as keyof A2AMessageRecord, direction: 'desc' },\n },\n { offset: filter.offset ?? 0, limit: filter.limit ?? 50 },\n )\n return ok(page)\n }\n catch (error) {\n return err(HaiAIError.STORE_FAILED, aiM('ai_a2aListMessagesFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async callRemoteAgent(remoteUrl: string, message: string, options?: A2ACallOptions) {\n return executeRemoteAgentCall(remoteUrl, message, options)\n },\n }\n}\n\n// ─── 延迟初始化代理 ───\n\n/** 延迟代理的外部依赖(由 ai-main 注入状态访问器) */\nexport interface A2ALazyProxyDeps {\n /** 是否已初始化(即 currentConfig !== null) */\n isInitialized: () => boolean\n /** 获取 A2A 配置(config.a2a) */\n getA2AConfig: () => A2AConfig | null\n /** 获取当前 A2A 实现(registerExecutor 后才有值) */\n getA2AImpl: () => A2AOperations | null\n /** 保存 A2A 实现引用 */\n setA2AImpl: (impl: A2AOperations) => void\n /** 获取 StoreProvider(用于 createA2AOperations) */\n getStoreProvider: () => AIStoreProvider | null\n /** 未初始化错误工厂 */\n notInitializedResult: <T>() => HaiResult<T>\n}\n\n/**\n * 创建 A2A 延迟初始化代理\n *\n * `callRemoteAgent()` 是独立客户端能力,只需 `ai.init()`;`getAgentCard()` 可直接读取配置。\n * 只有服务端请求处理与消息查询依赖 `registerExecutor()`。\n *\n * @param deps - 由 ai-main 注入的状态访问器\n * @returns A2AOperations 代理对象\n */\nexport function createA2ALazyProxy(deps: A2ALazyProxyDeps): A2AOperations {\n return {\n registerExecutor(executor: AgentExecutor): HaiResult<void> {\n if (!deps.isInitialized()) {\n return deps.notInitializedResult()\n }\n const a2aConfig = deps.getA2AConfig()\n if (!a2aConfig) {\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured'))\n }\n if (deps.getA2AImpl()) {\n logger.warn('A2A executor already registered, re-registering')\n }\n const storeProvider = deps.getStoreProvider()\n if (!storeProvider) {\n return err(HaiAIError.STORE_FAILED, aiM('ai_internalError', { params: { error: 'StoreProvider not available' } }))\n }\n const agentCardWithSecurity = { ...a2aConfig.agentCard, security: a2aConfig.security }\n const impl = createA2AOperations(\n { agentCard: agentCardWithSecurity, executor },\n { storeProvider },\n )\n deps.setA2AImpl(impl)\n logger.info('A2A executor registered', { agentName: a2aConfig.agentCard.name })\n return ok(undefined)\n },\n\n getAgentCard() {\n const impl = deps.getA2AImpl()\n if (impl)\n return impl.getAgentCard()\n const a2aConfig = deps.getA2AConfig()\n if (a2aConfig)\n return ok({ ...a2aConfig.agentCard, security: a2aConfig.security } as A2AAgentCardConfig)\n if (!deps.isInitialized())\n return deps.notInitializedResult()\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured'))\n },\n\n async handleRequest(requestBody: unknown, context?: Record<string, unknown>) {\n const impl = deps.getA2AImpl()\n if (impl)\n return impl.handleRequest(requestBody, context)\n if (!deps.isInitialized())\n return deps.notInitializedResult() as never\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured')) as never\n },\n\n async listMessages(filter) {\n const impl = deps.getA2AImpl()\n if (impl)\n return impl.listMessages(filter)\n if (!deps.isInitialized())\n return deps.notInitializedResult()\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured'))\n },\n\n async callRemoteAgent(remoteUrl, message, options) {\n const impl = deps.getA2AImpl()\n if (impl)\n return impl.callRemoteAgent(remoteUrl, message, options)\n if (!deps.isInitialized())\n return deps.notInitializedResult()\n return executeRemoteAgentCall(remoteUrl, message, options)\n },\n }\n}\n","/**\n * @h-ai/ai — Audio Provider 内部接口与共享传输辅助\n *\n * 定义 audio 子系统内部的协议适配接口 `AudioProvider`,以及各 Provider 复用的\n * Node WebSocket 连接、Base64、取消等底层辅助。这些类型与函数是 audio 子系统内部实现,\n * 不从 `@h-ai/ai` 根入口导出,也不作为模块消费者需要了解的概念。\n * @internal\n * @module audio/providers/ai-audio-provider\n */\n\nimport type { HaiError, HaiErrorDef, HaiResult } from '@h-ai/core'\n\nimport type { ResolvedAudioModel } from '../../ai-config.js'\nimport type {\n AudioContent,\n AudioFormat,\n AudioInputStream,\n AudioModelCapabilities,\n SynthesisResult,\n TranscriptionEvent,\n TranscriptionResult,\n} from '../ai-audio-types.js'\n\nimport { Buffer } from 'node:buffer'\nimport { core } from '@h-ai/core'\nimport WebSocket from 'ws'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\n\n// ─── Provider 请求类型(已解析模型 + 公共请求字段) ───\n\n/** Provider 层完整识别请求 */\nexport interface ProviderTranscriptionRequest {\n /** 已解析模型配置 */\n model: ResolvedAudioModel\n /** 完整音频 */\n audio: AudioContent\n /** 语言提示 */\n language?: string\n /** 领域提示词 / 热词 */\n contextHints?: string[]\n /** 取消信号 */\n signal?: AbortSignal\n}\n\n/** Provider 层流式识别请求 */\nexport interface ProviderTranscriptionStreamRequest {\n /** 已解析模型配置 */\n model: ResolvedAudioModel\n /** 完整音频或持续音频输入流 */\n audio: AudioContent | AudioInputStream\n /** 语言提示 */\n language?: string\n /** 领域提示词 / 热词 */\n contextHints?: string[]\n /** 取消信号 */\n signal?: AbortSignal\n}\n\n/** Provider 层完整合成请求 */\nexport interface ProviderSynthesisRequest {\n /** 已解析模型配置 */\n model: ResolvedAudioModel\n /** 待合成文本 */\n text: string\n /** 音色 */\n voice?: string\n /** 自然语言风格指令 */\n instruction?: string\n /** 输出格式 */\n format?: AudioFormat\n /** 输出采样率 */\n sampleRate?: number\n /** 取消信号 */\n signal?: AbortSignal\n}\n\n/** Provider 层流式合成请求 */\nexport interface ProviderSynthesisStreamRequest {\n /** 已解析模型配置 */\n model: ResolvedAudioModel\n /** 完整文本或持续文本流 */\n text: string | AsyncIterable<string>\n /** 音色 */\n voice?: string\n /** 自然语言风格指令 */\n instruction?: string\n /** 输出格式 */\n format?: AudioFormat\n /** 输出采样率 */\n sampleRate?: number\n /** 取消信号 */\n signal?: AbortSignal\n}\n\n/**\n * Provider 解析后的最终输出音频元数据\n *\n * 不同平台对未指定格式时的默认值不同(如 OpenAI 默认 mp3、Qwen/Doubao/MiMo 默认 pcm16),\n * 由各 Provider 依据自身规则解析,供流式合成在 `segment_started` 标注真实格式,\n * 避免调用方根据请求参数猜测导致解码 / 播放参数错误。\n */\nexport interface SynthesisOutputMeta {\n /** 最终输出音频格式 */\n format: AudioFormat\n /** 采样率(Hz);pcm16 等裸音频必填,wav / mp3 等自描述格式为 undefined */\n sampleRate?: number\n /** 声道数 */\n channels: 1 | 2\n}\n\n/**\n * Audio Provider 内部接口\n *\n * 每个平台一个实现,负责厂商协议转换、连接、响应解析与错误映射。\n * 使用工厂函数 + 闭包实现,不使用抽象基类。\n */\nexport interface AudioProvider {\n /** 完整语音识别 */\n transcribe: (request: ProviderTranscriptionRequest) => Promise<HaiResult<TranscriptionResult>>\n /** 流式语音识别 */\n transcribeStream: (request: ProviderTranscriptionStreamRequest) => AsyncIterable<TranscriptionEvent>\n /** 完整语音合成 */\n synthesize: (request: ProviderSynthesisRequest) => Promise<HaiResult<SynthesisResult>>\n /** 流式语音合成 */\n synthesizeStream: (request: ProviderSynthesisStreamRequest) => AsyncIterable<Uint8Array>\n /**\n * 解析该次合成请求的最终输出音频元数据(格式 / 采样率 / 声道)\n *\n * 与 `synthesizeStream` 采用一致的默认规则,供上层在 `segment_started` 标注真实格式。\n */\n resolveSynthesisOutput: (request: { format?: AudioFormat, sampleRate?: number }) => SynthesisOutputMeta\n /** 平台实时能力声明 */\n readonly capabilities: AudioModelCapabilities\n}\n\n/** 句子结束边界(中英标点 + 换行) */\nconst SENTENCE_BOUNDARY_REGEX = /[。!?;!?;\\n]|\\.(?=\\s|$)/\n\n/**\n * 将持续到达的文本流按句子边界切分,边到达边产出完整短句。\n *\n * 供不原生支持增量文本输入的 TTS 平台(OpenAI / MiMo)使用:以句子级分段逐句发起合成,\n * 实现近似实时的首音低延迟,而非等待整段文本生成完毕(消除“虚假增量”语义)。\n */\nexport async function* streamSentences(stream: AsyncIterable<string>): AsyncIterable<string> {\n let buffer = ''\n for await (const part of stream) {\n buffer += part\n let match = SENTENCE_BOUNDARY_REGEX.exec(buffer)\n while (match !== null) {\n const end = match.index + match[0].length\n const sentence = buffer.slice(0, end).trim()\n buffer = buffer.slice(end)\n if (sentence)\n yield sentence\n match = SENTENCE_BOUNDARY_REGEX.exec(buffer)\n }\n }\n const rest = buffer.trim()\n if (rest)\n yield rest\n}\n\n// ─── Base64 辅助 ───\n\n/** 将二进制数据编码为 Base64 字符串 */\nexport function toBase64(data: Uint8Array): string {\n return Buffer.from(data).toString('base64')\n}\n\n/** 将 Base64 字符串解码为二进制数据 */\nexport function fromBase64(base64: string): Uint8Array {\n return new Uint8Array(Buffer.from(base64, 'base64'))\n}\n\n/** 顺序拼接多个二进制分片 */\nexport function concatChunks(chunks: Uint8Array[]): Uint8Array {\n return new Uint8Array(Buffer.concat(chunks.map(c => Buffer.from(c))))\n}\n\n/** 提取错误对象的简要消息(不含敏感请求体 / 凭据) */\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\n/**\n * 构造可抛出的 HaiError(供流式 async generator 在迭代期间抛出)\n *\n * @internal\n */\nexport function audioError(def: HaiErrorDef, message: string, cause?: unknown): HaiError {\n return core.error.buildHaiErrorInst(def, message, cause)\n}\n\n/**\n * 依据取消原因返回统一取消/超时错误(区分主动取消与超时)\n *\n * `AbortSignal.timeout()` 触发时 `signal.reason` 是 `TimeoutError`,映射为 `AUDIO_TIMEOUT`;\n * 其余主动取消映射为 `AUDIO_CANCELLED`。\n *\n * @internal\n */\nexport function audioAbortError(signal?: AbortSignal): HaiError {\n const reason = signal?.reason as { name?: string } | undefined\n if (reason?.name === 'TimeoutError')\n return audioError(HaiAIError.AUDIO_TIMEOUT, aiM('ai_audioTimeout'))\n return audioError(HaiAIError.AUDIO_CANCELLED, aiM('ai_audioCancelled'))\n}\n\n/**\n * 将流式迭代 / 请求抛出的错误映射为统一 HaiError\n *\n * - 已是领域 HaiError(取消/超时/连接/协议等)→ 原样返回,保留错误码\n * - fetch / SDK 的 `AbortError` / `TimeoutError` → 按取消原因映射 `AUDIO_CANCELLED` / `AUDIO_TIMEOUT`\n * - 其余 → `AUDIO_UPSTREAM_ERROR`\n *\n * @internal\n */\nexport function mapStreamError(error: unknown, signal?: AbortSignal): HaiError {\n const maybe = error as { code?: unknown, name?: unknown }\n if (typeof maybe.code === 'string' && maybe.code.startsWith('hai:ai:'))\n return error as HaiError\n if (maybe.name === 'AbortError' || maybe.name === 'TimeoutError')\n return audioAbortError(signal)\n return audioError(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: errorMessage(error) } }), error)\n}\n\n/**\n * 将流式迭代抛出的错误转换为 HaiResult(供非流式 transcribe/synthesize 复用底层流)\n *\n * @internal\n */\nexport function toAudioErrorResult<T>(error: unknown, signal?: AbortSignal): HaiResult<T> {\n return { success: false, error: mapStreamError(error, signal) }\n}\n\n// ─── Node WebSocket 连接辅助 ───\n\n/** WebSocket 收到的单条消息 */\nexport interface AudioWsMessage {\n /** 文本帧的字符串内容(`isBinary=false` 时有效) */\n text?: string\n /** 二进制帧内容(`isBinary=true` 时有效) */\n binary?: Uint8Array\n /** 是否为二进制帧 */\n isBinary: boolean\n}\n\n/** WebSocket 连接封装(隐藏 ws 事件模型,向 Provider 暴露异步迭代) */\nexport interface AudioWsConnection {\n /** 发送文本或二进制帧 */\n send: (data: string | Uint8Array) => void\n /** 按到达顺序异步迭代服务端消息,连接关闭时正常结束,出错时抛出 */\n messages: () => AsyncIterableIterator<AudioWsMessage>\n /** 主动关闭连接并释放资源 */\n close: () => void\n}\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-ws' })\n\n/**\n * 建立 Node WebSocket 连接\n *\n * 内部维护消息队列,将 ws 的事件模型转换为背压友好的异步迭代。连接失败或超时返回 rejected Promise。\n * 传入的 `signal` 触发时立即关闭连接并终止迭代。\n *\n * @internal\n */\nexport function openAudioWebSocket(\n url: string,\n headers: Record<string, string>,\n options?: { signal?: AbortSignal, timeout?: number },\n): Promise<AudioWsConnection> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(url, { headers, handshakeTimeout: options?.timeout ?? 15000 })\n ws.binaryType = 'arraybuffer'\n\n // 消息队列 + 等待者:经典异步队列,实现背压友好的 for await\n const queue: AudioWsMessage[] = []\n let waiting: ((result: IteratorResult<AudioWsMessage>) => void) | null = null\n let closed = false\n let opened = false\n let aborted = false\n let failure: Error | null = null\n\n const onSignalAbort = (): void => {\n aborted = true\n try {\n ws.close()\n }\n catch { /* 忽略 */ }\n }\n\n function settleClosed(): void {\n if (closed)\n return\n closed = true\n if (options?.signal)\n options.signal.removeEventListener('abort', onSignalAbort)\n if (waiting) {\n const w = waiting\n waiting = null\n w({ value: undefined, done: true })\n }\n }\n\n function pushMessage(msg: AudioWsMessage): void {\n if (waiting) {\n const w = waiting\n waiting = null\n w({ value: msg, done: false })\n }\n else {\n queue.push(msg)\n }\n }\n\n ws.on('message', (data: ArrayBuffer | Buffer, isBinary: boolean) => {\n if (isBinary) {\n const buf = Buffer.isBuffer(data) ? data : Buffer.from(data as ArrayBuffer)\n pushMessage({ isBinary: true, binary: new Uint8Array(buf) })\n }\n else {\n const text = Buffer.isBuffer(data) ? data.toString('utf8') : Buffer.from(data as ArrayBuffer).toString('utf8')\n pushMessage({ isBinary: false, text })\n }\n })\n\n ws.on('error', (error: Error) => {\n // open 之前出错视为连接建立失败,映射为 AUDIO_CONNECTION_FAILED\n if (!opened) {\n settleClosed()\n reject(audioError(HaiAIError.AUDIO_CONNECTION_FAILED, aiM('ai_audioConnectionFailed', { params: { error: error.message } }), error))\n return\n }\n failure = error\n logger.debug('Audio WebSocket error', { error: error.message })\n settleClosed()\n })\n\n ws.on('close', () => {\n settleClosed()\n })\n\n if (options?.signal) {\n if (options.signal.aborted)\n onSignalAbort()\n else\n options.signal.addEventListener('abort', onSignalAbort, { once: true })\n }\n\n ws.on('open', () => {\n opened = true\n const connection: AudioWsConnection = {\n send(data) {\n ws.send(data)\n },\n async* messages() {\n while (true) {\n if (queue.length > 0) {\n yield queue.shift() as AudioWsMessage\n continue\n }\n if (closed) {\n if (aborted)\n throw audioAbortError(options?.signal)\n if (failure)\n throw audioError(HaiAIError.AUDIO_CONNECTION_FAILED, aiM('ai_audioConnectionFailed', { params: { error: failure.message } }), failure)\n return\n }\n const next = await new Promise<IteratorResult<AudioWsMessage>>((res) => {\n waiting = res\n })\n if (next.done) {\n if (aborted)\n throw audioAbortError(options?.signal)\n if (failure)\n throw audioError(HaiAIError.AUDIO_CONNECTION_FAILED, aiM('ai_audioConnectionFailed', { params: { error: failure.message } }), failure)\n return\n }\n yield next.value\n }\n },\n close() {\n try {\n ws.close()\n }\n catch { /* 忽略 */ }\n },\n }\n resolve(connection)\n })\n })\n}\n","/**\n * @h-ai/ai — Audio Provider: 豆包 / 火山引擎实现\n *\n * 基于火山引擎二进制 WebSocket 协议实现语音识别与语音合成。协议编解码保留在本 Provider 内部:\n * - ASR(`/api/v3/sauc/bigmodel`):4 字节头 + payload_size + payload 的序列号协议。\n * - TTS(`/api/v3/tts/bidirection`):4 字节头 + event + [session_id] + payload_size + payload 的事件协议。\n *\n * 二进制协议整数字段均为大端。公共 API 不暴露协议版本、消息类型、序列号、事件号等细节。\n * @internal\n * @module audio/providers/ai-audio-provider-doubao\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ResolvedAudioModel } from '../../ai-config.js'\n\nimport type { AudioFormat, AudioModelCapabilities, SynthesisResult, TranscriptionEvent, TranscriptionResult } from '../ai-audio-types.js'\nimport type {\n AudioProvider,\n AudioWsMessage,\n ProviderSynthesisRequest,\n ProviderSynthesisStreamRequest,\n ProviderTranscriptionRequest,\n ProviderTranscriptionStreamRequest,\n SynthesisOutputMeta,\n} from './ai-audio-provider.js'\n\nimport { Buffer } from 'node:buffer'\nimport { gunzipSync } from 'node:zlib'\nimport { core, ok } from '@h-ai/core'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { audioError, concatChunks, errorMessage, openAudioWebSocket, toAudioErrorResult } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-doubao' })\n\n/** 豆包实时平台能力:WebSocket 实时识别(不产出服务端 VAD 起止事件)+ 实时合成(支持增量文本输入) */\nconst DOUBAO_CAPABILITIES: AudioModelCapabilities = {\n transcribe: { supported: true, realtimeAudioInput: true, speechBoundaryEvents: false, streamingTranscriptOutput: true },\n synthesize: { supported: true, incrementalTextInput: true, streamingAudioOutput: true },\n}\n\n// ─── 二进制协议常量 ───\n\nconst PROTOCOL_VERSION = 0b0001\nconst HEADER_SIZE = 0b0001\n\n/** 消息类型 */\nconst MSG_FULL_CLIENT = 0b0001\nconst MSG_AUDIO_ONLY_CLIENT = 0b0010\nconst MSG_FULL_SERVER = 0b1001\nconst MSG_AUDIO_ONLY_SERVER = 0b1011\nconst MSG_SERVER_ERROR = 0b1111\n\n/** 消息类型补充标志 */\nconst FLAG_NO_SEQ = 0b0000\nconst FLAG_LAST_NO_SEQ = 0b0010\nconst FLAG_WITH_EVENT = 0b0100\n\n/** 序列化方式 */\nconst SERIAL_NONE = 0b0000\nconst SERIAL_JSON = 0b0001\n\n/** 压缩方式 */\nconst COMPRESS_NONE = 0b0000\nconst COMPRESS_GZIP = 0b0001\n\n/** TTS 事件号(火山引擎双向流式 TTS v3 协议) */\nconst EVENT_START_CONNECTION = 1\nconst EVENT_FINISH_CONNECTION = 2\nconst EVENT_CONNECTION_STARTED = 50\nconst EVENT_CONNECTION_FAILED = 51\nconst EVENT_START_SESSION = 100\nconst EVENT_FINISH_SESSION = 102\nconst EVENT_SESSION_FINISHED = 152\nconst EVENT_SESSION_FAILED = 153\nconst EVENT_TASK_REQUEST = 200\nconst EVENT_TTS_RESPONSE = 352\n\n/** 连接级事件(不携带 session_id) */\nconst CONNECTION_EVENTS = new Set<number>([\n EVENT_START_CONNECTION,\n EVENT_FINISH_CONNECTION,\n EVENT_CONNECTION_STARTED,\n EVENT_CONNECTION_FAILED,\n])\n\n/** 我方音频格式 → 火山引擎 ASR / TTS 容器格式 */\nconst DOUBAO_FORMAT: Record<AudioFormat, string> = {\n pcm16: 'pcm',\n wav: 'wav',\n mp3: 'mp3',\n opus: 'ogg_opus',\n}\n\n// ─── 二进制编解码 ───\n\n/** 构造 4 字节协议头 */\nfunction buildHeader(messageType: number, flags: number, serialization: number, compression: number): Buffer {\n return Buffer.from([\n (PROTOCOL_VERSION << 4) | HEADER_SIZE,\n (messageType << 4) | flags,\n (serialization << 4) | compression,\n 0x00,\n ])\n}\n\n/** 大端 uint32 */\nfunction uint32BE(value: number): Buffer {\n const b = Buffer.alloc(4)\n b.writeUInt32BE(value >>> 0, 0)\n return b\n}\n\n/** 大端 int32 */\nfunction int32BE(value: number): Buffer {\n const b = Buffer.alloc(4)\n b.writeInt32BE(value, 0)\n return b\n}\n\n/** 编码 ASR full client request(4B 头 + payload_size + JSON payload) */\nfunction encodeAsrConfig(config: object): Uint8Array {\n const payload = Buffer.from(JSON.stringify(config), 'utf8')\n return new Uint8Array(Buffer.concat([\n buildHeader(MSG_FULL_CLIENT, FLAG_NO_SEQ, SERIAL_JSON, COMPRESS_NONE),\n uint32BE(payload.length),\n payload,\n ]))\n}\n\n/** 编码 ASR audio only request(4B 头 + payload_size + 原始音频;`last` 标记最后一包) */\nfunction encodeAsrAudio(audio: Uint8Array, last: boolean): Uint8Array {\n return new Uint8Array(Buffer.concat([\n buildHeader(MSG_AUDIO_ONLY_CLIENT, last ? FLAG_LAST_NO_SEQ : FLAG_NO_SEQ, SERIAL_NONE, COMPRESS_NONE),\n uint32BE(audio.length),\n Buffer.from(audio),\n ]))\n}\n\n/** 编码 TTS 事件帧(4B 头 + event + [session_id] + payload_size + JSON payload) */\nfunction encodeTtsEvent(event: number, payload: object, sessionId?: string): Uint8Array {\n const parts: Buffer[] = [\n buildHeader(MSG_FULL_CLIENT, FLAG_WITH_EVENT, SERIAL_JSON, COMPRESS_NONE),\n int32BE(event),\n ]\n if (!CONNECTION_EVENTS.has(event) && sessionId !== undefined) {\n const sid = Buffer.from(sessionId, 'utf8')\n parts.push(uint32BE(sid.length), sid)\n }\n const body = Buffer.from(JSON.stringify(payload), 'utf8')\n parts.push(uint32BE(body.length), body)\n return new Uint8Array(Buffer.concat(parts))\n}\n\n/** 解析后的服务端帧 */\ninterface DecodedFrame {\n messageType: number\n /** 事件号(TTS 协议有效) */\n event?: number\n /** 序列号(ASR 协议有效,负值表示最后一包) */\n sequence?: number\n /** JSON 负载(消息为 JSON 序列化时) */\n json?: Record<string, unknown>\n /** 原始二进制负载(音频帧) */\n audio?: Uint8Array\n /** 错误码(错误帧有效) */\n errorCode?: number\n /** 错误消息(错误帧有效) */\n errorMessage?: string\n}\n\n/** 解压 payload(依据 compression 位) */\nfunction maybeGunzip(payload: Buffer, compression: number): Buffer {\n return compression === COMPRESS_GZIP ? gunzipSync(payload) : payload\n}\n\n/** 解析服务端二进制帧 */\nfunction decodeFrame(data: Uint8Array): DecodedFrame {\n const buf = Buffer.from(data)\n const messageType = (buf[1] >> 4) & 0x0F\n const flags = buf[1] & 0x0F\n const serialization = (buf[2] >> 4) & 0x0F\n const compression = buf[2] & 0x0F\n let offset = 4\n\n if (messageType === MSG_SERVER_ERROR) {\n const errorCode = buf.readUInt32BE(offset)\n offset += 4\n const size = buf.readUInt32BE(offset)\n offset += 4\n const msg = maybeGunzip(buf.subarray(offset, offset + size), compression).toString('utf8')\n return { messageType, errorCode, errorMessage: msg }\n }\n\n let event: number | undefined\n if (flags & FLAG_WITH_EVENT) {\n event = buf.readInt32BE(offset)\n offset += 4\n // 会话级事件携带 session_id\n if (event !== undefined && !CONNECTION_EVENTS.has(event)) {\n const sidSize = buf.readUInt32BE(offset)\n offset += 4 + sidSize\n }\n }\n\n let sequence: number | undefined\n if (!(flags & FLAG_WITH_EVENT) && messageType === MSG_FULL_SERVER) {\n // ASR 服务端响应携带 sequence(4B 有符号,负值表示最后一包)\n sequence = buf.readInt32BE(offset)\n offset += 4\n }\n\n const size = buf.readUInt32BE(offset)\n offset += 4\n const payload = buf.subarray(offset, offset + size)\n\n if (messageType === MSG_AUDIO_ONLY_SERVER)\n return { messageType, event, audio: new Uint8Array(payload) }\n\n const decompressed = maybeGunzip(payload, compression)\n if (serialization === SERIAL_JSON) {\n try {\n return { messageType, event, sequence, json: JSON.parse(decompressed.toString('utf8')) as Record<string, unknown> }\n }\n catch {\n return { messageType, event, sequence }\n }\n }\n return { messageType, event, sequence, audio: new Uint8Array(decompressed) }\n}\n\n// ─── Provider 实现 ───\n\n/**\n * 创建豆包 / 火山引擎 Audio Provider\n *\n * @internal\n */\nexport function createDoubaoAudioProvider(): AudioProvider {\n function buildAuthHeaders(model: ResolvedAudioModel, isTts: boolean): Record<string, string> {\n const headers: Record<string, string> = {\n 'X-Api-Resource-Id': model.resourceId,\n 'X-Api-Connect-Id': globalThis.crypto.randomUUID(),\n }\n if (model.apiKey)\n headers['X-Api-Key'] = model.apiKey\n // 旧版控制台 ASR 使用 App-Key + Access-Key\n if (!isTts && model.appKey && model.accessKey) {\n headers['X-Api-App-Key'] = model.appKey\n headers['X-Api-Access-Key'] = model.accessKey\n }\n headers['X-Api-Request-Id'] = globalThis.crypto.randomUUID()\n return headers\n }\n\n // ─── ASR ───\n\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n try {\n let finalText = ''\n for await (const event of transcribeStream({ model: request.model, audio: request.audio, language: request.language, contextHints: request.contextHints, signal: request.signal })) {\n if (event.type === 'transcript' && event.final)\n finalText = event.text\n }\n return ok({ text: finalText })\n }\n catch (error) {\n logger.debug('Doubao transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error)\n }\n }\n\n async function* transcribeStream(request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const { model, audio, language, contextHints, signal } = request\n const url = `${model.baseUrl}/api/v3/sauc/bigmodel`\n const conn = await openAudioWebSocket(url, buildAuthHeaders(model, false), { signal, timeout: model.timeout })\n try {\n const sampleRate = audio.sampleRate ?? 16000\n const channels = audio.channels ?? 1\n conn.send(encodeAsrConfig({\n user: { uid: 'hai' },\n audio: {\n format: DOUBAO_FORMAT[audio.format],\n rate: sampleRate,\n bits: 16,\n channel: channels,\n ...(language ? { language } : {}),\n },\n request: {\n model_name: 'bigmodel',\n enable_itn: true,\n enable_punc: true,\n result_type: 'full',\n // 领域提示词 → 热词(直传 context)\n ...(contextHints?.length ? { context: JSON.stringify({ hotwords: contextHints.map(word => ({ word })) }) } : {}),\n },\n }))\n\n const sendAudio = (async () => {\n if ('chunks' in audio) {\n // 持续输入:一包前瞻,末包打 last 标记\n let prev: Uint8Array | undefined\n for await (const part of audio.chunks) {\n if (prev !== undefined)\n conn.send(encodeAsrAudio(prev, false))\n prev = part\n }\n conn.send(encodeAsrAudio(prev ?? new Uint8Array(0), true))\n }\n else {\n conn.send(encodeAsrAudio(audio.data, true))\n }\n })()\n let sendError: unknown\n sendAudio.catch((e: unknown) => {\n sendError = e\n })\n\n for await (const message of conn.messages()) {\n if (!message.isBinary || !message.binary)\n continue\n const frame = decodeFrame(message.binary)\n if (frame.messageType === MSG_SERVER_ERROR)\n throw audioError(HaiAIError.AUDIO_PROTOCOL_ERROR, aiM('ai_audioProtocolError', { params: { error: `${frame.errorCode} ${frame.errorMessage ?? ''}`.trim() } }))\n\n const text = extractAsrText(frame.json)\n const isLast = frame.sequence !== undefined && frame.sequence < 0\n if (text !== undefined)\n yield { type: 'transcript', text, final: isLast }\n if (isLast) {\n if (sendError)\n throw sendError\n return\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n // ─── TTS ───\n\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const out = resolveSynthesisOutput({ format: request.format, sampleRate: request.sampleRate })\n try {\n const chunks: Uint8Array[] = []\n for await (const audio of synthesizeStream({ model: request.model, text: request.text, voice: request.voice, format: out.format, sampleRate: request.sampleRate, signal: request.signal }))\n chunks.push(audio)\n return ok({ data: concatChunks(chunks), format: out.format, sampleRate: out.sampleRate, channels: out.channels })\n }\n catch (error) {\n logger.debug('Doubao synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error)\n }\n }\n\n async function* synthesizeStream(request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n const { model, text, voice, format, sampleRate, signal } = request\n const outFormat = resolveSynthesisOutput({ format }).format\n const url = `${model.baseUrl}/api/v3/tts/bidirection`\n const conn = await openAudioWebSocket(url, buildAuthHeaders(model, true), { signal, timeout: model.timeout })\n const sessionId = globalThis.crypto.randomUUID()\n\n const reqParams = {\n speaker: voice ?? '',\n audio_params: { format: DOUBAO_FORMAT[outFormat], sample_rate: sampleRate ?? 24000 },\n }\n\n try {\n conn.send(encodeTtsEvent(EVENT_START_CONNECTION, {}))\n conn.send(encodeTtsEvent(EVENT_START_SESSION, { event: EVENT_START_SESSION, req_params: reqParams }, sessionId))\n\n const sendText = (async () => {\n if (typeof text === 'string') {\n conn.send(encodeTtsEvent(EVENT_TASK_REQUEST, { event: EVENT_TASK_REQUEST, req_params: { ...reqParams, text } }, sessionId))\n }\n else {\n for await (const part of text)\n conn.send(encodeTtsEvent(EVENT_TASK_REQUEST, { event: EVENT_TASK_REQUEST, req_params: { ...reqParams, text: part } }, sessionId))\n }\n conn.send(encodeTtsEvent(EVENT_FINISH_SESSION, { event: EVENT_FINISH_SESSION }, sessionId))\n conn.send(encodeTtsEvent(EVENT_FINISH_CONNECTION, { event: EVENT_FINISH_CONNECTION }))\n })()\n let sendError: unknown\n sendText.catch((e: unknown) => {\n sendError = e\n })\n\n for await (const message of conn.messages()) {\n const frame = decodeBinaryMessage(message)\n if (!frame)\n continue\n if (frame.messageType === MSG_SERVER_ERROR || frame.event === EVENT_SESSION_FAILED || frame.event === EVENT_CONNECTION_FAILED)\n throw audioError(HaiAIError.AUDIO_PROTOCOL_ERROR, aiM('ai_audioProtocolError', { params: { error: `${frame.errorCode ?? frame.event} ${frame.errorMessage ?? ''}`.trim() } }))\n\n if (frame.event === EVENT_TTS_RESPONSE && frame.audio) {\n yield frame.audio\n }\n else if (frame.event === EVENT_SESSION_FINISHED) {\n if (sendError)\n throw sendError\n return\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream, resolveSynthesisOutput, capabilities: DOUBAO_CAPABILITIES }\n}\n\n/** 豆包未指定格式时默认 pcm16;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format: AudioFormat = request.format ?? 'pcm16'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n// ─── 内部辅助 ───\n\n/** 从 ASR 响应 JSON 提取识别文本(`result.text`) */\nfunction extractAsrText(json: Record<string, unknown> | undefined): string | undefined {\n if (!json)\n return undefined\n const result = json.result as { text?: string } | undefined\n return result?.text\n}\n\n/** 将 WebSocket 消息解析为二进制帧(非二进制返回 undefined) */\nfunction decodeBinaryMessage(message: AudioWsMessage): DecodedFrame | undefined {\n if (!message.isBinary || !message.binary)\n return undefined\n return decodeFrame(message.binary)\n}\n","/**\n * @h-ai/ai — LLM 流式响应处理\n *\n * 提供流处理器、SSE 编解码等纯函数工具。\n * @module ai-llm-stream\n */\n\nimport type {\n AssistantMessage,\n ChatCompletionChunk,\n ChatCompletionDelta,\n SSEDecoder,\n SSEEvent,\n StreamProcessor,\n StreamResult,\n} from './ai-llm-types.js'\n\n// ─── 流处理器 ───\n\n/**\n * 创建流处理器,逐块累积流式响应的文本内容和工具调用\n *\n * @returns 流处理器实例\n *\n * @example\n * ```ts\n * const processor = createStreamProcessor()\n * for await (const chunk of stream) {\n * processor.process(chunk)\n * }\n * const result = processor.getResult() // { content, toolCalls, finishReason }\n * ```\n */\nexport function createStreamProcessor(): StreamProcessor {\n /** 累积文本内容 */\n let content = ''\n /** 累积 reasoning 内容 */\n let reasoningContent = ''\n /** 按索引累积工具调用片段(流式中可能跨多个 chunk) */\n let toolCalls: Map<number, { id: string, name: string, arguments: string }> = new Map()\n /** 完成原因(`'stop'` | `'tool_calls'` 等) */\n let finishReason: string | null = null\n\n return {\n /** 处理单个 chunk,累积内容/工具调用/完成原因 */\n process(chunk: ChatCompletionChunk): ChatCompletionDelta | null {\n const choice = chunk.choices[0]\n if (!choice)\n return null\n\n const delta = choice.delta\n\n if (delta.content) {\n content += delta.content\n }\n\n const reasoningDelta = 'reasoning_content' in delta && typeof delta.reasoning_content === 'string'\n ? delta.reasoning_content\n : ''\n if (reasoningDelta) {\n reasoningContent += reasoningDelta\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const existing = toolCalls.get(tc.index)\n if (existing) {\n if (tc.function?.name) {\n existing.name += tc.function.name\n }\n if (tc.function?.arguments) {\n existing.arguments += tc.function.arguments\n }\n }\n else if (tc.id) {\n toolCalls.set(tc.index, {\n id: tc.id,\n name: tc.function?.name || '',\n arguments: tc.function?.arguments || '',\n })\n }\n }\n }\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason\n }\n\n return delta\n },\n\n /** 获取当前累积结果快照 */\n getResult(): StreamResult {\n return {\n content,\n reasoningContent,\n toolCalls: Array.from(toolCalls.values()).map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.name,\n arguments: tc.arguments,\n },\n })),\n finishReason,\n }\n },\n\n /** 将累积结果转为 AssistantMessage(含工具调用时 content 为 `null`) */\n toAssistantMessage(): AssistantMessage {\n const result = this.getResult()\n const message: AssistantMessage = {\n role: 'assistant',\n content: result.toolCalls.length > 0 ? null : result.content,\n }\n if (result.reasoningContent) {\n message.reasoning_content = result.reasoningContent\n }\n if (result.toolCalls.length > 0) {\n message.tool_calls = result.toolCalls\n }\n return message\n },\n\n /** 重置所有状态,可复用处理器处理下一次流 */\n reset(): void {\n content = ''\n reasoningContent = ''\n toolCalls = new Map()\n finishReason = null\n },\n }\n}\n\n// ─── 收集完整流 ───\n\n/**\n * 完整消费流式响应并返回累积结果\n *\n * @param stream - 流式响应迭代器\n * @returns 完整的流处理结果\n *\n * @example\n * ```ts\n * const result = await collectStream(ai.llm.chatStream({ messages }))\n * core.logger.info({ content: result.content, finishReason: result.finishReason })\n * ```\n */\nexport async function collectStream(\n stream: AsyncIterable<ChatCompletionChunk>,\n): Promise<StreamResult> {\n const processor = createStreamProcessor()\n for await (const chunk of stream) {\n processor.process(chunk)\n }\n return processor.getResult()\n}\n\n// ─── SSE 编解码 ───\n\n/**\n * 创建 SSE 解码器,内部维护缓冲区,支持跨分片拼接\n *\n * 按 SSE 规范解析 `event:`、`data:`、`id:`、`retry:` 字段,\n * 多行 `data:` 自动用换行符拼接。\n *\n * @returns SSE 解码器实例\n *\n * @example\n * ```ts\n * const decoder = createSSEDecoder()\n * for (const event of decoder.decode(rawText)) {\n * core.logger.info({ data: event.data }) // SSE data 内容\n * }\n * ```\n */\nexport function createSSEDecoder(): SSEDecoder {\n let buffer = ''\n\n return {\n * decode(text: string): Iterable<SSEEvent> {\n buffer += text\n\n const parts = buffer.split('\\n\\n')\n buffer = parts.pop() || ''\n\n for (const part of parts) {\n if (!part.trim())\n continue\n\n const event: SSEEvent = {}\n const lines = part.split('\\n')\n const dataLines: string[] = []\n\n for (const line of lines) {\n if (line.startsWith('event:')) {\n event.event = line.slice(6).trim()\n }\n else if (line.startsWith('id:')) {\n event.id = line.slice(3).trim()\n }\n else if (line.startsWith('retry:')) {\n event.retry = Number.parseInt(line.slice(6).trim(), 10)\n }\n else if (line.startsWith('data:')) {\n dataLines.push(line.slice(5).trim())\n }\n else if (line.startsWith('data ')) {\n dataLines.push(line.slice(5))\n }\n }\n\n if (dataLines.length > 0) {\n event.data = dataLines.join('\\n')\n }\n\n yield event\n }\n },\n\n reset(): void {\n buffer = ''\n },\n }\n}\n\n/**\n * 将 SSE 事件编码为符合规范的文本格式\n *\n * 输出以双换行 `\\n\\n` 结尾,可直接写入 HTTP 响应流。\n *\n * @param event - SSE 事件\n * @returns 编码后的文本(以 `\\n\\n` 结尾)\n *\n * @example\n * ```ts\n * const text = encodeSSE({ event: 'message', data: '{\"content\":\"hi\"}' })\n * // => 'event: message\\ndata: {\"content\":\"hi\"}\\n\\n'\n * ```\n */\nexport function encodeSSE(event: SSEEvent): string {\n const lines: string[] = []\n if (event.event) {\n lines.push(`event: ${event.event}`)\n }\n if (event.id) {\n lines.push(`id: ${event.id}`)\n }\n if (event.retry !== undefined) {\n lines.push(`retry: ${event.retry}`)\n }\n if (event.data !== undefined) {\n const dataLines = event.data.split('\\n')\n for (const line of dataLines) {\n lines.push(`data: ${line}`)\n }\n }\n return `${lines.join('\\n')}\\n\\n`\n}\n","/**\n * @h-ai/ai — Audio Provider: MiMo(小米)实现\n *\n * 基于 MiMo 兼容 Chat Completions 的 HTTP 接口实现语音识别与语音合成:\n * - ASR(`mimo-v2.5-asr`):完整音频以 `input_audio` 传入,`stream` 时增量返回识别文本。\n * MiMo ASR 不支持持续上传音频,故 `transcribeStream` 传入 `AudioInputStream` 时明确返回不支持。\n * - TTS(`mimo-v2.5-tts`):合成文本放入 `assistant` 消息,`stream` 时以 Base64 分片返回 PCM 音频。\n * @internal\n * @module audio/providers/ai-audio-provider-mimo\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AudioContent, AudioFormat, AudioModelCapabilities, SynthesisResult, TranscriptionEvent, TranscriptionResult } from '../ai-audio-types.js'\nimport type {\n AudioProvider,\n ProviderSynthesisRequest,\n ProviderSynthesisStreamRequest,\n ProviderTranscriptionRequest,\n ProviderTranscriptionStreamRequest,\n SynthesisOutputMeta,\n} from './ai-audio-provider.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { createSSEDecoder } from '../../llm/ai-llm-stream.js'\nimport { audioError, errorMessage, fromBase64, streamSentences, toAudioErrorResult, toBase64 } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-mimo' })\n\n/** MiMo 平台能力:HTTP 识别(非持续音频输入,流式返回文本)+ HTTP 流式合成(不接收增量文本,框架内句子分段) */\nconst MIMO_CAPABILITIES: AudioModelCapabilities = {\n transcribe: { supported: true, realtimeAudioInput: false, speechBoundaryEvents: false, streamingTranscriptOutput: true },\n synthesize: { supported: true, incrementalTextInput: false, streamingAudioOutput: true },\n}\n\n/** MiMo ASR 支持的音频容器 → MIME 类型 */\nconst MIMO_ASR_MIME: Partial<Record<AudioFormat, string>> = {\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n}\n\n/** MiMo 流式响应中的增量结构 */\ninterface MimoDelta {\n content?: string\n audio?: { data?: string }\n}\n\n/** MiMo Chat Completions 响应/流块结构(仅取本模块关心的字段) */\ninterface MimoChunk {\n choices?: Array<{\n delta?: MimoDelta\n message?: { content?: string, audio?: { data?: string } }\n }>\n}\n\n/**\n * 创建 MiMo Audio Provider\n *\n * @internal\n */\nexport function createMimoAudioProvider(): AudioProvider {\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n const { model, audio, language, signal } = request\n const mime = MIMO_ASR_MIME[audio.format]\n if (!mime)\n return err(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: 'mimo', reason: `format ${audio.format} (only wav/mp3)` } }))\n\n try {\n const response = await postChat(model.baseUrl, model.apiKey, {\n model: model.model,\n messages: [{ role: 'user', content: [{ type: 'input_audio', input_audio: { data: `data:${mime};base64,${toBase64(audio.data)}` } }] }],\n asr_options: { language: language ?? 'auto' },\n }, model.timeout, signal)\n if (!response.ok)\n return err(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n const body = await response.json() as MimoChunk\n const text = body.choices?.[0]?.message?.content ?? ''\n return ok({ text })\n }\n catch (error) {\n logger.debug('MiMo transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, signal)\n }\n }\n\n async function* transcribeStream(request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const { model, audio, language, signal } = request\n if ('chunks' in audio) {\n throw audioError(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: 'mimo', reason: 'streaming audio input' } }))\n }\n const content = audio as AudioContent\n const mime = MIMO_ASR_MIME[content.format]\n if (!mime)\n throw audioError(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: 'mimo', reason: `format ${content.format} (only wav/mp3)` } }))\n\n const response = await postChat(model.baseUrl, model.apiKey, {\n model: model.model,\n messages: [{ role: 'user', content: [{ type: 'input_audio', input_audio: { data: `data:${mime};base64,${toBase64(content.data)}` } }] }],\n asr_options: { language: language ?? 'auto' },\n stream: true,\n }, model.timeout, signal)\n if (!response.ok)\n throw audioError(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n let text = ''\n for await (const chunk of readChunks(response)) {\n const delta = chunk.choices?.[0]?.delta?.content\n if (delta) {\n text += delta\n yield { type: 'transcript', text, final: false }\n }\n }\n yield { type: 'transcript', text, final: true }\n }\n\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const { model, text, voice, instruction, format, sampleRate, signal } = request\n // 与 synthesizeStream 共用同一解析函数,确保完整与流式合成对同一 format 得到一致编码\n const out = resolveSynthesisOutput({ format, sampleRate })\n try {\n const response = await postChat(model.baseUrl, model.apiKey, {\n model: model.model,\n messages: buildTtsMessages(text, instruction),\n audio: { format: out.format, ...(voice ? { voice } : {}) },\n }, model.timeout, signal)\n if (!response.ok)\n return err(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n const body = await response.json() as MimoChunk\n const base64 = body.choices?.[0]?.message?.audio?.data\n if (!base64)\n return err(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: 'missing audio data' } }))\n\n return ok({ data: fromBase64(base64), format: out.format, sampleRate: out.sampleRate, channels: out.channels })\n }\n catch (error) {\n logger.debug('MiMo synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, signal)\n }\n }\n\n async function* synthesizeStream(request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n const { model, text, voice, instruction, format, signal } = request\n const outFormat = resolveSynthesisOutput({ format }).format\n\n // MiMo TTS 不原生接收增量文本:字符串一次合成;持续文本流按句子分段逐句合成,降低首音延迟\n const segments = typeof text === 'string' ? [text] : streamSentences(text)\n for await (const segment of segments) {\n if (!segment)\n continue\n const response = await postChat(model.baseUrl, model.apiKey, {\n model: model.model,\n messages: buildTtsMessages(segment, instruction),\n audio: { format: outFormat, ...(voice ? { voice } : {}) },\n stream: true,\n }, model.timeout, signal)\n if (!response.ok)\n throw audioError(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n for await (const chunk of readChunks(response)) {\n const base64 = chunk.choices?.[0]?.delta?.audio?.data\n if (base64)\n yield fromBase64(base64)\n }\n }\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream, resolveSynthesisOutput, capabilities: MIMO_CAPABILITIES }\n}\n\n/** MiMo 流式合成除 wav 外均输出 pcm16;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format: AudioFormat = request.format === 'wav' ? 'wav' : 'pcm16'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n// ─── 内部辅助 ───\n\n/** 构造 MiMo TTS 消息:风格指令放入 user 消息,待合成文本放入 assistant 消息 */\nfunction buildTtsMessages(text: string, instruction?: string): Array<{ role: string, content: string }> {\n const messages: Array<{ role: string, content: string }> = []\n if (instruction)\n messages.push({ role: 'user', content: instruction })\n messages.push({ role: 'assistant', content: text })\n return messages\n}\n\n/** 发送 Chat Completions 请求(Authorization Bearer) */\nfunction postChat(baseUrl: string, apiKey: string | undefined, body: Record<string, unknown>, timeout: number, signal?: AbortSignal): Promise<Response> {\n const url = `${baseUrl.replace(/\\/$/, '')}/chat/completions`\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (apiKey)\n headers.Authorization = `Bearer ${apiKey}`\n return fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: combineSignal(signal, timeout),\n })\n}\n\n/** 迭代 SSE 响应,逐个产出解析后的 MiMo 数据块(`[DONE]` 结束) */\nasync function* readChunks(response: Response): AsyncIterable<MimoChunk> {\n const body = response.body\n if (!body)\n return\n const reader = body.getReader()\n const decoder = new TextDecoder()\n const sse = createSSEDecoder()\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n const text = decoder.decode(value, { stream: true })\n for (const event of sse.decode(text)) {\n if (!event.data || event.data === '[DONE]')\n continue\n try {\n yield JSON.parse(event.data) as MimoChunk\n }\n catch {\n // 忽略无法解析的心跳/空行\n }\n }\n }\n }\n finally {\n reader.releaseLock()\n }\n}\n\n/** 组合取消信号与超时(不泄露原信号) */\nfunction combineSignal(signal: AbortSignal | undefined, timeout: number): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(timeout)\n return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal\n}\n\n/** 读取 HTTP 错误响应摘要(截断,避免泄露过长响应体) */\nasync function describeHttpError(response: Response): Promise<string> {\n const text = await response.text().catch(() => '')\n return `HTTP ${response.status} ${text.slice(0, 200)}`.trim()\n}\n","/**\n * @h-ai/ai — Audio Provider: OpenAI 实现\n *\n * 基于 OpenAI Audio API(transcriptions / speech)实现完整与流式的语音识别、语音合成。\n * OpenAI 标准 Audio API 不支持持续音频输入的实时识别,故 `transcribeStream` 传入\n * `AudioInputStream` 时明确返回不支持,不将整段音频缓冲后伪装为实时识别。\n * @internal\n * @module audio/providers/ai-audio-provider-openai\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AudioContent, AudioFormat, AudioModelCapabilities, SynthesisResult, TranscriptionEvent, TranscriptionResult } from '../ai-audio-types.js'\nimport type {\n AudioProvider,\n ProviderSynthesisRequest,\n ProviderSynthesisStreamRequest,\n ProviderTranscriptionRequest,\n ProviderTranscriptionStreamRequest,\n SynthesisOutputMeta,\n} from './ai-audio-provider.js'\n\nimport { Buffer } from 'node:buffer'\nimport { core, err, ok } from '@h-ai/core'\nimport OpenAI, { toFile } from 'openai'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { audioError, errorMessage, streamSentences, toAudioErrorResult } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-openai' })\n\n/** OpenAI 平台能力:HTTP 文件识别(非实时)+ HTTP 流式合成(不原生接收增量文本,框架内句子分段) */\nconst OPENAI_CAPABILITIES: AudioModelCapabilities = {\n transcribe: { supported: true, realtimeAudioInput: false, speechBoundaryEvents: false, streamingTranscriptOutput: false },\n synthesize: { supported: true, incrementalTextInput: false, streamingAudioOutput: true },\n}\n\n/** 我方音频格式 → OpenAI speech response_format */\nconst OPENAI_SPEECH_FORMAT: Record<AudioFormat, 'pcm' | 'wav' | 'mp3' | 'opus'> = {\n pcm16: 'pcm',\n wav: 'wav',\n mp3: 'mp3',\n opus: 'opus',\n}\n\n/** 我方音频格式 → 上传文件名(transcriptions 依据扩展名识别容器) */\nconst OPENAI_UPLOAD_FILENAME: Record<AudioFormat, string> = {\n pcm16: 'audio.wav',\n wav: 'audio.wav',\n mp3: 'audio.mp3',\n opus: 'audio.ogg',\n}\n\n/**\n * 创建 OpenAI Audio Provider\n *\n * @internal\n */\nexport function createOpenAIAudioProvider(): AudioProvider {\n function createClient(apiKey: string, baseUrl: string, timeout: number): OpenAI {\n return new OpenAI({ apiKey, baseURL: baseUrl, timeout })\n }\n\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n const { model, audio, language, contextHints, signal } = request\n if (!model.apiKey)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_audioMissingApiKey', { params: { provider: 'openai' } }))\n\n try {\n const client = createClient(model.apiKey, model.baseUrl, model.timeout)\n const file = await toUploadFile(audio)\n const result = await client.audio.transcriptions.create({\n file,\n model: model.model,\n language,\n ...(contextHints?.length ? { prompt: contextHints.join(', ') } : {}),\n }, { signal })\n return ok({ text: result.text })\n }\n catch (error) {\n logger.debug('OpenAI transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, signal)\n }\n }\n\n async function* transcribeStream(request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const { model, audio, language, contextHints, signal } = request\n if (!model.apiKey)\n throw audioError(HaiAIError.CONFIGURATION_ERROR, aiM('ai_audioMissingApiKey', { params: { provider: 'openai' } }))\n\n // OpenAI 标准 Audio API 仅支持完整音频文件,不支持持续音频输入的实时识别\n if ('chunks' in audio) {\n throw audioError(\n HaiAIError.AUDIO_UNSUPPORTED_INPUT,\n aiM('ai_audioUnsupportedInput', { params: { provider: 'openai', reason: 'streaming audio input' } }),\n )\n }\n\n const client = createClient(model.apiKey, model.baseUrl, model.timeout)\n const file = await toUploadFile(audio)\n const stream = await client.audio.transcriptions.create({\n file,\n model: model.model,\n language,\n stream: true,\n ...(contextHints?.length ? { prompt: contextHints.join(', ') } : {}),\n }, { signal })\n\n let text = ''\n for await (const event of stream) {\n if (event.type === 'transcript.text.delta') {\n text += event.delta\n yield { type: 'transcript', text, final: false }\n }\n else if (event.type === 'transcript.text.done') {\n yield { type: 'transcript', text: event.text, final: true }\n }\n }\n }\n\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const { model, text, voice, instruction, format, sampleRate, signal } = request\n if (!model.apiKey)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_audioMissingApiKey', { params: { provider: 'openai' } }))\n\n const out = resolveSynthesisOutput({ format, sampleRate })\n try {\n const client = createClient(model.apiKey, model.baseUrl, model.timeout)\n const response = await client.audio.speech.create({\n model: model.model,\n voice: voice ?? 'alloy',\n input: text,\n response_format: OPENAI_SPEECH_FORMAT[out.format],\n ...(instruction ? { instructions: instruction } : {}),\n }, { signal })\n const data = new Uint8Array(await response.arrayBuffer())\n return ok({ data, format: out.format, sampleRate: out.sampleRate, channels: out.channels })\n }\n catch (error) {\n logger.debug('OpenAI synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, signal)\n }\n }\n\n async function* synthesizeStream(request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n const { model, text, voice, instruction, format, signal } = request\n if (!model.apiKey)\n throw audioError(HaiAIError.CONFIGURATION_ERROR, aiM('ai_audioMissingApiKey', { params: { provider: 'openai' } }))\n\n const outFormat = resolveSynthesisOutput({ format }).format\n const client = createClient(model.apiKey, model.baseUrl, model.timeout)\n\n // OpenAI TTS 不原生接收增量文本:字符串一次合成;持续文本流按句子分段逐句合成,降低首音延迟\n const segments = typeof text === 'string' ? [text] : streamSentences(text)\n for await (const segment of segments) {\n if (!segment)\n continue\n const response = await client.audio.speech.create({\n model: model.model,\n voice: voice ?? 'alloy',\n input: segment,\n response_format: OPENAI_SPEECH_FORMAT[outFormat],\n ...(instruction ? { instructions: instruction } : {}),\n }, { signal })\n\n const body = response.body\n if (!body) {\n yield new Uint8Array(await response.arrayBuffer())\n continue\n }\n const reader = body.getReader()\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n if (value)\n yield value\n }\n }\n finally {\n reader.releaseLock()\n }\n }\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream, resolveSynthesisOutput, capabilities: OPENAI_CAPABILITIES }\n}\n\n/** OpenAI 未指定格式时默认 mp3;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format = request.format ?? 'mp3'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n/** 构造上传文件:裸 pcm16 先封装为 WAV 容器(OpenAI 文件接口需要容器格式) */\nasync function toUploadFile(audio: AudioContent): Promise<Awaited<ReturnType<typeof toFile>>> {\n if (audio.format === 'pcm16') {\n const wav = wrapPcmToWav(audio.data, audio.sampleRate ?? 16000, audio.channels ?? 1)\n return toFile(Buffer.from(wav), 'audio.wav')\n }\n return toFile(Buffer.from(audio.data), OPENAI_UPLOAD_FILENAME[audio.format])\n}\n\n/** 将 16bit 小端裸 PCM 封装为 WAV 容器(44 字节头 + 数据) */\nfunction wrapPcmToWav(pcm: Uint8Array, sampleRate: number, channels: number): Uint8Array {\n const bitsPerSample = 16\n const byteRate = (sampleRate * channels * bitsPerSample) / 8\n const blockAlign = (channels * bitsPerSample) / 8\n const dataSize = pcm.length\n const buffer = Buffer.alloc(44 + dataSize)\n buffer.write('RIFF', 0)\n buffer.writeUInt32LE(36 + dataSize, 4)\n buffer.write('WAVE', 8)\n buffer.write('fmt ', 12)\n buffer.writeUInt32LE(16, 16)\n buffer.writeUInt16LE(1, 20)\n buffer.writeUInt16LE(channels, 22)\n buffer.writeUInt32LE(sampleRate, 24)\n buffer.writeUInt32LE(byteRate, 28)\n buffer.writeUInt16LE(blockAlign, 32)\n buffer.writeUInt16LE(bitsPerSample, 34)\n buffer.write('data', 36)\n buffer.writeUInt32LE(dataSize, 40)\n Buffer.from(pcm).copy(buffer, 44)\n return new Uint8Array(buffer)\n}\n","/**\n * @h-ai/ai — Audio Provider: Qwen(阿里云百炼)实现\n *\n * 基于 DashScope Realtime WebSocket 协议实现实时语音识别与语音合成。\n * Provider 内部负责 Session、Buffer、Commit 等协议事件,公共 API 不暴露这些概念:\n * - ASR(`qwen3-asr-flash-realtime`):完整音频用 Manual 模式,持续音频输入用 VAD 模式。\n * - TTS(`qwen3-tts-flash-realtime`):完整文本用 Commit 模式,持续文本输入用 ServerCommit 模式。\n * @internal\n * @module audio/providers/ai-audio-provider-qwen\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ResolvedAudioModel } from '../../ai-config.js'\n\nimport type { AudioFormat, AudioModelCapabilities, SynthesisResult, TranscriptionEvent, TranscriptionResult } from '../ai-audio-types.js'\nimport type {\n AudioProvider,\n AudioWsConnection,\n ProviderSynthesisRequest,\n ProviderSynthesisStreamRequest,\n ProviderTranscriptionRequest,\n ProviderTranscriptionStreamRequest,\n SynthesisOutputMeta,\n} from './ai-audio-provider.js'\n\nimport { core, ok } from '@h-ai/core'\nimport { nanoid } from 'nanoid'\nimport { concatChunks, errorMessage, fromBase64, openAudioWebSocket, toAudioErrorResult, toBase64 } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-qwen' })\n\n/** Qwen 实时平台能力:WebSocket 实时识别(含服务端 VAD)+ 实时合成(支持增量文本输入) */\nconst QWEN_CAPABILITIES: AudioModelCapabilities = {\n transcribe: { supported: true, realtimeAudioInput: true, speechBoundaryEvents: true, streamingTranscriptOutput: true },\n synthesize: { supported: true, incrementalTextInput: true, streamingAudioOutput: true },\n}\n\n/** 我方音频格式 → Qwen input_audio_format / response_format */\nconst QWEN_FORMAT: Record<AudioFormat, string> = {\n pcm16: 'pcm',\n wav: 'wav',\n mp3: 'mp3',\n opus: 'opus',\n}\n\n/** Qwen 服务端事件(仅取本模块关心的字段,字段名做防御性兼容) */\ninterface QwenServerEvent {\n type?: string\n text?: string\n transcript?: string\n delta?: string\n audio?: string\n transcription?: { text?: string, transcript?: string }\n}\n/**\n * 创建 Qwen Audio Provider\n *\n * @internal\n */\nexport function createQwenAudioProvider(): AudioProvider {\n function connect(model: ResolvedAudioModel, signal?: AbortSignal): Promise<AudioWsConnection> {\n const url = `${model.baseUrl}?model=${encodeURIComponent(model.model)}`\n const headers: Record<string, string> = {}\n if (model.apiKey)\n headers.Authorization = `Bearer ${model.apiKey}`\n if (model.workspaceId)\n headers['X-DashScope-WorkSpace'] = model.workspaceId\n return openAudioWebSocket(url, headers, { signal, timeout: model.timeout })\n }\n\n function newEventId(): string {\n return `event_${nanoid()}`\n }\n\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n try {\n let finalText = ''\n for await (const event of transcribeStream({ model: request.model, audio: request.audio, language: request.language, contextHints: request.contextHints, signal: request.signal })) {\n if (event.type === 'transcript' && event.final)\n finalText = finalText ? `${finalText}${event.text}` : event.text\n }\n return ok({ text: finalText })\n }\n catch (error) {\n logger.debug('Qwen transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error)\n }\n }\n\n async function* transcribeStream(request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const { model, audio, language, signal } = request\n const isStreamInput = 'chunks' in audio\n const format = audio.format\n const sampleRate = audio.sampleRate\n\n const conn = await connect(model, signal)\n try {\n // 会话配置:持续音频输入用服务端 VAD 断句;完整音频用 Manual 模式(手动 commit)\n conn.send(JSON.stringify({\n event_id: newEventId(),\n type: 'session.update',\n session: {\n input_audio_format: QWEN_FORMAT[format],\n sample_rate: sampleRate ?? 16000,\n input_audio_transcription: language ? { language } : {},\n turn_detection: isStreamInput ? { type: 'server_vad' } : null,\n },\n }))\n\n // 音频发送:持续输入边到边送,完整音频一次送出后手动 commit\n const sendAudio = (async () => {\n if ('chunks' in audio) {\n for await (const part of audio.chunks)\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_audio_buffer.append', audio: toBase64(part) }))\n }\n else {\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_audio_buffer.append', audio: toBase64(audio.data) }))\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_audio_buffer.commit' }))\n }\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'session.finish' }))\n })()\n // 发送失败不阻塞读取循环,读取结束后再统一 surface\n let sendError: unknown\n sendAudio.catch((e: unknown) => {\n sendError = e\n })\n\n for await (const message of conn.messages()) {\n if (message.isBinary || !message.text)\n continue\n const event = parseEvent(message.text)\n switch (event.type) {\n case 'input_audio_buffer.speech_started':\n yield { type: 'speech_started' }\n break\n case 'input_audio_buffer.speech_stopped':\n yield { type: 'speech_stopped' }\n break\n case 'conversation.item.input_audio_transcription.text': {\n const text = event.text ?? event.transcript ?? event.transcription?.text ?? event.delta\n if (text)\n yield { type: 'transcript', text, final: false }\n break\n }\n case 'conversation.item.input_audio_transcription.completed': {\n const text = event.transcript ?? event.text ?? event.transcription?.transcript ?? event.transcription?.text\n if (text)\n yield { type: 'transcript', text, final: true }\n break\n }\n case 'session.finished':\n if (sendError)\n throw sendError\n return\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const { format, sampleRate } = request\n const out = resolveSynthesisOutput({ format, sampleRate })\n try {\n const chunks: Uint8Array[] = []\n for await (const audio of synthesizeStream({ model: request.model, text: request.text, voice: request.voice, instruction: request.instruction, format: out.format, sampleRate, signal: request.signal }))\n chunks.push(audio)\n return ok({ data: concatChunks(chunks), format: out.format, sampleRate: out.sampleRate, channels: out.channels })\n }\n catch (error) {\n logger.debug('Qwen synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error)\n }\n }\n\n async function* synthesizeStream(request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n const { model, text, voice, instruction, format, sampleRate, signal } = request\n const isStreamInput = typeof text !== 'string'\n const outFormat = resolveSynthesisOutput({ format }).format\n\n const conn = await connect(model, signal)\n try {\n conn.send(JSON.stringify({\n event_id: newEventId(),\n type: 'session.update',\n session: {\n voice: voice ?? 'Cherry',\n // 持续文本输入用 ServerCommit(服务端智能分段,低时延);完整文本用 Commit\n mode: isStreamInput ? 'server_commit' : 'commit',\n response_format: QWEN_FORMAT[outFormat],\n sample_rate: sampleRate ?? 24000,\n ...(instruction ? { instructions: instruction } : {}),\n },\n }))\n\n const sendText = (async () => {\n if (typeof text === 'string') {\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_text_buffer.append', text }))\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_text_buffer.commit' }))\n }\n else {\n for await (const part of text)\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_text_buffer.append', text: part }))\n }\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'session.finish' }))\n })()\n let sendError: unknown\n sendText.catch((e: unknown) => {\n sendError = e\n })\n\n for await (const message of conn.messages()) {\n if (message.isBinary || !message.text)\n continue\n const event = parseEvent(message.text)\n if (event.type === 'response.audio.delta') {\n const base64 = event.audio ?? event.delta\n if (base64)\n yield fromBase64(base64)\n }\n else if (event.type === 'session.finished') {\n if (sendError)\n throw sendError\n return\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream, resolveSynthesisOutput, capabilities: QWEN_CAPABILITIES }\n}\n\n/** Qwen 未指定格式时默认 pcm16;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format: AudioFormat = request.format ?? 'pcm16'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n/** 解析服务端 JSON 事件(解析失败返回空对象,交由调用方忽略) */\nfunction parseEvent(text: string): QwenServerEvent {\n try {\n return JSON.parse(text) as QwenServerEvent\n }\n catch {\n return {}\n }\n}\n","/**\n * @h-ai/ai — Audio 子功能工厂\n *\n * 组装 `AudioOperations`:参数校验、模型解析、Provider 路由与调用。\n * Provider 惰性创建并缓存,未使用的平台不初始化客户端与连接。\n * @module audio/ai-audio-functions\n */\n\nimport type { HaiError, HaiResult } from '@h-ai/core'\nimport type { AIConfig, AudioConfig, AudioProviderName } from '../ai-config.js'\n\nimport type {\n AudioCapabilitiesRequest,\n AudioContent,\n AudioModelCapabilities,\n AudioOperations,\n SynthesisEvent,\n SynthesisRequest,\n SynthesisResult,\n SynthesisStreamRequest,\n SynthesisTextSegment,\n TranscriptionEvent,\n TranscriptionRequest,\n TranscriptionResult,\n TranscriptionStreamRequest,\n} from './ai-audio-types.js'\nimport type { AudioProvider } from './providers/ai-audio-provider.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { AudioConfigSchema, resolveAudioModel } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { createDoubaoAudioProvider } from './providers/ai-audio-provider-doubao.js'\nimport { createMimoAudioProvider } from './providers/ai-audio-provider-mimo.js'\nimport { createOpenAIAudioProvider } from './providers/ai-audio-provider-openai.js'\nimport { createQwenAudioProvider } from './providers/ai-audio-provider-qwen.js'\nimport { audioError, mapStreamError } from './providers/ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio' })\n\n/**\n * 创建 Audio 操作接口\n *\n * @param config - 校验后的 AI 配置\n * @returns Audio 操作接口\n */\nexport function createAudioOperations(config: AIConfig): AudioOperations {\n const audioConfig: AudioConfig = AudioConfigSchema.parse(config.audio ?? {})\n const providerCache = new Map<AudioProviderName, AudioProvider>()\n\n /** 惰性创建并缓存 Provider(未使用的平台不初始化) */\n function getProvider(name: AudioProviderName): AudioProvider {\n const cached = providerCache.get(name)\n if (cached)\n return cached\n const provider = createProvider(name)\n providerCache.set(name, provider)\n return provider\n }\n\n /** 校验完整音频大小,超过上限返回错误 */\n function guardAudioSize(audio: AudioContent): HaiError | null {\n if (audio.data.length > audioConfig.maxAudioBytes)\n return audioError(HaiAIError.AUDIO_INPUT_TOO_LARGE, aiM('ai_audioInputTooLarge', { params: { limit: audioConfig.maxAudioBytes } }))\n return null\n }\n\n /** 组合请求取消信号与实时连接时长上限(P0-5:maxStreamDurationMs 生效) */\n function withStreamTimeout(signal: AbortSignal | undefined): AbortSignal {\n const timeout = AbortSignal.timeout(audioConfig.maxStreamDurationMs)\n return signal ? AbortSignal.any([signal, timeout]) : timeout\n }\n\n async function transcribe(request: TranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n if (!request.audio?.data?.length)\n return err(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'empty audio' } }))\n const sizeErr = guardAudioSize(request.audio)\n if (sizeErr)\n return { success: false, error: sizeErr }\n\n const resolved = resolveAudioModel(audioConfig, 'transcribe', request.model)\n if (!resolved.success)\n return resolved\n logger.debug('audio transcribe', { provider: resolved.data.provider, model: resolved.data.model })\n return getProvider(resolved.data.provider).transcribe({ model: resolved.data, audio: request.audio, language: request.language, contextHints: request.contextHints, signal: request.signal })\n }\n\n async function* transcribeStream(request: TranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n if (!('chunks' in request.audio) && !request.audio.data?.length)\n throw audioError(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'empty audio' } }))\n if (!('chunks' in request.audio)) {\n const sizeErr = guardAudioSize(request.audio)\n if (sizeErr)\n throw sizeErr\n }\n\n const resolved = resolveAudioModel(audioConfig, 'transcribe', request.model)\n if (!resolved.success)\n throw resolved.error\n logger.debug('audio transcribeStream', { provider: resolved.data.provider, model: resolved.data.model })\n const signal = withStreamTimeout(request.signal)\n try {\n yield* getProvider(resolved.data.provider).transcribeStream({ model: resolved.data, audio: request.audio, language: request.language, contextHints: request.contextHints, signal })\n }\n catch (error) {\n throw mapStreamError(error, signal)\n }\n }\n\n async function synthesize(request: SynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n if (!request.text)\n return err(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'empty text' } }))\n\n const resolved = resolveAudioModel(audioConfig, 'synthesize', request.model)\n if (!resolved.success)\n return resolved\n logger.debug('audio synthesize', { provider: resolved.data.provider, model: resolved.data.model })\n return getProvider(resolved.data.provider).synthesize({ model: resolved.data, text: request.text, voice: request.voice, instruction: request.instruction, format: request.format, sampleRate: request.sampleRate, signal: request.signal })\n }\n\n async function* synthesizeStream(request: SynthesisStreamRequest): AsyncIterable<SynthesisEvent> {\n const resolved = resolveAudioModel(audioConfig, 'synthesize', request.model)\n if (!resolved.success)\n throw resolved.error\n logger.debug('audio synthesizeStream', { provider: resolved.data.provider, model: resolved.data.model })\n const signal = withStreamTimeout(request.signal)\n const provider = getProvider(resolved.data.provider)\n // 由 Provider 依据自身默认规则解析真实输出格式,供 segment_started 标注(不由调用方猜测)\n const output = provider.resolveSynthesisOutput({ format: request.format, sampleRate: request.sampleRate })\n try {\n const segments = isSynthesisTextSegment(request.text) ? singleSegment(request.text) : request.text\n for await (const segment of segments) {\n if (!segment.id || !segment.text)\n throw audioError(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'empty segment id or text' } }))\n yield { type: 'segment_started', segmentId: segment.id, text: segment.text, format: output.format, sampleRate: output.sampleRate, channels: output.channels }\n for await (const data of provider.synthesizeStream({ model: resolved.data, text: segment.text, voice: request.voice, instruction: request.instruction, format: request.format, sampleRate: request.sampleRate, signal }))\n yield { type: 'audio', segmentId: segment.id, data }\n yield { type: 'segment_done', segmentId: segment.id }\n }\n }\n catch (error) {\n throw mapStreamError(error, signal)\n }\n }\n\n /**\n * 查询模型所属平台的实时能力声明(不需凭据,仅解析模型→平台)\n */\n function getCapabilities(request: AudioCapabilitiesRequest): HaiResult<AudioModelCapabilities> {\n const targetId = request.model ?? (request.operation === 'transcribe' ? audioConfig.transcribeModel : audioConfig.synthesizeModel)\n if (!targetId)\n return err(HaiAIError.AUDIO_MODEL_NOT_FOUND, aiM('ai_audioModelNotFound', { params: { model: `<${request.operation}>` } }))\n const entry = audioConfig.models?.find(model => model.id === targetId || model.model === targetId)\n if (!entry)\n return err(HaiAIError.AUDIO_MODEL_NOT_FOUND, aiM('ai_audioModelNotFound', { params: { model: targetId } }))\n const operations: readonly string[] = entry.operations\n if (!operations.includes(request.operation)) {\n return err(\n HaiAIError.AUDIO_UNSUPPORTED_INPUT,\n aiM('ai_audioUnsupportedInput', { params: { provider: entry.provider, reason: `model ${entry.id} does not support ${request.operation}` } }),\n )\n }\n const capabilities = getProvider(entry.provider).capabilities\n return ok(request.operation === 'transcribe'\n ? { transcribe: capabilities.transcribe }\n : { synthesize: capabilities.synthesize })\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream, getCapabilities }\n}\n\nfunction isSynthesisTextSegment(value: SynthesisStreamRequest['text']): value is SynthesisTextSegment {\n return typeof value === 'object' && value !== null && 'id' in value && 'text' in value\n}\n\nasync function* singleSegment(segment: SynthesisTextSegment): AsyncIterable<SynthesisTextSegment> {\n yield segment\n}\n\n/** 按平台创建 Provider */\nfunction createProvider(name: AudioProviderName): AudioProvider {\n switch (name) {\n case 'openai':\n return createOpenAIAudioProvider()\n case 'mimo':\n return createMimoAudioProvider()\n case 'qwen':\n return createQwenAudioProvider()\n case 'doubao':\n return createDoubaoAudioProvider()\n }\n}\n","/**\n * @h-ai/ai — Compress 子功能实现\n *\n * 提供上下文压缩能力,支持滑动窗口、摘要、混合三种策略。\n * 依赖 Token 子模块进行 Token 估算,依赖 Summary 子模块生成摘要。\n * @module ai-compress-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { CompressConfig } from '../ai-config.js'\n\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { SummaryOperations } from '../summary/ai-summary-types.js'\nimport type { TokenOperations } from '../token/ai-token-types.js'\nimport type { CompressOperations, CompressOptions, CompressResult } from './ai-compress-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'compress' })\n\n/**\n * 创建 Compress 操作接口\n *\n * @param config - Compress 配置\n * @param token - Token 操作接口(用于估算 Token 数)\n * @param summary - Summary 操作接口(用于 summary/hybrid 策略生成摘要)\n * @param modelMaxTokens - 模型最大 Token 数(用于 defaultMaxTokens 为 0 时的回退计算)\n * @returns CompressOperations 实例\n */\nexport function createCompressOperations(\n config: CompressConfig,\n token: TokenOperations,\n summary: SummaryOperations,\n modelMaxTokens: number,\n): CompressOperations {\n /**\n * 计算有效的 maxTokens\n */\n function resolveMaxTokens(optionMaxTokens?: number): number {\n const fromOption = optionMaxTokens ?? config.defaultMaxTokens\n if (fromOption > 0)\n return fromOption\n return Math.floor(modelMaxTokens * 0.8)\n }\n\n /**\n * 滑动窗口压缩\n */\n function slidingWindow(\n messages: ChatMessage[],\n maxTokens: number,\n preserveSystem: boolean,\n preserveLastN: number,\n ): { messages: ChatMessage[], removedCount: number } {\n const systemMessages: ChatMessage[] = []\n const nonSystemMessages: ChatMessage[] = []\n\n for (const msg of messages) {\n if (msg.role === 'system' && preserveSystem) {\n systemMessages.push(msg)\n }\n else {\n nonSystemMessages.push(msg)\n }\n }\n\n const preserved = nonSystemMessages.slice(-preserveLastN)\n const result = [...systemMessages, ...preserved]\n const currentTokens = token.estimateMessages(result)\n\n if (currentTokens <= maxTokens) {\n return {\n messages: result,\n removedCount: nonSystemMessages.length - preserved.length,\n }\n }\n\n // 从最新的消息开始逆向添加\n let finalMessages = [...systemMessages]\n let tokens = token.estimateMessages(finalMessages)\n const addable: ChatMessage[] = []\n\n for (let i = nonSystemMessages.length - 1; i >= 0; i--) {\n const msgTokens = token.estimateMessages([nonSystemMessages[i]])\n if (tokens + msgTokens > maxTokens)\n break\n addable.unshift(nonSystemMessages[i])\n tokens += msgTokens\n }\n\n finalMessages = [...systemMessages, ...addable]\n\n return {\n messages: finalMessages,\n removedCount: nonSystemMessages.length - addable.length,\n }\n }\n\n /**\n * 压缩消息列表\n */\n async function tryCompress(messages: ChatMessage[], options?: CompressOptions): Promise<HaiResult<CompressResult>> {\n const strategy = options?.strategy ?? config.defaultStrategy\n const maxTokens = resolveMaxTokens(options?.maxTokens)\n const preserveSystem = options?.preserveSystem ?? true\n const preserveLastN = options?.preserveLastN ?? config.preserveLastN\n\n logger.trace('Compressing context', { strategy, maxTokens, messageCount: messages.length })\n\n try {\n const originalTokens = token.estimateMessages(messages)\n\n // 不需要压缩\n if (originalTokens <= maxTokens) {\n return ok({\n messages: [...messages],\n originalTokens,\n compressedTokens: originalTokens,\n removedCount: 0,\n })\n }\n\n if (strategy === 'sliding-window') {\n const { messages: compressed, removedCount } = slidingWindow(\n messages,\n maxTokens,\n preserveSystem,\n preserveLastN,\n )\n const compressedTokens = token.estimateMessages(compressed)\n\n logger.trace('Sliding window compression completed', { originalTokens, compressedTokens, removedCount })\n return ok({\n messages: compressed,\n originalTokens,\n compressedTokens,\n removedCount,\n })\n }\n\n if (strategy === 'summary') {\n const systemMessages = preserveSystem ? messages.filter(m => m.role === 'system') : []\n const nonSystem = messages.filter(m => m.role !== 'system' || !preserveSystem)\n const preserved = nonSystem.slice(-preserveLastN)\n const toSummarize = nonSystem.slice(0, nonSystem.length - preserveLastN)\n\n if (toSummarize.length === 0) {\n return ok({\n messages: [...messages],\n originalTokens,\n compressedTokens: originalTokens,\n removedCount: 0,\n })\n }\n\n const summaryResult = await summary.generate(toSummarize, { model: options?.summaryModel })\n if (!summaryResult.success)\n return summaryResult as HaiResult<never>\n\n const summaryText = summaryResult.data\n const summaryMessage: ChatMessage = {\n role: 'system',\n content: `[Conversation Summary]\\n${summaryText}`,\n }\n\n const compressed = [...systemMessages, summaryMessage, ...preserved]\n const compressedTokens = token.estimateMessages(compressed)\n\n logger.trace('Summary compression completed', { originalTokens, compressedTokens, removedCount: toSummarize.length })\n return ok({\n messages: compressed,\n originalTokens,\n compressedTokens,\n removedCount: toSummarize.length,\n summary: summaryText,\n })\n }\n\n // hybrid:先滑动窗口,如果仍超限则摘要\n const { messages: windowResult, removedCount: windowRemoved } = slidingWindow(\n messages,\n maxTokens,\n preserveSystem,\n preserveLastN,\n )\n const windowTokens = token.estimateMessages(windowResult)\n\n if (windowTokens <= maxTokens) {\n return ok({\n messages: windowResult,\n originalTokens,\n compressedTokens: windowTokens,\n removedCount: windowRemoved,\n })\n }\n\n // 滑动窗口不够,对被移除的部分生成摘要\n const systemMessages = preserveSystem ? messages.filter(m => m.role === 'system') : []\n const nonSystem = messages.filter(m => m.role !== 'system' || !preserveSystem)\n const preservedMessages = nonSystem.slice(-preserveLastN)\n const toSummarize = nonSystem.slice(0, nonSystem.length - preserveLastN)\n\n if (toSummarize.length > 0) {\n const summaryResult = await summary.generate(toSummarize, { model: options?.summaryModel })\n if (!summaryResult.success)\n return summaryResult as HaiResult<never>\n\n const summaryText = summaryResult.data\n const summaryMessage: ChatMessage = {\n role: 'system',\n content: `[Conversation Summary]\\n${summaryText}`,\n }\n\n const compressed = [...systemMessages, summaryMessage, ...preservedMessages]\n const compressedTokens = token.estimateMessages(compressed)\n\n logger.trace('Hybrid compression completed', { originalTokens, compressedTokens, removedCount: toSummarize.length })\n return ok({\n messages: compressed,\n originalTokens,\n compressedTokens,\n removedCount: toSummarize.length,\n summary: summaryText,\n })\n }\n\n return ok({\n messages: windowResult,\n originalTokens,\n compressedTokens: windowTokens,\n removedCount: windowRemoved,\n })\n }\n catch (error) {\n logger.error('Context compression failed', { error })\n return err(HaiAIError.CONTEXT_COMPRESS_FAILED, aiM('ai_contextCompressFailed', { params: { error: String(error) } }), error)\n }\n }\n\n return {\n tryCompress,\n }\n}\n","/**\n * @h-ai/ai — 会话存储键\n *\n * 提供 LLM / Context / SessionStore 共用的复合存储键构造,确保不同交互主体\n * 使用相同 sessionId 时不会在会话目录(SessionInfo)与上下文正文上互相覆盖。\n * @module store/ai-store-key\n */\n\nimport type { InteractionScope } from './ai-store-types.js'\n\n/**\n * 构造会话存储的复合主键\n *\n * 用 JSON 数组序列化 `[objectId, sessionId]`,避免朴素拼接 `${objectId}:${sessionId}`\n * 在 id 本身含分隔符时产生碰撞(如 `a` + `b:c` 与 `a:b` + `c` 得到同一键),\n * 也避免不同主体相同 sessionId 因裸 sessionId 作主键而互相覆盖。\n *\n * LLM、Context 与 SessionStore 必须共用此实现。\n *\n * @param scope - 交互作用域(主体 ID + 会话 ID)\n * @returns 复合存储键\n */\nexport function sessionStoreKey(scope: InteractionScope): string {\n return JSON.stringify([scope.objectId, scope.sessionId])\n}\n","/**\n * @h-ai/ai — Context 子功能实现\n *\n * 聚合 Token、Summary、Compress 三个子模块,并在此基础上\n * 提供有状态的 ContextManager(多轮对话自动压缩 + 对话编排 + 持久化)。\n * @module ai-context-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { CompressConfig } from '../ai-config.js'\n\nimport type { CompressOperations } from '../compress/ai-compress-types.js'\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { AIRelStore, InteractionScope, SessionInfo } from '../store/ai-store-types.js'\nimport type { SummaryResult } from '../summary/ai-summary-types.js'\nimport type { TokenOperations } from '../token/ai-token-types.js'\nimport type {\n CommitTurnInput,\n ConsolidateOptions,\n ConsolidateResult,\n ContextChatOptions,\n ContextChatResult,\n ContextDeps,\n ContextManager,\n ContextManagerOptions,\n ContextOperations,\n ContextStreamEvent,\n ConversationTurn,\n} from './ai-context-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { createStreamProcessor } from '../llm/ai-llm-stream.js'\nimport { sessionStoreKey } from '../store/ai-store-key.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'context' })\n\n// ─── 持久化状态结构 ───\n\n/**\n * 持久化的上下文管理器状态\n */\ninterface PersistedContextState {\n messages: ChatMessage[]\n summaries: SummaryResult[]\n updatedAt: number\n}\n\n/**\n * 创建 Context 操作接口\n *\n * 聚合 Token、Summary、Compress 子模块,提供统一的上下文管理 API。\n * 若传入 deps(LLM / Memory / RAG / Reasoning),ContextManager 可提供\n * chat/chatStream 高层编排能力。\n *\n * @param compressConfig - Compress 配置(用于 ContextManager 的默认值)\n * @param tokenOps - Token 操作接口(由 token 子模块创建)\n * @param compressOps - Compress 操作接口(由 compress 子模块创建)\n * @param contextStore - 上下文状态存储(可选,用于持久化)\n * @param sessionStore - 会话信息存储(可选,用于目录管理)\n * @param deps - 可选子模块依赖(LLM / Memory / RAG / Reasoning)\n * @returns ContextOperations 实例\n */\nexport function createContextOperations(\n compressConfig: CompressConfig,\n tokenOps: TokenOperations,\n compressOps: CompressOperations,\n contextStore?: AIRelStore<PersistedContextState>,\n sessionStore?: AIRelStore<SessionInfo>,\n deps?: ContextDeps,\n): ContextOperations {\n /**\n * 计算有效的 maxTokens(用于 ContextManager 初始化)\n */\n function resolveMaxTokens(optionMaxTokens?: number): number {\n const fromOption = optionMaxTokens ?? compressConfig.defaultMaxTokens\n if (fromOption > 0)\n return fromOption\n return compressConfig.defaultMaxTokens > 0 ? compressConfig.defaultMaxTokens : 4096\n }\n\n /**\n * 创建 ContextManager 实例(共享逻辑)\n */\n function buildManager(\n options: ContextManagerOptions,\n initialMessages: ChatMessage[],\n initialSummaries: SummaryResult[],\n ): ContextManager {\n const scope = options.scope\n\n // 解析压缩参数\n const compress = options.compress\n const managerMaxTokens = resolveMaxTokens(compress?.maxTokens)\n const strategy = compress?.strategy ?? compressConfig.defaultStrategy\n const preserveSystem = compress?.preserveSystem ?? true\n const preserveLastN = compress?.preserveLastN ?? compressConfig.preserveLastN\n const autoCompress = compress?.auto ?? true\n const summaryModel = compress?.summaryModel\n\n const state = {\n messages: initialMessages,\n summaries: initialSummaries,\n }\n\n // 后台记忆提取任务集合:chat/chatStream 的自动提取是即发即忘,flush() 统一等待,\n // 避免「AI 回答结束→下一轮召回/生成总结→上一轮记忆仍未写完」的时序问题。\n const pendingMemoryTasks = new Set<Promise<unknown>>()\n\n // 记忆注入选项:将 scope / types / minImportance / 位置等完整透传给 Memory\n function memoryInjectionOptions() {\n return {\n objectId: scope?.objectId,\n scope: options.memory?.scope,\n types: options.memory?.types,\n minImportance: options.memory?.minImportance,\n topK: options.memory?.topK,\n maxTokens: options.memory?.maxTokens,\n position: options.memory?.position,\n }\n }\n\n // 触发一次后台记忆提取并纳入 pending 集合(scope / types / 模型 / systemPrompt 完整透传)\n function enqueueMemoryExtract(userMessage: string, reply: string): void {\n if (!options.memory?.enableExtract || !deps?.memory)\n return\n const recentMessages: ChatMessage[] = [\n { role: 'user', content: userMessage },\n { role: 'assistant', content: reply },\n ]\n const task = deps.memory\n .extract(recentMessages, {\n objectId: scope?.objectId,\n scope: options.memory.scope,\n types: options.memory.types,\n model: options.memory.extractionModel,\n systemPrompt: options.memory.extractionSystemPrompt,\n })\n .catch((e: unknown) => logger.warn('Memory extract failed', { error: e }))\n .finally(() => {\n pendingMemoryTasks.delete(task)\n })\n pendingMemoryTasks.add(task)\n }\n\n // ─── Conversation Commit Layer 状态 ───\n // turnCommit=auto(默认):生成即提交完整文本;manual:生成后登记待提交轮次,由 commit/interrupt 决定真实文本。\n const turnCommit = options.turnCommit ?? 'auto'\n const turns: ConversationTurn[] = []\n // 待提交轮次(manual 模式):turnId → 触发该轮的用户输入(用于提交时的记忆提取配对)\n const pendingCommits = new Map<string, string>()\n\n function generateTurnId(): string {\n return `turn_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`\n }\n\n // ─── 并发控制(单活动生成) ───\n // 默认单活动生成,防止「上一轮 AI 尚未退出,下一轮 user 消息先写入」的乱序。\n const concurrency = options.concurrency ?? 'reject'\n // 是否已有活动生成(含 manual 待提交轮次持有的屏障)\n let generationActive = false\n // queue 模式下的排队唤醒器(前一轮进入终态时按序移交所有权)\n const generationWaiters: Array<() => void> = []\n // turnId → 该生成的一次性释放句柄;manual 待提交轮次的屏障持续到 commit/interrupt。\n const generationHolders = new Map<string, () => void>()\n // 当前活动生成的内部取消控制器(reset 时可中断上游 LLM)\n let activeAbort: AbortController | null = null\n // 当前活动生成的释放句柄(reset 时强制放行下一轮,避免挂起的生成器长期占用屏障)\n let activeRelease: (() => void) | null = null\n // 生成纪元:reset 递增,使 reset 之前启动的生成不再把结果写回已重置的上下文\n let generationEpoch = 0\n\n // 系统提示词文本:用于 reset 后恢复;restore 时从首条 system 消息推导\n const systemPromptText = options.systemPrompt\n ?? (initialMessages[0]?.role === 'system' && typeof initialMessages[0].content === 'string'\n ? initialMessages[0].content\n : undefined)\n\n /**\n * 获取生成许可(单活动生成)。\n *\n * reject 模式下已有活动生成时立即返回 CONTEXT_BUSY;queue 模式下排队等待前一轮进入终态。\n * 返回本轮的内部取消信号与一次性释放句柄;调用方必须在轮次到达终态时释放。\n */\n async function acquireGeneration(): Promise<HaiResult<{ epoch: number, signal: AbortSignal, release: () => void }>> {\n if (generationActive) {\n if (concurrency === 'reject')\n return err(HaiAIError.CONTEXT_BUSY, aiM('ai_contextBusy'))\n // queue:排队等待被唤醒(唤醒即已接管所有权,generationActive 保持 true)\n await new Promise<void>((resolve) => {\n generationWaiters.push(resolve)\n })\n }\n else {\n generationActive = true\n }\n const abort = new AbortController()\n activeAbort = abort\n const epoch = generationEpoch\n let released = false\n const release = (): void => {\n if (released)\n return\n released = true\n if (activeAbort === abort)\n activeAbort = null\n if (activeRelease === release)\n activeRelease = null\n const next = generationWaiters.shift()\n if (next)\n next() // 移交所有权给下一个排队者(generationActive 保持 true)\n else\n generationActive = false\n }\n activeRelease = release\n return ok({ epoch, signal: abort.signal, release })\n }\n\n /**\n * 组合调用方信号与本轮内部取消信号(任一触发即取消上游生成)。\n */\n function combineSignal(caller: AbortSignal | undefined, internal: AbortSignal): AbortSignal {\n return caller ? AbortSignal.any([caller, internal]) : internal\n }\n\n /**\n * 释放某轮次持有的并发屏障(幂等)。\n */\n function releaseTurnHolder(turnId: string): void {\n const release = generationHolders.get(turnId)\n if (release) {\n generationHolders.delete(turnId)\n release()\n }\n }\n\n /**\n * 轮次是否已进入终态(completed / interrupted)。\n */\n function isTurnTerminal(turnId: string): boolean {\n const turn = turns.find(t => t.id === turnId)\n return !turn || turn.status === 'completed' || turn.status === 'interrupted'\n }\n\n /**\n * 生成结束后结算并发屏障:\n * - 轮次已终态:立即释放屏障;\n * - 轮次仍未终态(manual 待提交 / 取消后待提交):把释放责任移交该轮次,\n * 由后续 commitTurn / interruptTurn 释放,保证「打断→立即下一轮」的顺序屏障。\n */\n function settleGeneration(turnId: string | null, release: () => void): void {\n if (turnId && !isTurnTerminal(turnId))\n generationHolders.set(turnId, release)\n else\n release()\n }\n\n const manager: ContextManager = {\n scope,\n\n async addMessage(message: ChatMessage): Promise<HaiResult<void>> {\n state.messages.push(message)\n\n if (!autoCompress)\n return ok(undefined)\n\n const currentTokens = tokenOps.estimateMessages(state.messages)\n if (currentTokens <= managerMaxTokens)\n return ok(undefined)\n\n logger.trace('Auto-compressing context', { currentTokens, budget: managerMaxTokens })\n\n const compressResult = await compressOps.tryCompress(state.messages, {\n strategy: strategy as 'summary' | 'sliding-window' | 'hybrid',\n maxTokens: managerMaxTokens,\n preserveSystem,\n preserveLastN,\n summaryModel,\n })\n\n if (!compressResult.success) {\n logger.warn('Auto-compression failed, keeping original messages', { error: compressResult.error })\n return ok(undefined)\n }\n\n if (compressResult.data.summary) {\n state.summaries.push({\n summary: compressResult.data.summary,\n tokenCount: tokenOps.estimateText(compressResult.data.summary),\n coveredMessages: compressResult.data.removedCount,\n })\n }\n\n state.messages = compressResult.data.messages\n return ok(undefined)\n },\n\n getMessages(): HaiResult<ChatMessage[]> {\n return ok([...state.messages])\n },\n\n getTokenUsage(): HaiResult<{ current: number, budget: number }> {\n return ok({\n current: tokenOps.estimateMessages(state.messages),\n budget: managerMaxTokens,\n })\n },\n\n getSummaries(): HaiResult<SummaryResult[]> {\n return ok([...state.summaries])\n },\n\n async save(): Promise<HaiResult<void>> {\n // 持久化前先等待后台记忆提取完成,确保记忆已落库(issue #14)\n await manager.flush()\n\n if (!scope || !contextStore) {\n return ok(undefined)\n }\n try {\n const key = sessionStoreKey(scope)\n await contextStore.save(key, {\n messages: state.messages,\n summaries: state.summaries,\n updatedAt: Date.now(),\n }, { objectId: scope.objectId, sessionId: scope.sessionId })\n\n // 同步更新会话信息(与上下文正文共用同一复合键,避免不同主体相同 sessionId 互相覆盖)\n if (sessionStore) {\n const sessionKey = key\n const existing = await sessionStore.get(sessionKey)\n if (existing) {\n existing.updatedAt = Date.now()\n await sessionStore.save(sessionKey, existing, { objectId: existing.objectId })\n }\n else {\n await sessionStore.save(sessionKey, {\n sessionId: scope.sessionId,\n objectId: scope.objectId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n }, { objectId: scope.objectId })\n }\n }\n\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async reset(resetOpts?): Promise<HaiResult<void>> {\n const preserveSystemPrompt = resetOpts?.preserveSystemPrompt ?? true\n const cancelActiveTurn = resetOpts?.cancelActiveTurn ?? true\n const waitForMemoryTasks = resetOpts?.waitForMemoryTasks ?? false\n\n // 使 reset 之前启动的生成不再把结果写回已重置的上下文\n generationEpoch++\n\n if (cancelActiveTurn) {\n // 中断内部生成信号(best-effort 停止上游 LLM),并使所有非终态轮次进入终态、释放并发屏障\n activeAbort?.abort()\n for (const turn of turns) {\n if (turn.status === 'generating' || turn.status === 'speaking') {\n turn.status = 'interrupted'\n turn.committed = ''\n turn.committedAt = Date.now()\n releaseTurnHolder(turn.id)\n }\n }\n // 强制放行当前活动生成的屏障:挂起的生成器可能不会立即执行到 finally,避免长期占用\n activeRelease?.()\n }\n\n // 取消或等待旧记忆提取任务\n if (waitForMemoryTasks)\n await manager.flush()\n\n // 清空对话状态、轮次与待提交登记\n state.messages = []\n state.summaries = []\n turns.length = 0\n pendingCommits.clear()\n generationHolders.clear()\n\n // 默认重新写入系统提示词,避免 Persona / System Prompt 丢失\n if (preserveSystemPrompt && systemPromptText)\n state.messages.push({ role: 'system', content: systemPromptText })\n\n return ok(undefined)\n },\n\n getTurns(): HaiResult<ConversationTurn[]> {\n return ok(turns.map(t => ({ ...t })))\n },\n\n markTurnSpeaking(turnId: string): HaiResult<void> {\n const turn = turns.find(t => t.id === turnId)\n if (!turn)\n return err(HaiAIError.CONTEXT_TURN_NOT_FOUND, aiM('ai_turnNotFound', { params: { turnId } }))\n if (turn.status === 'generating')\n turn.status = 'speaking'\n return ok(undefined)\n },\n\n commitTurn(turnId: string, input?: CommitTurnInput): Promise<HaiResult<void>> {\n return finalizeCommit(turnId, input?.text, 'completed')\n },\n\n interruptTurn(turnId: string, input?: CommitTurnInput): Promise<HaiResult<void>> {\n return finalizeCommit(turnId, input?.text, 'interrupted')\n },\n\n async consolidate(consolidateOpts?: ConsolidateOptions): Promise<HaiResult<ConsolidateResult>> {\n if (!deps?.summary || !deps?.memory) {\n return err(HaiAIError.MEMORY_PROMOTE_FAILED, aiM('ai_memoryPromoteFailed', { params: { error: 'summary/memory deps unavailable' } }))\n }\n\n // 先等待后台记忆提取完成,避免固化时短期记忆尚未落库\n await manager.flush()\n\n try {\n // 1) 整合会话摘要:以历史摘要为前序上下文,对当前消息做增量摘要\n const previousSummary = state.summaries.map(s => s.summary).join('\\n\\n') || undefined\n const summaryResult = await deps.summary.generate(state.messages, {\n model: consolidateOpts?.model,\n previousSummary,\n })\n if (!summaryResult.success)\n return summaryResult\n const summaryText = summaryResult.data\n\n if (!summaryText.trim()) {\n return ok({ summary: summaryText, memories: [] })\n }\n\n // 2) 从摘要中提取长期记忆,写入持久作用域(默认取管理器 memory.scope,通常不含 sessionId)\n const durableScope = consolidateOpts?.scope ?? options.memory?.scope\n const extracted = await deps.memory.extract(\n [{ role: 'user', content: summaryText }],\n {\n objectId: scope?.objectId,\n scope: durableScope,\n types: consolidateOpts?.types ?? options.memory?.types,\n model: consolidateOpts?.model ?? options.memory?.extractionModel,\n systemPrompt: consolidateOpts?.extractionSystemPrompt ?? options.memory?.extractionSystemPrompt,\n },\n )\n if (!extracted.success)\n return extracted\n\n return ok({ summary: summaryText, memories: extracted.data })\n }\n catch (error) {\n logger.error('Context consolidate failed', { error })\n return err(HaiAIError.MEMORY_PROMOTE_FAILED, aiM('ai_memoryPromoteFailed', { params: { error: String(error) } }), error)\n }\n },\n\n get pendingMemoryTasks(): number {\n return pendingMemoryTasks.size\n },\n\n async flush(): Promise<HaiResult<void>> {\n // 快照当前任务集合后等待;提取任务失败已在 enqueue 处降级为 warn,不影响 flush 成功\n while (pendingMemoryTasks.size > 0) {\n await Promise.allSettled([...pendingMemoryTasks])\n }\n return ok(undefined)\n },\n\n // ─── chat/chatStream 编排 ───\n\n async chat(message: string, chatOpts?: ContextChatOptions): Promise<HaiResult<ContextChatResult>> {\n if (!deps?.llm) {\n return err(HaiAIError.NOT_INITIALIZED, aiM('ai_notInitialized'))\n }\n\n // 单活动生成:获取许可(reject 时直接返回 CONTEXT_BUSY)\n const acq = await acquireGeneration()\n if (!acq.success)\n return acq\n const { epoch, signal: internalSignal, release } = acq.data\n const signal = combineSignal(chatOpts?.signal, internalSignal)\n let turnId: string | null = null\n\n try {\n // 追加用户消息(自动压缩)\n const addResult = await manager.addMessage({ role: 'user', content: message })\n if (!addResult.success)\n return addResult\n\n // 获取当前消息列表\n const messagesResult = manager.getMessages()\n if (!messagesResult.success)\n return messagesResult\n let messages = messagesResult.data\n\n // 可选:注入记忆(scope / types / minImportance 完整透传)\n if (options.memory?.enable && deps.memory) {\n const injected = await deps.memory.injectMemories(messages, memoryInjectionOptions())\n if (injected.success) {\n messages = injected.data\n }\n }\n\n // 可选:RAG 检索增强 — 将检索结果作为 system 消息注入\n if (options.rag?.enable && deps.rag) {\n const ragResult = await deps.rag.query(message, {\n sources: options.rag.sources,\n topK: options.rag.topK,\n minScore: options.rag.minScore,\n enableRerank: options.rag.enableRerank,\n rerankModel: options.rag.rerankModel,\n model: chatOpts?.model ?? options.model,\n messages,\n enablePersist: false,\n signal,\n })\n if (ragResult.success) {\n // RAG query 已直接返回完整结果,将 answer 作为回复\n const reply = ragResult.data.answer\n turnId = await finalizeAssistantReply(message, reply, epoch)\n\n return ok({\n reply,\n model: ragResult.data.model,\n turnId,\n usage: ragResult.data.usage,\n })\n }\n }\n\n // 可选:推理引擎\n if (options.reasoning?.enable && deps.reasoning) {\n const reasonResult = await deps.reasoning.run(message, {\n strategy: options.reasoning.strategy,\n maxRounds: options.reasoning.maxRounds,\n model: chatOpts?.model ?? options.model,\n temperature: chatOpts?.temperature ?? options.temperature,\n messages,\n tools: options.tools,\n objectId: scope?.objectId,\n sessionId: scope?.sessionId,\n enablePersist: false,\n signal,\n })\n if (reasonResult.success) {\n const reply = reasonResult.data.answer\n turnId = await finalizeAssistantReply(message, reply, epoch)\n\n return ok({ reply, model: chatOpts?.model ?? options.model ?? '', turnId, usage: undefined })\n }\n }\n\n // 普通 LLM 调用(含工具调用循环)\n const toolDefs = options.tools?.getDefinitions()\n const maxToolRounds = options.maxToolRounds ?? 10\n let lastModel = ''\n let lastUsage: { prompt_tokens: number, completion_tokens: number, total_tokens: number } | undefined\n\n for (let round = 0; round <= maxToolRounds; round++) {\n const chatResult = await deps.llm.chat({\n model: chatOpts?.model ?? options.model,\n messages,\n temperature: chatOpts?.temperature ?? options.temperature,\n objectId: scope?.objectId,\n sessionId: scope?.sessionId,\n tools: toolDefs,\n tool_choice: toolDefs ? 'auto' : undefined,\n enablePersist: chatOpts?.enablePersist ?? false,\n signal,\n })\n\n if (!chatResult.success)\n return chatResult\n\n const choice = chatResult.data.choices[0]\n lastModel = chatResult.data.model\n if (chatResult.data.usage) {\n lastUsage = {\n prompt_tokens: chatResult.data.usage.prompt_tokens,\n completion_tokens: chatResult.data.usage.completion_tokens,\n total_tokens: chatResult.data.usage.total_tokens,\n }\n }\n\n if (!choice)\n break\n\n const assistantMessage = choice.message\n\n // 有工具调用且注册表可用:执行工具并将结果回传 LLM\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0 && options.tools) {\n messages.push(assistantMessage)\n\n for (const toolCall of assistantMessage.tool_calls) {\n if (toolCall.type !== 'function')\n continue\n const toolResult = await options.tools.execute(toolCall, { signal, objectId: scope?.objectId, sessionId: scope?.sessionId })\n const rawContent = toolResult.success\n ? toolResult.data.content\n : `Tool error: ${toolResult.error.message}`\n const toolContent = typeof rawContent === 'string'\n ? rawContent\n : (rawContent as Array<{ text?: string }>).map(p => p.text ?? '').join(' ')\n\n messages.push({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: toolContent,\n })\n }\n continue\n }\n\n // 无工具调用:提取文本回复\n const reply = typeof assistantMessage.content === 'string' ? assistantMessage.content : ''\n\n // 完成本轮生成:auto 直接提交完整文本,manual 登记待提交轮次\n turnId = await finalizeAssistantReply(message, reply, epoch)\n\n return ok({ reply, model: lastModel, turnId, usage: lastUsage })\n }\n\n // 达到最大工具调用轮次,返回最后可用的回复\n const lastAssistantMsg = messages.filter(m => m.role === 'assistant').pop()\n const fallbackReply = lastAssistantMsg && 'content' in lastAssistantMsg && typeof lastAssistantMsg.content === 'string'\n ? lastAssistantMsg.content\n : ''\n turnId = await finalizeAssistantReply(message, fallbackReply, epoch)\n return ok({ reply: fallbackReply, model: lastModel, turnId, usage: lastUsage })\n }\n catch (error) {\n logger.error('Context chat failed', { error })\n return err(HaiAIError.INTERNAL_ERROR, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n finally {\n // 结算并发屏障:auto 已终态立即释放;manual 待提交轮次的屏障移交 commit/interrupt\n settleGeneration(turnId, release)\n }\n },\n\n async* chatStream(message: string, chatOpts?: ContextChatOptions): AsyncIterable<ContextStreamEvent> {\n if (!deps?.llm) {\n throw new Error('LLM not initialized: deps.llm is required for chatStream')\n }\n\n // 单活动生成:获取许可(reject 时抛出 CONTEXT_BUSY,供调用方 for-await 捕获)\n const acq = await acquireGeneration()\n if (!acq.success)\n throw core.error.buildHaiErrorInst(HaiAIError.CONTEXT_BUSY, aiM('ai_contextBusy'))\n const { signal: internalSignal, release } = acq.data\n const signal = combineSignal(chatOpts?.signal, internalSignal)\n let streamTurn: ConversationTurn | null = null\n\n try {\n // 追加用户消息\n await manager.addMessage({ role: 'user', content: message })\n\n // 获取消息列表\n const messagesResult = manager.getMessages()\n if (!messagesResult.success) {\n throw new Error(`Failed to get messages: ${String(messagesResult.error)}`)\n }\n let messages = messagesResult.data\n\n // 可选:注入记忆(scope / types / minImportance 完整透传)\n if (options.memory?.enable && deps.memory) {\n const injected = await deps.memory.injectMemories(messages, memoryInjectionOptions())\n if (injected.success) {\n messages = injected.data\n }\n }\n\n // 调用上游模型前先登记轮次(含配对用户输入)并广播 turn_started:\n // 中途取消(AbortSignal)时仍能保留 turnId 与已生成文本,供调用方用真实内容 commit/interrupt。\n const turn = beginStreamTurn(message)\n streamTurn = turn\n yield { type: 'turn_started', turnId: turn.id }\n\n try {\n // 可选:RAG 流式检索增强\n if (options.rag?.enable && deps.rag) {\n let fullReply = ''\n let model = ''\n let usage: { prompt_tokens: number, completion_tokens: number, total_tokens: number } | undefined\n\n for await (const event of deps.rag.queryStream(message, {\n sources: options.rag.sources,\n topK: options.rag.topK,\n minScore: options.rag.minScore,\n enableRerank: options.rag.enableRerank,\n rerankModel: options.rag.rerankModel,\n model: chatOpts?.model ?? options.model,\n messages,\n enablePersist: false,\n signal,\n })) {\n if (event.type === 'delta') {\n fullReply += event.text\n turn.generated = fullReply\n yield { type: 'delta', text: event.text }\n }\n else if (event.type === 'done') {\n fullReply = event.answer\n model = event.model\n usage = event.usage\n }\n }\n\n // 轮次若已被 interruptTurn 打断进入终态,则不得再产出 `done`,避免业务层误判为正常完成。\n if (await completeStreamTurn(turn, fullReply))\n yield { type: 'done', reply: fullReply, model, turnId: turn.id, usage }\n return\n }\n\n // 可选:Reasoning 流式推理\n if (options.reasoning?.enable && deps.reasoning) {\n let fullReply = ''\n\n for await (const event of deps.reasoning.runStream(message, {\n strategy: options.reasoning.strategy,\n maxRounds: options.reasoning.maxRounds,\n model: chatOpts?.model ?? options.model,\n temperature: chatOpts?.temperature ?? options.temperature,\n messages,\n tools: options.tools,\n objectId: scope?.objectId,\n sessionId: scope?.sessionId,\n enablePersist: false,\n signal,\n })) {\n if (event.type === 'delta') {\n fullReply += event.text\n turn.generated = fullReply\n yield { type: 'delta', text: event.text }\n }\n }\n\n // 轮次若已被 interruptTurn 打断进入终态,则不得再产出 `done`,避免业务层误判为正常完成。\n if (await completeStreamTurn(turn, fullReply))\n yield { type: 'done', reply: fullReply, model: chatOpts?.model ?? options.model ?? '', turnId: turn.id, usage: undefined }\n return\n }\n\n // 普通流式 LLM 调用(含工具调用循环)\n const toolDefs = options.tools?.getDefinitions()\n const maxToolRounds = options.maxToolRounds ?? 10\n\n let fullReply = ''\n let model = ''\n let usage: { prompt_tokens: number, completion_tokens: number, total_tokens: number } | undefined\n\n for (let round = 0; round <= maxToolRounds; round++) {\n const processor = createStreamProcessor()\n\n const stream = deps.llm.chatStream({\n model: chatOpts?.model ?? options.model,\n messages,\n temperature: chatOpts?.temperature ?? options.temperature,\n objectId: scope?.objectId,\n sessionId: scope?.sessionId,\n tools: toolDefs,\n tool_choice: toolDefs ? 'auto' : undefined,\n enablePersist: chatOpts?.enablePersist ?? false,\n signal,\n })\n\n for await (const chunk of stream) {\n processor.process(chunk)\n\n if (!model && chunk.model)\n model = chunk.model\n const delta = chunk.choices?.[0]?.delta?.content\n if (delta) {\n fullReply += delta\n turn.generated = fullReply\n yield { type: 'delta', text: delta }\n }\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens,\n completion_tokens: chunk.usage.completion_tokens,\n total_tokens: chunk.usage.total_tokens,\n }\n }\n }\n\n const streamResult = processor.getResult()\n\n // 有工具调用:执行工具并继续下一轮\n if (streamResult.toolCalls.length > 0 && options.tools) {\n messages.push(processor.toAssistantMessage())\n\n for (const toolCall of streamResult.toolCalls) {\n if (toolCall.type !== 'function')\n continue\n yield { type: 'tool_call', name: toolCall.function.name, arguments: toolCall.function.arguments }\n\n const toolResult = await options.tools.execute(toolCall, { signal, objectId: scope?.objectId, sessionId: scope?.sessionId })\n const rawContent = toolResult.success\n ? toolResult.data.content\n : `Tool error: ${toolResult.error.message}`\n const toolContent = typeof rawContent === 'string'\n ? rawContent\n : (rawContent as Array<{ text?: string }>).map(p => p.text ?? '').join(' ')\n\n yield { type: 'tool_result', name: toolCall.function.name, content: toolContent, success: toolResult.success }\n\n messages.push({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: toolContent,\n })\n }\n\n // 重置本轮生成文本,下一轮 LLM 会产出最终文本\n fullReply = ''\n turn.generated = ''\n continue\n }\n\n // 无工具调用:结束循环\n break\n }\n\n // 轮次若已被 interruptTurn 打断进入终态,则不得再产出 `done`,避免业务层误判为正常完成。\n if (await completeStreamTurn(turn, fullReply))\n yield { type: 'done', reply: fullReply, model, turnId: turn.id, usage }\n }\n catch (error) {\n // 上游生成被取消(AbortSignal,含 reset 触发的内部取消):保留 generating 轮次与已生成文本\n // (pendingCommits 已在 beginStreamTurn 登记),由调用方用真实内容 commit/interrupt;\n // 若已被 interrupt 进入终态则忽略。\n if (signal.aborted) {\n yield { type: 'cancelled', turnId: turn.id, generated: turn.generated }\n return\n }\n throw error\n }\n }\n finally {\n // 结算并发屏障:auto 已终态立即释放;manual / 取消后待提交轮次的屏障移交 commit/interrupt\n settleGeneration(streamTurn?.id ?? null, release)\n }\n },\n }\n\n /**\n * 登记一个流式生成的待完成轮次(`generating`)并立即记录配对用户输入。\n *\n * chatStream 在调用上游模型前调用。用户输入在此刻写入 pendingCommits,使得即便调用方在流\n * 进入 catch 前就 interruptTurn,也能触发正确的记忆提取;中途取消时也能保留已生成文本,\n * 由调用方用真实内容通过 commitTurn / interruptTurn 提交。\n */\n function beginStreamTurn(userMessage: string): ConversationTurn {\n const turn: ConversationTurn = {\n id: generateTurnId(),\n speaker: 'assistant',\n generated: '',\n committed: '',\n status: 'generating',\n createdAt: Date.now(),\n }\n turns.push(turn)\n // 立即登记配对用户输入:即便调用方在流进入 catch 前就 interruptTurn,也能触发正确的记忆提取\n pendingCommits.set(turn.id, userMessage)\n return turn\n }\n\n /**\n * 完成一次流式生成:写入最终文本。\n *\n * 已被 commitTurn / interruptTurn 打断进入终态(completed/interrupted)时**不再覆盖**,\n * 避免上游流恰好完成时把完整文本写回已打断的轮次。\n * auto 模式:把生成文本写入上下文并触发记忆提取,轮次置为 `completed`。\n * manual 模式:保持 `generating`,pendingCommits 已在 beginStreamTurn 登记,等待 commit/interrupt。\n *\n * @returns `false` 表示该轮已在别处进入终态(如被 interruptTurn 打断),调用方不得再产出 `done`;\n * `true` 表示本次正常完成,可产出 `done`。\n */\n async function completeStreamTurn(turn: ConversationTurn, finalText: string): Promise<boolean> {\n if (turn.status === 'completed' || turn.status === 'interrupted')\n return false\n turn.generated = finalText\n if (turnCommit === 'auto') {\n turn.committed = finalText\n turn.status = 'completed'\n turn.committedAt = Date.now()\n const userMessage = pendingCommits.get(turn.id) ?? ''\n pendingCommits.delete(turn.id)\n if (finalText)\n await manager.addMessage({ role: 'assistant', content: finalText })\n enqueueMemoryExtract(userMessage, finalText)\n }\n return true\n }\n\n /**\n * 完成一次 assistant 生成。\n *\n * auto 模式:把完整生成文本写入上下文并触发记忆提取,轮次直接 `completed`。\n * manual 模式:仅登记 `generating` 轮次并记录配对用户输入,等待 commit/interrupt。\n *\n * `epoch` 用于识别生成期间是否发生过 reset:若纪元已变化,说明上下文已被重置,\n * 丢弃本轮结果(不写入 turns / 上下文 / 记忆),避免旧生成污染重置后的上下文。\n *\n * @returns 该轮 turnId(供 manual 模式后续提交)\n */\n async function finalizeAssistantReply(userMessage: string, generated: string, epoch: number): Promise<string> {\n const turnId = generateTurnId()\n // reset 已发生:丢弃本轮,不写入 turns / 上下文 / 记忆\n if (epoch !== generationEpoch)\n return turnId\n\n const now = Date.now()\n const turn: ConversationTurn = {\n id: turnId,\n speaker: 'assistant',\n generated,\n committed: turnCommit === 'auto' ? generated : '',\n status: turnCommit === 'auto' ? 'completed' : 'generating',\n createdAt: now,\n committedAt: turnCommit === 'auto' ? now : undefined,\n }\n turns.push(turn)\n\n if (turnCommit === 'auto') {\n if (generated)\n await manager.addMessage({ role: 'assistant', content: generated })\n enqueueMemoryExtract(userMessage, generated)\n }\n else {\n pendingCommits.set(turnId, userMessage)\n }\n return turnId\n }\n\n /**\n * 提交 / 打断一个待提交轮次:把真实文本写入上下文并触发记忆提取。\n */\n async function finalizeCommit(\n turnId: string,\n text: string | undefined,\n status: 'completed' | 'interrupted',\n ): Promise<HaiResult<void>> {\n const turn = turns.find(t => t.id === turnId)\n if (!turn)\n return err(HaiAIError.CONTEXT_TURN_NOT_FOUND, aiM('ai_turnNotFound', { params: { turnId } }))\n if (turn.status === 'completed' || turn.status === 'interrupted')\n return err(HaiAIError.CONTEXT_TURN_INVALID_STATE, aiM('ai_turnInvalidState', { params: { turnId } }))\n\n const committed = text ?? (status === 'completed' ? turn.generated : '')\n turn.committed = committed\n turn.status = status\n turn.committedAt = Date.now()\n\n const userMessage = pendingCommits.get(turnId)\n pendingCommits.delete(turnId)\n\n // 只有真实表达出去的内容才进入对话状态与记忆\n if (committed) {\n await manager.addMessage({ role: 'assistant', content: committed })\n if (userMessage !== undefined)\n enqueueMemoryExtract(userMessage, committed)\n }\n\n // 释放该轮次持有的并发屏障(manual / 取消后待提交轮次),放行下一轮生成\n releaseTurnHolder(turnId)\n return ok(undefined)\n }\n\n return manager\n }\n\n return {\n /**\n * 创建有状态上下文管理器\n */\n createManager(options?: ContextManagerOptions): HaiResult<ContextManager> {\n const opts = options ?? {}\n\n const manager = buildManager(\n opts,\n [],\n [],\n )\n\n // 如果有系统提示词,将其作为第一条 system 消息\n if (opts.systemPrompt) {\n void manager.addMessage({ role: 'system', content: opts.systemPrompt })\n }\n\n return ok(manager)\n },\n\n /**\n * 从存储恢复管理器实例\n */\n async restoreManager(scope: InteractionScope, options?: Omit<ContextManagerOptions, 'scope'>): Promise<HaiResult<ContextManager>> {\n const opts = { ...options, scope } as ContextManagerOptions\n\n let initialMessages: ChatMessage[] = []\n let initialSummaries: SummaryResult[] = []\n\n // 从存储恢复\n if (contextStore) {\n const key = sessionStoreKey(scope)\n const persisted = await contextStore.get(key)\n if (persisted) {\n initialMessages = persisted.messages\n initialSummaries = persisted.summaries\n logger.trace('Context manager restored from store', { scope, messageCount: initialMessages.length })\n }\n }\n\n const manager = buildManager(\n // 恢复时不再追加 systemPrompt(历史中已有)\n { ...opts, systemPrompt: undefined },\n initialMessages,\n initialSummaries,\n )\n\n return ok(manager)\n },\n\n /**\n * 列出指定对象的所有会话\n */\n async listSessions(objectId: string): Promise<HaiResult<SessionInfo[]>> {\n if (!sessionStore) {\n return ok([])\n }\n\n try {\n const sessions = await sessionStore.query({\n objectId,\n orderBy: { field: 'updatedAt', direction: 'desc' },\n })\n return ok(sessions)\n }\n catch (error) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async renameSession(scope: InteractionScope, title: string): Promise<HaiResult<void>> {\n if (!sessionStore) {\n return ok(undefined)\n }\n\n try {\n const sessionKey = sessionStoreKey(scope)\n const existing = await sessionStore.get(sessionKey)\n if (!existing) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: `Session not found: ${scope.sessionId}` } }))\n }\n existing.title = title\n existing.updatedAt = Date.now()\n await sessionStore.save(sessionKey, existing, { objectId: existing.objectId })\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async removeSession(scope: InteractionScope): Promise<HaiResult<void>> {\n if (!sessionStore) {\n return ok(undefined)\n }\n\n try {\n // 上下文正文与会话元数据共用同一复合键,确保删除时正文不残留\n const sessionKey = sessionStoreKey(scope)\n if (contextStore)\n await contextStore.remove(sessionKey)\n await sessionStore.remove(sessionKey)\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — Embedding 子功能实现\n *\n * 基于 OpenAI Embeddings API 的向量嵌入实现。\n * @module ai-embedding-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig, EmbeddingConfig, ResolvedModelConfig } from '../ai-config.js'\n\nimport type {\n EmbeddingOperations,\n EmbeddingRequest,\n EmbeddingResponse,\n} from './ai-embedding-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport OpenAI from 'openai'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'embedding' })\n\n/**\n * 创建 Embedding 操作接口\n *\n * 提供文本向量嵌入能力,支持单条、批量和原始请求三种模式。\n * 内部复用同一个 OpenAI 客户端实例,批量请求按 batchSize 自动拆分。\n *\n * @param config - 校验后的 AI 配置(apiKey / baseUrl 来自 llm 配置,dimensions / batchSize 来自 embedding 配置)\n * @returns EmbeddingOperations 实例(`embed` / `embedText` / `embedBatch`)\n */\nexport function createEmbeddingOperations(config: AIConfig): EmbeddingOperations {\n const embeddingConfig: EmbeddingConfig = config.embedding ?? { batchSize: 100 }\n\n /**\n * 缓存的 OpenAI 客户端实例(按 apiKey + baseURL + timeout 缓存,避免不同端点共用同一个客户端)\n */\n let cachedClient: OpenAI | null = null\n let cachedResolvedKey: string | undefined\n\n /**\n * 获取或创建 OpenAI 客户端(首次调用时初始化,后续复用同一实例)\n */\n function getOrCreateClient(resolved: ResolvedModelConfig) {\n const apiKey = resolved.apiKey\n const baseURL = resolved.baseUrl\n const timeout = resolved.timeout\n const cacheKey = `${apiKey}::${baseURL}::${timeout}`\n\n // 如果端点或超时配置变化,需要重建客户端\n if (cachedClient && cachedResolvedKey === cacheKey)\n return cachedClient\n\n cachedClient = new OpenAI({ apiKey, baseURL, timeout })\n cachedResolvedKey = cacheKey\n return cachedClient\n }\n\n /**\n * 调用 OpenAI Embeddings API(单次请求)\n */\n async function callEmbeddingAPI(request: EmbeddingRequest): Promise<HaiResult<EmbeddingResponse>> {\n const resolvedResult = resolveModelEntry(config.llm, 'embedding', request.model, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for embedding' } }),\n })\n if (!resolvedResult.success)\n return resolvedResult\n const resolved = resolvedResult.data\n\n const input = Array.isArray(request.input) ? request.input : [request.input]\n\n try {\n const client = getOrCreateClient(resolved)\n\n const params: Parameters<typeof client.embeddings.create>[0] = {\n model: resolved.model,\n input,\n }\n\n if (request.dimensions ?? embeddingConfig.dimensions) {\n params.dimensions = request.dimensions ?? embeddingConfig.dimensions\n }\n\n const response = await client.embeddings.create(params)\n\n return ok({\n model: response.model,\n data: response.data.map(item => ({\n index: item.index,\n embedding: item.embedding,\n })),\n usage: {\n prompt_tokens: response.usage.prompt_tokens,\n total_tokens: response.usage.total_tokens,\n },\n })\n }\n catch (error) {\n logger.error('Embedding API call failed', { error })\n return err(HaiAIError.EMBEDDING_API_ERROR, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n }\n\n /**\n * 对外统一嵌入入口:单条 / 批量都复用同一套分批逻辑\n */\n async function embedRequest(request: EmbeddingRequest): Promise<HaiResult<EmbeddingResponse>> {\n const input = Array.isArray(request.input) ? request.input : [request.input]\n const batchSize = embeddingConfig.batchSize\n\n // 如果输入不超过 batchSize,直接调用\n if (input.length <= batchSize) {\n return callEmbeddingAPI(request)\n }\n\n // 批量处理:按 batchSize 分组\n const allData: EmbeddingResponse['data'] = []\n let totalPromptTokens = 0\n let totalTokens = 0\n let resultModel = ''\n\n for (let i = 0; i < input.length; i += batchSize) {\n const batch = input.slice(i, i + batchSize)\n const result = await callEmbeddingAPI({ ...request, input: batch })\n if (!result.success)\n return result\n\n resultModel = result.data.model\n totalPromptTokens += result.data.usage.prompt_tokens\n totalTokens += result.data.usage.total_tokens\n\n // 调整 index 以反映全局位置\n for (const item of result.data.data) {\n allData.push({\n index: i + item.index,\n embedding: item.embedding,\n })\n }\n }\n\n return ok({\n model: resultModel,\n data: allData,\n usage: { prompt_tokens: totalPromptTokens, total_tokens: totalTokens },\n })\n }\n\n return {\n async embed(request: EmbeddingRequest): Promise<HaiResult<EmbeddingResponse>> {\n return embedRequest(request)\n },\n\n async embedText(text: string): Promise<HaiResult<number[]>> {\n const result = await embedRequest({ input: text })\n if (!result.success)\n return result\n const first = result.data.data.find(item => item.index === 0)\n if (!first) {\n return err(HaiAIError.EMBEDDING_API_ERROR, aiM('ai_internalError', { params: { error: 'Embedding result is empty' } }))\n }\n return ok(first.embedding)\n },\n\n async embedBatch(texts: string[]): Promise<HaiResult<number[][]>> {\n const result = await embedRequest({ input: texts })\n if (!result.success)\n return result\n const sorted = [...result.data.data].sort((a, b) => a.index - b.index)\n return ok(sorted.map(item => item.embedding))\n },\n }\n}\n","/**\n * @h-ai/ai — File 子功能实现\n *\n * 支持多格式文件内容提取:文本、HTML、PDF、DOCX 和 OCR 图片识别。\n * @module ai-file-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig } from '../ai-config.js'\n\nimport type { LLMOperations } from '../llm/ai-llm-types.js'\nimport type {\n FileOperations,\n FileParseMethod,\n FileParseRequest,\n FileParseResult,\n OutputFormat,\n} from './ai-file-types.js'\n\nimport { Buffer } from 'node:buffer'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'file' })\nconst HTML_SCRIPT_BLOCK_REGEX = /<script[^>]*>[\\s\\S]*?<\\/script[^>]*>/gi\nconst HTML_STYLE_BLOCK_REGEX = /<style[^>]*>[\\s\\S]*?<\\/style[^>]*>/gi\nconst HTML_LIST_OPEN_TAG_REGEX = /<[ou]l[^>]*>/gi\nconst HTML_LIST_CLOSE_TAG_REGEX = /<\\/[ou]l>/gi\nconst HTML_BOLD_TAG_REGEX = /<(?:strong|b)[^>]*>([\\s\\S]*?)<\\/(?:strong|b)>/gi\nconst HTML_ITALIC_TAG_REGEX = /<(?:em|i)[^>]*>([\\s\\S]*?)<\\/(?:em|i)>/gi\nconst HTML_LINK_TAG_REGEX = /<a[^>]+href=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/a>/gi\nconst HTML_IMAGE_TAG_REGEX = /<img([^>]*)>/gi\nconst HTML_IMAGE_SRC_ATTR_REGEX = /src=\"([^\"]*)\"/\nconst HTML_IMAGE_ALT_ATTR_REGEX = /alt=\"([^\"]*)\"/\nconst HTML_INLINE_CODE_TAG_REGEX = /<code[^>]*>([\\s\\S]*?)<\\/code>/gi\nconst HTML_TABLE_ROW_REGEX = /<tr[^>]*>([\\s\\S]*?)<\\/tr>/gi\nconst HTML_TABLE_CELL_REGEX = /<t[dh][^>]*>([\\s\\S]*?)<\\/t[dh]>/gi\nconst HTML_TABLE_CONTAINER_TAG_REGEX = /<\\/?t(?:able|head|body|foot)[^>]*>/gi\nconst HTML_TABLE_ELEMENT_TAG_REGEX = /<\\/?t[rdh][^>]*>/gi\nconst HTML_LINE_BREAK_REGEX = /<br\\s*\\/?>/gi\nconst HTML_BLOCK_CLOSE_TAG_REGEX = /<\\/(?:p|div|section|article|header|footer|main|nav|aside)>/gi\nconst HTML_BLOCK_OPEN_TAG_REGEX = /<(?:p|div|section|article|header|footer|main|nav|aside)[^>]*>/gi\nconst HTML_ANY_TAG_REGEX = /<[^>]+>/g\nconst MULTI_LINE_BREAK_REGEX = /\\n{3,}/g\n\n// ─── MIME 类型与扩展名映射 ───\n\n/** 文本 MIME 类型集合(直接解码) */\nconst TEXT_MIME_TYPES = new Set([\n 'text/plain',\n 'text/markdown',\n 'text/x-markdown',\n 'text/csv',\n 'application/json',\n 'application/xml',\n 'text/xml',\n 'text/x-yaml',\n 'application/yaml',\n])\n\n/** 图片 MIME 类型集合(OCR) */\nconst IMAGE_MIME_TYPES = new Set([\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/bmp',\n 'image/tiff',\n])\n\n/** 文件扩展名 → MIME 类型映射 */\nconst EXT_TO_MIME: Record<string, string> = {\n txt: 'text/plain',\n md: 'text/markdown',\n markdown: 'text/markdown',\n csv: 'text/csv',\n json: 'application/json',\n xml: 'application/xml',\n yaml: 'text/x-yaml',\n yml: 'text/x-yaml',\n html: 'text/html',\n htm: 'text/html',\n pdf: 'application/pdf',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n doc: 'application/msword',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n tiff: 'image/tiff',\n tif: 'image/tiff',\n}\n\n/** 根据文件内容的 magic bytes 检测 MIME 类型 */\nfunction detectMimeFromMagicBytes(buffer: Buffer): string | undefined {\n if (buffer.length < 4)\n return undefined\n // PDF: %PDF\n if (buffer[0] === 0x25 && buffer[1] === 0x50 && buffer[2] === 0x44 && buffer[3] === 0x46) {\n return 'application/pdf'\n }\n // PNG: \\x89PNG\n if (buffer[0] === 0x89 && buffer[1] === 0x50 && buffer[2] === 0x4E && buffer[3] === 0x47) {\n return 'image/png'\n }\n // JPEG: \\xFF\\xD8\n if (buffer[0] === 0xFF && buffer[1] === 0xD8) {\n return 'image/jpeg'\n }\n // GIF: GIF8\n if (buffer[0] === 0x47 && buffer[1] === 0x49 && buffer[2] === 0x46 && buffer[3] === 0x38) {\n return 'image/gif'\n }\n // RIFF/WebP\n if (\n buffer[0] === 0x52 && buffer[1] === 0x49 && buffer[2] === 0x46 && buffer[3] === 0x46\n && buffer.length >= 12 && buffer[8] === 0x57 && buffer[9] === 0x45 && buffer[10] === 0x42 && buffer[11] === 0x50\n ) {\n return 'image/webp'\n }\n // ZIP (DOCX is ZIP-based): PK\\x03\\x04\n if (buffer[0] === 0x50 && buffer[1] === 0x4B && buffer[2] === 0x03 && buffer[3] === 0x04) {\n return 'application/zip'\n }\n return undefined\n}\n\n/**\n * 检测文件 MIME 类型\n *\n * 优先顺序:显式指定 > 文件名扩展名 > magic bytes > 默认 text/plain\n */\nfunction detectMimeType(content: Buffer | string, filename?: string, explicitMime?: string): string {\n if (explicitMime)\n return explicitMime.toLowerCase()\n\n if (filename) {\n const ext = filename.split('.').pop()?.toLowerCase()\n if (ext && ext in EXT_TO_MIME) {\n return EXT_TO_MIME[ext]\n }\n }\n\n if (Buffer.isBuffer(content)) {\n const detected = detectMimeFromMagicBytes(content)\n if (detected)\n return detected\n }\n\n return 'text/plain'\n}\n\n/**\n * 解析文本格式内容(UTF-8 解码)\n */\nfunction parseTextContent(content: Buffer | string): string {\n if (typeof content === 'string')\n return content\n return content.toString('utf-8')\n}\n\n/** HTML 实体名称映射表 */\nconst HTML_ENTITIES: Record<string, string> = {\n amp: '&',\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: '\\'',\n nbsp: ' ',\n mdash: '—',\n ndash: '–',\n ldquo: '\\u201C',\n rdquo: '\\u201D',\n lsquo: '\\u2018',\n rsquo: '\\u2019',\n hellip: '…',\n copy: '©',\n reg: '®',\n trade: '™',\n}\n\n/** 解码 HTML 实体(命名实体 + 十进制/十六进制数字实体) */\nfunction decodeHtmlEntities(text: string): string {\n return text.replace(/&(?:#(\\d+)|#x([\\dA-Fa-f]+)|([A-Za-z]+));/g, (match, dec, hex, named) => {\n if (dec !== undefined)\n return String.fromCharCode(Number.parseInt(dec, 10))\n if (hex !== undefined)\n return String.fromCharCode(Number.parseInt(hex, 16))\n return HTML_ENTITIES[named] ?? match\n })\n}\n\n/** 剥除 HTML 标签,仅保留文本内容 */\nfunction stripTags(html: string): string {\n return html.replace(HTML_ANY_TAG_REGEX, '')\n}\n\n/**\n * 解析 HTML,剥除标签并提取纯文本\n */\nfunction parseHtmlContent(content: Buffer | string): string {\n const html = parseTextContent(content)\n const noScript = html.replace(HTML_SCRIPT_BLOCK_REGEX, ' ')\n const noStyle = noScript.replace(HTML_STYLE_BLOCK_REGEX, ' ')\n const noTags = noStyle.replace(HTML_ANY_TAG_REGEX, ' ')\n return decodeHtmlEntities(noTags).replace(/\\s+/g, ' ').trim()\n}\n\n/**\n * 将 HTML 转换为 Markdown\n *\n * 保留常见文档结构:标题、列表、粗体/斜体、超链接、代码块、水平线。\n * 不支持的复杂结构(如嵌套表格、内联样式)将降级为纯文本。\n */\nfunction htmlToMarkdown(content: Buffer | string): string {\n let md = parseTextContent(content)\n\n // 移除 script / style 块\n md = md.replace(HTML_SCRIPT_BLOCK_REGEX, '')\n md = md.replace(HTML_STYLE_BLOCK_REGEX, '')\n\n // 代码块(pre > code,先处理避免内部标签被转换)\n md = md.replace(/<pre[^>]*>\\s*<code[^>]*>([\\s\\S]*?)<\\/code>\\s*<\\/pre>/gi, (_, code) =>\n `\\n\\`\\`\\`\\n${decodeHtmlEntities(stripTags(code)).trim()}\\n\\`\\`\\`\\n`)\n md = md.replace(/<pre[^>]*>([\\s\\S]*?)<\\/pre>/gi, (_, code) =>\n `\\n\\`\\`\\`\\n${decodeHtmlEntities(stripTags(code)).trim()}\\n\\`\\`\\`\\n`)\n\n // 标题 h1–h6\n for (let level = 1; level <= 6; level++) {\n md = md.replace(\n new RegExp(`<h${level}[^>]*>([\\\\s\\\\S]*?)<\\\\/h${level}>`, 'gi'),\n (_, c) => `\\n${'#'.repeat(level)} ${stripTags(c).trim()}\\n`,\n )\n }\n\n // 水平线\n md = md.replace(/<hr\\s*\\/?>/gi, '\\n\\n---\\n\\n')\n\n // 引用块\n md = md.replace(/<blockquote[^>]*>([\\s\\S]*?)<\\/blockquote>/gi, (_, c) =>\n stripTags(c).trim().split('\\n').map(l => `> ${l.trim()}`).filter(l => l !== '> ').join('\\n'))\n\n // 列表项\n md = md.replace(HTML_LIST_OPEN_TAG_REGEX, '\\n')\n md = md.replace(HTML_LIST_CLOSE_TAG_REGEX, '\\n')\n md = md.replace(/<li[^>]*>([\\s\\S]*?)<\\/li>/gi, (_, c) => `\\n- ${stripTags(c).trim()}`)\n\n // 粗体 / 斜体\n md = md.replace(HTML_BOLD_TAG_REGEX, (_, c) => `**${stripTags(c).trim()}**`)\n md = md.replace(HTML_ITALIC_TAG_REGEX, (_, c) => `*${stripTags(c).trim()}*`)\n\n // 超链接\n md = md.replace(HTML_LINK_TAG_REGEX, (_, href, text) =>\n `[${stripTags(text).trim()}](${href})`)\n\n // 图片(src/alt 属性顺序不定,逐属性提取)\n md = md.replace(HTML_IMAGE_TAG_REGEX, (_, attrs: string) => {\n const src = attrs.match(HTML_IMAGE_SRC_ATTR_REGEX)?.[1] ?? ''\n const alt = attrs.match(HTML_IMAGE_ALT_ATTR_REGEX)?.[1] ?? ''\n return ``\n })\n\n // 行内代码\n md = md.replace(HTML_INLINE_CODE_TAG_REGEX, (_, c) =>\n `\\`${decodeHtmlEntities(stripTags(c))}\\``)\n\n // 表格(简化:每行单元格用 | 分隔)\n md = md.replace(HTML_TABLE_ROW_REGEX, (_, row) => {\n const cells = [...row.matchAll(HTML_TABLE_CELL_REGEX)]\n return `| ${cells.map(([, c]) => stripTags(c).trim()).join(' | ')} |\\n`\n })\n md = md.replace(HTML_TABLE_CONTAINER_TAG_REGEX, '')\n md = md.replace(HTML_TABLE_ELEMENT_TAG_REGEX, '')\n\n // 换行与段落\n md = md.replace(HTML_LINE_BREAK_REGEX, '\\n')\n md = md.replace(HTML_BLOCK_CLOSE_TAG_REGEX, '\\n\\n')\n md = md.replace(HTML_BLOCK_OPEN_TAG_REGEX, '')\n\n // 移除剩余标签并解码实体\n md = md.replace(HTML_ANY_TAG_REGEX, '')\n md = decodeHtmlEntities(md)\n\n return md.replace(MULTI_LINE_BREAK_REGEX, '\\n\\n').trim()\n}\n\n/**\n * 使用 pdfjs-dist 解析 PDF 内容\n */\nasync function parsePdfContent(content: Buffer, outputFormat: OutputFormat = 'text', maxPages?: number): Promise<HaiResult<{ text: string, pageCount: number }>> {\n try {\n const pdfjs = await import(\n\n // @ts-expect-error — pdfjs-dist is an optional peer dependency\n 'pdfjs-dist/legacy/build/pdf.mjs',\n ) as { getDocument: (...args: unknown[]) => { promise: Promise<unknown> } }\n const loadingTask = pdfjs.getDocument({ data: new Uint8Array(content) })\n const pdf = await loadingTask.promise as {\n numPages: number\n getPage: (n: number) => Promise<{ getTextContent: () => Promise<{ items: Array<{ str?: string }> }> }>\n }\n const totalPages = pdf.numPages\n const pagesToProcess = maxPages ? Math.min(maxPages, totalPages) : totalPages\n const textParts: string[] = []\n\n for (let i = 1; i <= pagesToProcess; i++) {\n const page = await pdf.getPage(i)\n const textContent = await page.getTextContent()\n const pageText = textContent.items\n .map(item => item.str ?? '')\n .join(' ')\n textParts.push(pageText)\n }\n\n // markdown 模式用页分隔线区分每页\n const separator = outputFormat === 'markdown' ? '\\n\\n---\\n\\n' : '\\n\\n'\n return ok({ text: textParts.join(separator), pageCount: totalPages })\n }\n catch (error) {\n return err(HaiAIError.FILE_PARSE_FAILED, aiM('ai_fileParseFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 使用 mammoth 解析 DOCX 内容\n *\n * - `'text'`:使用 `extractRawText` 提取纯文本\n * - `'markdown'`:使用 `convertToHtml` 后转换为 Markdown\n */\nasync function parseDocxContent(content: Buffer, outputFormat: OutputFormat = 'text'): Promise<HaiResult<string>> {\n try {\n const mammoth = await import(\n\n // @ts-expect-error — mammoth is an optional peer dependency\n 'mammoth',\n ) as {\n extractRawText: (options: unknown) => Promise<{ value: string }>\n convertToHtml: (options: unknown) => Promise<{ value: string }>\n }\n if (outputFormat === 'markdown') {\n const result = await mammoth.convertToHtml({ buffer: content })\n return ok(htmlToMarkdown(result.value))\n }\n const result = await mammoth.extractRawText({ buffer: content })\n return ok(result.value)\n }\n catch (error) {\n return err(HaiAIError.FILE_PARSE_FAILED, aiM('ai_fileParseFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 使用视觉 LLM 进行 OCR 图片识别\n */\nasync function parseImageWithOcr(\n content: Buffer,\n mimeType: string,\n llmOps: LLMOperations,\n model?: string,\n outputFormat: OutputFormat = 'text',\n customPrompt?: string,\n): Promise<HaiResult<string>> {\n const base64 = content.toString('base64')\n const dataUrl = `data:${mimeType};base64,${base64}`\n const defaultPrompt = outputFormat === 'markdown'\n ? 'Please extract all text content from this image as Markdown, preserving document structure (headings, bullet lists, bold/italic). Return only the Markdown without additional commentary.'\n : 'Please extract all text content from this image accurately. Return only the extracted text without any additional commentary.'\n const prompt = customPrompt ?? defaultPrompt\n\n logger.trace('Running OCR via vision LLM', { mimeType, model })\n\n const result = await llmOps.chat({\n model,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: { url: dataUrl, detail: 'high' },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ],\n })\n\n if (!result.success) {\n return err(HaiAIError.FILE_OCR_FAILED, aiM('ai_fileOcrFailed', { params: { error: result.error.message } }), result.error)\n }\n\n return ok(result.data.choices[0]?.message?.content ?? '')\n}\n\n/**\n * 创建 File 操作接口\n *\n * @param config - 校验后的 AI 配置\n * @param llmOps - LLM 操作接口(用于 OCR)\n * @returns FileOperations 实例\n */\nexport function createFileOperations(config: AIConfig, llmOps: LLMOperations): FileOperations {\n /**\n * 统一 OCR 执行入口:解析模型配置 → 调用视觉 LLM → 包装结果\n *\n * 调用方负责确保 content 为 Buffer 类型。\n */\n async function runOcr(\n content: Buffer,\n mimeType: string,\n filename: string | undefined,\n model: string | undefined,\n outputFormat: OutputFormat,\n systemPrompt: string | undefined,\n ): Promise<HaiResult<FileParseResult>> {\n const resolvedResult = resolveModelEntry(config.llm, 'ocr', model, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for OCR' } }),\n })\n if (!resolvedResult.success)\n return resolvedResult\n\n const ocrResult = await parseImageWithOcr(\n content,\n mimeType,\n llmOps,\n resolvedResult.data.model,\n outputFormat,\n systemPrompt,\n )\n if (!ocrResult.success)\n return ocrResult\n\n return ok({\n text: ocrResult.data,\n method: 'ocr' as FileParseMethod,\n metadata: { filename, mimeType, charCount: ocrResult.data.length },\n })\n }\n\n /**\n * 核心解析逻辑\n */\n async function doParse(request: FileParseRequest): Promise<HaiResult<FileParseResult>> {\n const { content, filename, options = {} } = request\n const mimeType = detectMimeType(content, filename, options.mimeType)\n const outputFormat: OutputFormat = options.outputFormat ?? 'text'\n\n logger.trace('Parsing file', { filename, mimeType, outputFormat, useOcr: options.useOcr })\n\n // 强制 OCR 模式\n if (options.useOcr) {\n if (!Buffer.isBuffer(content)) {\n return err(HaiAIError.FILE_INVALID_CONTENT, aiM('ai_fileInvalidContent', { params: { reason: 'OCR requires Buffer content' } }))\n }\n return runOcr(content, mimeType, filename, options.model, outputFormat, options.systemPrompt)\n }\n\n // 文本格式:直接解码(markdown 不改变纯文本语义)\n if (TEXT_MIME_TYPES.has(mimeType)) {\n const text = parseTextContent(content)\n return ok({\n text,\n method: 'text' as FileParseMethod,\n metadata: { filename, mimeType, charCount: text.length },\n })\n }\n\n // HTML:按输出格式选择解析方式\n if (mimeType === 'text/html') {\n const text = outputFormat === 'markdown' ? htmlToMarkdown(content) : parseHtmlContent(content)\n return ok({\n text,\n method: 'html' as FileParseMethod,\n metadata: { filename, mimeType, charCount: text.length },\n })\n }\n\n // PDF:尝试 pdfjs-dist,失败则回退 OCR\n if (mimeType === 'application/pdf') {\n if (!Buffer.isBuffer(content)) {\n return err(HaiAIError.FILE_INVALID_CONTENT, aiM('ai_fileInvalidContent', { params: { reason: 'PDF parsing requires Buffer content' } }))\n }\n const pdfResult = await parsePdfContent(content, outputFormat, options.maxPages)\n if (pdfResult.success) {\n return ok({\n text: pdfResult.data.text,\n method: 'pdf' as FileParseMethod,\n pageCount: pdfResult.data.pageCount,\n metadata: { filename, mimeType, charCount: pdfResult.data.text.length },\n })\n }\n logger.warn('PDF native parser failed, falling back to OCR', { filename })\n return runOcr(content, mimeType, filename, options.model, outputFormat, options.systemPrompt)\n }\n\n // DOCX:尝试 mammoth,失败则回退 OCR\n if (\n mimeType === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n || mimeType === 'application/msword'\n || mimeType === 'application/zip'\n ) {\n if (!Buffer.isBuffer(content)) {\n return err(HaiAIError.FILE_INVALID_CONTENT, aiM('ai_fileInvalidContent', { params: { reason: 'DOCX parsing requires Buffer content' } }))\n }\n const docxResult = await parseDocxContent(content, outputFormat)\n if (docxResult.success) {\n return ok({\n text: docxResult.data,\n method: 'docx' as FileParseMethod,\n metadata: { filename, mimeType, charCount: docxResult.data.length },\n })\n }\n logger.warn('DOCX native parser failed, falling back to OCR', { filename })\n return runOcr(content, mimeType, filename, options.model, outputFormat, options.systemPrompt)\n }\n\n // 图片格式:OCR\n if (IMAGE_MIME_TYPES.has(mimeType)) {\n if (!Buffer.isBuffer(content)) {\n return err(HaiAIError.FILE_INVALID_CONTENT, aiM('ai_fileInvalidContent', { params: { reason: 'Image OCR requires Buffer content' } }))\n }\n return runOcr(content, mimeType, filename, options.model, outputFormat, options.systemPrompt)\n }\n\n // 其他格式:不支持\n return err(HaiAIError.FILE_UNSUPPORTED_FORMAT, aiM('ai_fileUnsupportedFormat', { params: { mimeType } }))\n }\n\n return {\n async parse(request: FileParseRequest): Promise<HaiResult<FileParseResult>> {\n try {\n return await doParse(request)\n }\n catch (error) {\n logger.error('File parse failed unexpectedly', { filename: request.filename, error })\n return err(HaiAIError.FILE_PARSE_FAILED, aiM('ai_fileParseFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async parseText(content: Buffer | string, filename?: string): Promise<HaiResult<string>> {\n const result = await this.parse({ content, filename })\n if (!result.success)\n return result\n return ok(result.data.text)\n },\n }\n}\n","/**\n * @h-ai/ai — Knowledge 实体提取\n *\n * 使用 LLM 从文本中提取命名实体(人名、项目名、概念等)。\n * @module ai-knowledge-entity\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { LLMOperations } from '../llm/ai-llm-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'knowledge-entity' })\nconst LEADING_MARKDOWN_FENCE_REGEX = /^```(?:json)?\\n?/\nconst TRAILING_MARKDOWN_FENCE_REGEX = /\\n?```$/\n\n// ─── 提取结果类型 ───\n\n/**\n * LLM 实体提取结果(单条)\n */\nexport interface ExtractedEntity {\n /** 实体名称 */\n name: string\n /** 实体类型(内置类型或用户自定义类型) */\n type: string\n /** 别名列表 */\n aliases?: string[]\n /** 简短描述 */\n description?: string\n}\n\n// ─── Prompt ───\n\n/** 默认实体类型列表 */\nexport const DEFAULT_ENTITY_TYPES = ['person', 'project', 'concept', 'organization', 'location', 'event', 'other']\n\n/**\n * 根据实体类型列表生成实体提取系统提示词\n */\nfunction buildEntityExtractionPrompt(entityTypes: string[]): string {\n const typeList = entityTypes.map(t => `\"${t}\"`).join(', ')\n return `You are a named entity extraction assistant. Extract named entities from the given text.\n\nReturn a JSON array of entities. Each entity has:\n- \"name\": the primary name (string, required)\n- \"type\": one of ${typeList} (required)\n- \"aliases\": alternative names or abbreviations (string array, optional)\n- \"description\": a one-sentence description (string, optional)\n\nRules:\n- Only extract clearly mentioned entities. Do NOT infer or guess.\n- Deduplicate: if the same entity appears with different names, merge into one entry with aliases.\n- Be precise and concise.\n- Return an empty array [] if no entities are found.\n- Return ONLY the JSON array, no markdown fences, no explanation.`\n}\n\n/**\n * 从文本中提取实体\n *\n * 调用 LLM 分析文本,返回结构化的实体列表。\n *\n * @param llm - LLM 操作接口\n * @param text - 待提取的文本(通常是单个 chunk 的内容)\n * @param model - 模型名称覆盖(可选)\n * @param entityTypes - 实体类型列表(可选,默认使用内置类型)\n * @param systemPrompt - 系统提示词覆盖(可选,默认根据 entityTypes 自动生成)\n * @returns 提取到的实体列表\n */\nexport async function extractEntities(\n llm: LLMOperations,\n text: string,\n model?: string,\n entityTypes?: string[],\n systemPrompt?: string,\n): Promise<HaiResult<ExtractedEntity[]>> {\n if (!text.trim()) {\n return ok([])\n }\n\n const resolvedTypes = entityTypes ?? DEFAULT_ENTITY_TYPES\n const resolvedPrompt = systemPrompt ?? buildEntityExtractionPrompt(resolvedTypes)\n\n try {\n const chatResult = await llm.chat({\n model,\n messages: [\n { role: 'system', content: resolvedPrompt },\n { role: 'user', content: text },\n ],\n temperature: 0.1,\n enablePersist: false,\n })\n\n if (!chatResult.success) {\n logger.warn('Entity extraction LLM call failed', { error: chatResult.error })\n return err(HaiAIError.KNOWLEDGE_ENTITY_EXTRACT_FAILED, aiM('ai_knowledgeEntityExtractFailed', { params: { error: String(chatResult.error.message) } }), chatResult.error)\n }\n\n const content = chatResult.data.choices[0]?.message?.content ?? ''\n\n // 解析 JSON 响应\n const validTypes = new Set(resolvedTypes)\n const entities = parseEntityResponse(content, validTypes)\n logger.trace('Entity extraction completed', { textLength: text.length, entityCount: entities.length })\n\n return ok(entities)\n }\n catch (error) {\n logger.error('Entity extraction failed', { error })\n return err(HaiAIError.KNOWLEDGE_ENTITY_EXTRACT_FAILED, aiM('ai_knowledgeEntityExtractFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 解析 LLM 返回的实体 JSON\n *\n * 容错处理:去除 markdown 代码围栏、尝试 JSON.parse。\n */\nfunction parseEntityResponse(content: string, validTypes: Set<string>): ExtractedEntity[] {\n let cleaned = content.trim()\n\n // 去除 markdown 代码围栏\n if (cleaned.startsWith('```')) {\n cleaned = cleaned.replace(LEADING_MARKDOWN_FENCE_REGEX, '').replace(TRAILING_MARKDOWN_FENCE_REGEX, '')\n }\n\n try {\n const parsed = JSON.parse(cleaned) as unknown\n\n // 可能是数组\n if (Array.isArray(parsed)) {\n return parsed\n .filter(isValidEntity)\n .map(e => normalizeEntity(e, validTypes))\n }\n\n // 可能是 { entities: [...] } 包装\n if (typeof parsed === 'object' && parsed !== null && 'entities' in parsed) {\n const entities = (parsed as { entities: unknown }).entities\n if (Array.isArray(entities)) {\n return entities.filter(isValidEntity).map(e => normalizeEntity(e, validTypes))\n }\n }\n\n logger.warn('Entity extraction returned unexpected format', { content: content.slice(0, 200) })\n return []\n }\n catch {\n logger.warn('Entity extraction returned invalid JSON', { content: content.slice(0, 200) })\n return []\n }\n}\n\n/**\n * 校验实体结构\n */\nfunction isValidEntity(item: unknown): item is Record<string, unknown> {\n if (typeof item !== 'object' || item === null)\n return false\n const obj = item as Record<string, unknown>\n return typeof obj.name === 'string' && obj.name.length > 0\n && typeof obj.type === 'string'\n}\n\n/**\n * 标准化实体\n *\n * @param item - 原始实体对象\n * @param validTypes - 合法类型集合(不在集合内的归为 'other')\n */\nfunction normalizeEntity(item: Record<string, unknown>, validTypes: Set<string>): ExtractedEntity {\n const type = validTypes.has(item.type as string) ? item.type as string : 'other'\n\n return {\n name: (item.name as string).trim(),\n type,\n aliases: Array.isArray(item.aliases) ? (item.aliases as string[]).map(String) : undefined,\n description: typeof item.description === 'string' ? item.description.trim() : undefined,\n }\n}\n\n/**\n/**\n * 批量提取实体并去重合并\n *\n * 对多个 chunk 并发提取,合并同名实体。\n *\n * @param llm - LLM 操作接口\n * @param chunks - 文本块列表\n * @param model - 模型名称覆盖(可选)\n * @param entityTypes - 实体类型列表(可选,默认使用内置类型)\n * @param systemPrompt - 系统提示词覆盖(可选)\n * @param concurrency - 并发数(默认 3)\n * @returns 去重合并后的实体列表\n */\nexport async function extractEntitiesBatch(\n llm: LLMOperations,\n chunks: Array<{ content: string, chunkId: string }>,\n model?: string,\n entityTypes?: string[],\n systemPrompt?: string,\n concurrency = 3,\n): Promise<HaiResult<Array<ExtractedEntity & { chunkIds: string[] }>>> {\n // 简单并发控制:按批次执行\n const allEntities: Array<{ entity: ExtractedEntity, chunkId: string }> = []\n\n for (let i = 0; i < chunks.length; i += concurrency) {\n const batch = chunks.slice(i, i + concurrency)\n const results = await Promise.all(\n batch.map(async (chunk) => {\n const result = await extractEntities(llm, chunk.content, model, entityTypes, systemPrompt)\n if (result.success) {\n return result.data.map(e => ({ entity: e, chunkId: chunk.chunkId }))\n }\n logger.warn('Entity extraction failed for chunk', { chunkId: chunk.chunkId })\n return []\n }),\n )\n\n for (const entities of results) {\n allEntities.push(...entities)\n }\n }\n\n // 去重合并:按名称(忽略大小写)分组\n const entityMap = new Map<string, ExtractedEntity & { chunkIds: string[] }>()\n\n for (const { entity, chunkId } of allEntities) {\n const key = entity.name.toLowerCase()\n const existing = entityMap.get(key)\n\n if (existing) {\n // 合并 chunkIds\n if (!existing.chunkIds.includes(chunkId)) {\n existing.chunkIds.push(chunkId)\n }\n // 合并别名\n if (entity.aliases) {\n const existingAliases = new Set(existing.aliases ?? [])\n for (const alias of entity.aliases) {\n existingAliases.add(alias)\n }\n existing.aliases = Array.from(existingAliases)\n }\n // 使用更详细的描述\n if (entity.description && (!existing.description || entity.description.length > existing.description.length)) {\n existing.description = entity.description\n }\n }\n else {\n entityMap.set(key, { ...entity, chunkIds: [chunkId] })\n }\n }\n\n return ok(Array.from(entityMap.values()))\n}\n","/**\n * @h-ai/ai — Knowledge 子功能实现\n *\n * 编排 datapipe + KnowledgeStore + embedding + LLM,\n * 实现文档导入、实体索引、信源追踪检索。\n * @module ai-knowledge-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ChunkOptionsInput, CleanOptionsInput, DatapipeFunctions } from '@h-ai/datapipe'\nimport type { KnowledgeConfig } from '../ai-config.js'\n\nimport type { EmbeddingOperations } from '../embedding/ai-embedding-types.js'\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type { Citation } from '../retrieval/ai-retrieval-types.js'\nimport type { KnowledgeStore } from '../store/ai-store-types.js'\nimport type {\n EntityDocumentResult,\n EntityListOptions,\n EntityQueryOptions,\n KnowledgeAskOptions,\n KnowledgeAskResult,\n KnowledgeDocumentInfo,\n KnowledgeDocumentListOptions,\n KnowledgeDocumentRemoveOptions,\n KnowledgeEntity,\n KnowledgeIngestBatchProgress,\n KnowledgeIngestBatchResult,\n KnowledgeIngestFileInput,\n KnowledgeIngestInput,\n KnowledgeIngestResult,\n KnowledgeOperations,\n KnowledgeRetrieveItem,\n KnowledgeRetrieveOptions,\n KnowledgeRetrieveResult,\n KnowledgeSetupOptions,\n} from './ai-knowledge-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { nanoid } from 'nanoid'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { extractEntities, extractEntitiesBatch } from './ai-knowledge-entity.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'knowledge' })\n\n// ─── 默认提示词 ───\n\nconst DEFAULT_KNOWLEDGE_ASK_SYSTEM_PROMPT = `You are an expert assistant. Answer the user's question based ONLY on the provided context.\n\nRules:\n- Cite sources using [N] notation where N matches the context item number.\n- If the context doesn't contain enough information, say so honestly.\n- Be precise and factual.\n- Prefer direct quotes when appropriate.`\n\n/**\n * 创建 Knowledge 操作接口\n *\n * 编排 datapipe → embedding → KnowledgeStore(向量存储 + 实体倒排索引),\n * 实现文档导入、语义检索与实体增强。\n *\n * @param config - Knowledge 配置(分块策略、向量集合、实体提取开关等)\n * @param llm - LLM 操作(用于实体提取和问答生成)\n * @param embedding - Embedding 操作(用于文本向量化)\n * @param datapipe - datapipe 实例(必选,用于文本清洗与分块)\n * @param store - KnowledgeStore 实例(可选,未提供时 knowledge 子系统不可用)\n * @returns KnowledgeOperations 实例\n */\nexport function createKnowledgeOperations(\n config: KnowledgeConfig,\n llm: LLMOperations,\n embedding: EmbeddingOperations,\n datapipe: DatapipeFunctions,\n store?: KnowledgeStore,\n): KnowledgeOperations {\n /**\n * 检查 collection 是否已就绪(cache-aside:先查进程内缓存,未命中则查 DB 注册表并回填缓存)\n *\n * 支持多节点场景:其他节点完成 setup 后,本节点通过 DB 查询亦可感知。\n */\n async function isCollectionReady(collection: string): Promise<boolean> {\n if (!store)\n return false\n return await store.collectionExists(collection)\n }\n\n return {\n // ─── setup ───\n /**\n * 初始化知识库(幂等,支持多次调用以初始化不同 collection)\n *\n * 创建 vecdb 集合(已存在则跳过)和 reldb 实体索引表(DDL 幂等)。\n * **每个 collection 在使用 `ingest` / `retrieve` / `ask` 前必须先对该 collection 执行 `setup`。**\n * 多分场景下可多次调用本方法,每次传入不同 `collection` 名称。\n *\n * @param options - 可选覆盖(collection 名称、向量维度)\n * @returns `ok(undefined)` 成功;建表失败时返回 `KNOWLEDGE_SETUP_FAILED`\n */\n async setup(options?: KnowledgeSetupOptions): Promise<HaiResult<void>> {\n if (!store) {\n return err(HaiAIError.KNOWLEDGE_SETUP_FAILED, aiM('ai_knowledgeSetupFailed', { params: { error: 'KnowledgeStore not available. Provider may not support knowledge operations.' } }))\n }\n\n const collection = options?.collection ?? config.collection\n const dimension = options?.dimension ?? config.dimension\n\n logger.debug('Setting up knowledge base', { collection, dimension })\n\n try {\n await store.initialize(collection, dimension)\n await store.registerCollection(collection, dimension)\n\n logger.debug('Knowledge base setup completed', { collection })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Knowledge base setup failed', { error })\n return err(HaiAIError.KNOWLEDGE_SETUP_FAILED, aiM('ai_knowledgeSetupFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── ingest ───\n /**\n * 导入文档到知识库\n *\n * 流程:清洗 → 分块 → Embedding 向量化 → 存入 vecdb;\n * 可选地提取命名实体并建立倒排索引(实体增强相关度)。\n *\n * @param input - 导入输入(documentId、content、可选 cleanOptions / chunkOptions / metadata 等)\n * @returns `ok(KnowledgeIngestResult)` 含导入信息;未初始化时返回 `KNOWLEDGE_NOT_SETUP`\n *\n * @example\n * ```ts\n * await knowledge.ingest({\n * documentId: 'doc-001',\n * content: '文章内容...',\n * chunkOptions: { maxSize: 512 },\n * })\n * ```\n */\n async ingest(input: KnowledgeIngestInput): Promise<HaiResult<KnowledgeIngestResult>> {\n const collection = input.collection ?? config.collection\n if (!await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n const startTime = Date.now()\n const enableEntityExtraction = input.enableEntityExtraction ?? config.enableEntityExtraction\n // 合并 config 默认值与 input 覆盖选项(input 优先级更高)\n const cleanOptions: CleanOptionsInput = {\n ...config.cleanOptions,\n ...input.cleanOptions,\n }\n const chunkOptions: ChunkOptionsInput = {\n ...config.chunkOptions,\n ...input.chunkOptions,\n }\n\n logger.trace('Ingesting document', { documentId: input.documentId, collection, contentLength: input.content.length })\n\n try {\n // ① 清洗:标准化文本(去 HTML、空白规整等)\n const cleanResult = datapipe.clean(input.content, cleanOptions)\n const cleanedText = cleanResult.success ? cleanResult.data : input.content\n\n // ② 分块:按指定策略切割(分块失败退回整文本单一 chunk)\n const chunkResult = datapipe.chunk(cleanedText, chunkOptions)\n const chunks: Array<{ index: number, content: string, metadata?: Record<string, unknown> }> = chunkResult.success\n ? chunkResult.data\n : [{ index: 0, content: cleanedText }]\n\n // ③ 批量向量化\n const texts = chunks.map(c => c.content)\n const embedResult = await embedding.embedBatch(texts)\n if (!embedResult.success) {\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: 'Embedding failed' } }), embedResult.error)\n }\n\n // ④ 存入 vecdb\n const vectorDocuments = chunks.map((chunk, i) => {\n const chunkId = `${input.documentId}:chunk-${chunk.index}`\n return {\n id: chunkId,\n vector: embedResult.data[i],\n content: chunk.content,\n metadata: {\n ...input.metadata,\n ...chunk.metadata,\n documentId: input.documentId,\n title: input.title,\n url: input.url,\n position: `chunk:${chunk.index}`,\n chunkIndex: chunk.index,\n },\n }\n })\n\n await store!.upsertVectors(collection, vectorDocuments)\n\n // ④.b 记录文档元数据\n await store!.upsertDocument({\n documentId: input.documentId,\n collection,\n title: input.title,\n url: input.url,\n chunkCount: chunks.length,\n createdAt: Date.now(),\n })\n\n // ⑤ 实体提取(可选)\n const extractedEntities: KnowledgeEntity[] = []\n\n if (enableEntityExtraction) {\n const chunkInputs = chunks.map(chunk => ({\n content: chunk.content,\n chunkId: `${input.documentId}:chunk-${chunk.index}`,\n }))\n\n const entityResult = await extractEntitiesBatch(llm, chunkInputs, undefined, config.entityTypes, config.systemPrompt)\n if (entityResult.success) {\n // ⑥ 写入 reldb\n for (const entity of entityResult.data) {\n const entityId = `ent-${nanoid(12)}`\n const knowledgeEntity: KnowledgeEntity = {\n id: entityId,\n name: entity.name,\n type: entity.type,\n aliases: entity.aliases,\n description: entity.description,\n }\n extractedEntities.push(knowledgeEntity)\n\n // 插入实体\n await store!.upsertEntity({\n id: entityId,\n name: entity.name,\n type: entity.type,\n collection,\n aliases: entity.aliases,\n description: entity.description,\n })\n\n // 插入文档-实体关联(每个命中的 chunkId 建一条倒排记录)\n for (const chunkId of entity.chunkIds) {\n await store!.insertEntityDocument({\n entityId,\n documentId: input.documentId,\n chunkId,\n collection,\n relevance: 1.0,\n context: chunks.find(c => `${input.documentId}:chunk-${c.index}` === chunkId)?.content?.slice(0, 200),\n })\n }\n }\n }\n else {\n logger.warn('Entity extraction failed, skipping', { error: entityResult.error })\n }\n }\n\n const duration = Date.now() - startTime\n logger.debug('Document ingested', {\n documentId: input.documentId,\n chunkCount: chunks.length,\n entityCount: extractedEntities.length,\n duration,\n })\n\n return ok({\n documentId: input.documentId,\n chunkCount: chunks.length,\n entities: extractedEntities,\n duration,\n })\n }\n catch (error) {\n logger.error('Document ingestion failed', { documentId: input.documentId, error })\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── retrieve ───\n /**\n * 语义检索知识库\n *\n * 1. 将查询向量化 → 2. vecdb 向量搜索 → 3. 实体增强(可选):\n * LLM 提取查询中的命名实体,查实体倒排索引对匹配文档加权重排。\n *\n * @param query - 查询文本\n * @param options - 可选(collection、topK、minScore、enableEntityBoost、filter 等)\n * @returns `ok(KnowledgeRetrieveResult)` 含检索项和引用列表;未初始化时返回 `KNOWLEDGE_NOT_SETUP`\n */\n async retrieve(query: string, options?: KnowledgeRetrieveOptions): Promise<HaiResult<KnowledgeRetrieveResult>> {\n const collection = options?.collection ?? config.collection\n if (!await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n const startTime = Date.now()\n const topK = options?.topK ?? 10\n const enableEntityBoost = options?.enableEntityBoost ?? true\n\n logger.trace('Knowledge retrieval', { query: query.slice(0, 100), collection, topK })\n\n try {\n // ① 向量化查询\n const embedResult = await embedding.embedText(query)\n if (!embedResult.success) {\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: 'Query embedding failed' } }), embedResult.error)\n }\n\n // ② 向量搜索\n const searchHits = await store!.searchVectors(collection, embedResult.data, {\n topK: topK * 2, // 多取一些,后续合并后再截断\n minScore: options?.minScore,\n filter: options?.filter,\n })\n\n // 构建结果项\n const itemMap = new Map<string, KnowledgeRetrieveItem>()\n for (const hit of searchHits) {\n const metadata = hit.metadata ?? {}\n const citation: Citation = {\n documentId: metadata.documentId as string | undefined,\n title: metadata.title as string | undefined,\n url: metadata.url as string | undefined,\n position: metadata.position as string | undefined,\n chunkId: hit.id,\n collection,\n }\n\n itemMap.set(hit.id, {\n id: hit.id,\n content: hit.content ?? '',\n score: hit.score,\n citation,\n metadata,\n matchedEntities: [],\n })\n }\n\n // ③ 实体增强(可选):先用 LLM 从查询中提取命名实体,再查倒排索引对向量结果加权\n if (enableEntityBoost) {\n const queryEntityResult = await extractEntities(\n llm,\n query,\n undefined,\n config.entityTypes,\n config.systemPrompt,\n )\n const queryEntityNames = queryEntityResult.success\n ? queryEntityResult.data.map(e => e.name)\n : []\n\n if (queryEntityNames.length > 0) {\n // 合并多个实体名的匹配结果(Map 保证去重)\n const entityMap = new Map<string, { id: string, name: string, type: string, aliases: string[] }>()\n for (const name of queryEntityNames) {\n const entities = await store!.findEntitiesByName(name, collection)\n for (const e of entities)\n entityMap.set(e.id, e)\n }\n\n if (entityMap.size > 0) {\n const entityIds = Array.from(entityMap.keys())\n const entityNameMap = new Map(Array.from(entityMap.values()).map(e => [e.id, e.name]))\n\n const docRelations = await store!.findDocumentsByEntityIds(entityIds, collection)\n const boostWeight = config.entityBoostWeight\n\n for (const relation of docRelations) {\n const chunkKey = relation.chunkId || relation.documentId\n const entityName = entityNameMap.get(relation.entityId) ?? ''\n\n for (const [itemId, item] of itemMap) {\n const itemDocId = item.metadata?.documentId as string | undefined\n if (itemId === chunkKey || itemDocId === relation.documentId) {\n item.score += boostWeight * relation.relevance\n if (entityName && !item.matchedEntities!.includes(entityName)) {\n item.matchedEntities!.push(entityName)\n }\n }\n }\n }\n }\n }\n }\n\n // 排序 + 截断\n const items = Array.from(itemMap.values())\n .sort((a, b) => b.score - a.score)\n .slice(0, topK)\n\n // 去重信源引用\n const citationMap = new Map<string, Citation>()\n for (const item of items) {\n const key = item.citation.documentId ?? item.citation.chunkId ?? item.id\n if (!citationMap.has(key)) {\n citationMap.set(key, item.citation)\n }\n }\n\n const duration = Date.now() - startTime\n logger.trace('Knowledge retrieval completed', { resultCount: items.length, duration })\n\n return ok({\n items,\n citations: Array.from(citationMap.values()),\n query,\n duration,\n })\n }\n catch (error) {\n logger.error('Knowledge retrieval failed', { error })\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── ask ───\n /**\n * 基于知识库回答问题(RAG 模式)\n *\n * 内部调用 `retrieve` 获取相关文档,将检索结果格式化为上下文后和历史消息一起发送给 LLM 生成回答。\n *\n * @param query - 用户问题\n * @param options - 可选(满足 `KnowledgeRetrieveOptions` 的所有选项 + systemPrompt、messages、temperature、model)\n * @returns `ok(KnowledgeAskResult)` 含 answer、context 列表、citations、usage 等;检索或生成失败时返回错误\n */\n async ask(query: string, options?: KnowledgeAskOptions): Promise<HaiResult<KnowledgeAskResult>> {\n // 先检索\n const retrieveResult = await this.retrieve(query, options)\n if (!retrieveResult.success) {\n return err(HaiAIError.RAG_FAILED, aiM('ai_ragFailed', { params: { error: retrieveResult.error.message } }), retrieveResult.error)\n }\n\n const { items, citations } = retrieveResult.data\n\n // 格式化上下文(带编号引用标记)\n const contextText = items.length > 0\n ? items.map((item, i) => {\n const source = item.citation.title ?? item.citation.documentId ?? item.citation.chunkId ?? 'unknown'\n return `[${i + 1}] (source: ${source}, score: ${item.score.toFixed(3)})\\n${item.content}`\n }).join('\\n\\n')\n : 'No relevant context found.'\n\n // 构建 LLM 消息\n const systemPrompt = options?.systemPrompt ?? DEFAULT_KNOWLEDGE_ASK_SYSTEM_PROMPT\n const systemContent = `${systemPrompt}\\n\\n--- Context ---\\n${contextText}\\n--- End Context ---`\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemContent },\n ]\n\n // 消息历史\n if (options?.messages) {\n messages.push(...options.messages)\n }\n\n messages.push({ role: 'user', content: query })\n\n // 调用 LLM\n const chatResult = await llm.chat({\n model: options?.model,\n messages,\n temperature: options?.temperature,\n })\n\n if (!chatResult.success) {\n return err(HaiAIError.RAG_FAILED, aiM('ai_ragFailed', { params: { error: chatResult.error.message } }), chatResult.error)\n }\n\n const choice = chatResult.data.choices[0]\n const answer = choice?.message?.content ?? ''\n\n logger.trace('Knowledge ask completed', {\n contextCount: items.length,\n model: chatResult.data.model,\n })\n\n return ok({\n answer,\n context: items,\n citations,\n query,\n model: chatResult.data.model,\n usage: chatResult.data.usage\n ? {\n prompt_tokens: chatResult.data.usage.prompt_tokens,\n completion_tokens: chatResult.data.usage.completion_tokens,\n total_tokens: chatResult.data.usage.total_tokens,\n }\n : undefined,\n })\n },\n\n // ─── findByEntity ───\n async findByEntity(entityName: string, options?: EntityQueryOptions): Promise<HaiResult<EntityDocumentResult[]>> {\n const collection = options?.collection ?? config.collection\n if (!store || !await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n const results = await store.findByEntityName(entityName, {\n collection,\n type: options?.type,\n })\n\n return ok(results.map(item => ({\n entity: {\n id: item.entity.id,\n name: item.entity.name,\n type: item.entity.type as KnowledgeEntity['type'],\n aliases: item.entity.aliases,\n description: item.entity.description ?? undefined,\n },\n documents: item.documents.map(doc => ({\n documentId: doc.documentId,\n chunkId: doc.chunkId || undefined,\n collection: doc.collection,\n relevance: doc.relevance,\n context: doc.context ?? undefined,\n })),\n })))\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── listEntities ───\n async listEntities(options?: EntityListOptions): Promise<HaiResult<KnowledgeEntity[]>> {\n if (!store) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n const rows = await store.listEntities({\n collection: options?.collection,\n type: options?.type,\n keyword: options?.keyword,\n limit: options?.limit,\n })\n\n return ok(rows.map(row => ({\n id: row.id,\n name: row.name,\n type: row.type as KnowledgeEntity['type'],\n aliases: row.aliases,\n description: row.description ?? undefined,\n createdAt: row.createdAt ?? undefined,\n updatedAt: row.updatedAt ?? undefined,\n })))\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── listDocuments ───\n async listDocuments(options?: KnowledgeDocumentListOptions): Promise<HaiResult<KnowledgeDocumentInfo[]>> {\n const collection = options?.collection ?? config.collection\n if (!store || !await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n const docs = await store.listDocuments(collection, {\n offset: options?.offset,\n limit: options?.limit,\n })\n\n // 查询每个文档的实体关联数\n const docIds = docs.map(d => d.documentId)\n const entityCounts = await store.listDocumentEntityCounts(docIds, collection)\n\n const result: KnowledgeDocumentInfo[] = docs.map(d => ({\n documentId: d.documentId,\n title: d.title ?? undefined,\n url: d.url ?? undefined,\n chunkCount: d.chunkCount,\n entityCount: entityCounts.get(d.documentId) ?? 0,\n createdAt: d.createdAt,\n }))\n\n return ok(result)\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── removeDocument ───\n async removeDocument(documentId: string, options?: KnowledgeDocumentRemoveOptions): Promise<HaiResult<void>> {\n const collection = options?.collection ?? config.collection\n if (!store || !await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n // ① 查询该文档的所有 chunk ID\n const docMeta = await store.getDocument(documentId, collection)\n const chunkCount = docMeta?.chunkCount ?? 100 // 回退到大数保证覆盖\n\n // 生成要删除的向量 ID 列表\n const vectorIds: string[] = []\n for (let i = 0; i < chunkCount; i++) {\n vectorIds.push(`${documentId}:chunk-${i}`)\n }\n\n // ② 删除向量\n if (vectorIds.length > 0) {\n try {\n await store.removeVectors(collection, vectorIds)\n }\n catch (vecError) {\n logger.warn('Failed to delete some vectors', { documentId, error: vecError })\n }\n }\n\n // ③ 删除实体本体(需先于关联行删除,子查询依赖关联表)\n await store.deleteDocumentEntities(documentId, collection)\n\n // ④ 删除实体关联行\n await store.removeDocumentEntityRelations(documentId, collection)\n\n // ⑤ 删除文档元数据\n await store.removeDocument(documentId, collection)\n\n logger.debug('Document removed', { documentId, collection })\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 从文件路径读取并导入文档(仅 Node.js 端可用)\n */\n async ingestFile(input: KnowledgeIngestFileInput): Promise<HaiResult<KnowledgeIngestResult>> {\n try {\n const { readFile } = await import('node:fs/promises')\n const { basename } = await import('node:path')\n const content = await readFile(input.filePath, { encoding: input.encoding ?? 'utf-8' })\n const fileName = basename(input.filePath)\n const documentId = input.documentId ?? fileName\n\n return this.ingest({\n documentId,\n content,\n title: input.title ?? fileName,\n url: input.filePath,\n collection: input.collection,\n metadata: input.metadata,\n enableEntityExtraction: input.enableEntityExtraction,\n cleanOptions: input.cleanOptions,\n chunkOptions: input.chunkOptions,\n })\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 批量导入文档,逐个执行 ingest(),单个失败不中断\n */\n async ingestBatch(\n inputs: KnowledgeIngestInput[],\n onProgress?: (progress: KnowledgeIngestBatchProgress) => void,\n ): Promise<HaiResult<KnowledgeIngestBatchResult>> {\n const startTime = Date.now()\n let successCount = 0\n let failureCount = 0\n const results: KnowledgeIngestBatchResult['results'] = []\n\n for (let i = 0; i < inputs.length; i++) {\n const input = inputs[i]\n const documentId = input.documentId ?? `batch-${i}`\n const ingestResult = await this.ingest(input)\n\n if (ingestResult.success) {\n successCount++\n results.push({ documentId, result: ingestResult.data })\n onProgress?.({ completed: i + 1, total: inputs.length, currentDocumentId: documentId, result: ingestResult.data })\n }\n else {\n failureCount++\n results.push({ documentId, error: ingestResult.error })\n onProgress?.({ completed: i + 1, total: inputs.length, currentDocumentId: documentId, error: ingestResult.error })\n }\n }\n\n return ok({ successCount, failureCount, results, duration: Date.now() - startTime })\n },\n\n // ─── deleteCollection ───\n async deleteCollection(collection?: string): Promise<HaiResult<void>> {\n if (!store) {\n return err(HaiAIError.KNOWLEDGE_SETUP_FAILED, aiM('ai_knowledgeSetupFailed', { params: { error: 'KnowledgeStore not available. Provider may not support knowledge operations.' } }))\n }\n\n const col = collection ?? config.collection\n logger.debug('Deleting knowledge collection', { collection: col })\n\n try {\n await store.deleteCollection(col)\n logger.debug('Knowledge collection deleted', { collection: col })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Knowledge collection deletion failed', { collection: col, error })\n return err(HaiAIError.KNOWLEDGE_SETUP_FAILED, aiM('ai_knowledgeSetupFailed', { params: { error: String(error) } }), error)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — LLM 工具定义与注册表\n *\n * 提供 OpenAI function calling 的工具定义、参数校验和批量执行功能。\n * @module ai-llm-tool\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { z } from 'zod'\n\nimport type {\n DefineToolOptions,\n Tool,\n ToolCall,\n ToolDefinition,\n ToolExecutionContext,\n ToolExecutionOptions,\n ToolMessage,\n ToolRegistryOperations,\n ToolRegistryOptions,\n} from './ai-llm-types.js'\n\nimport { err, ok } from '@h-ai/core'\nimport { z as zod } from 'zod'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\n/** 工具默认执行超时(毫秒):未指定 deadline / timeoutMs / 工具默认时生效 */\nconst DEFAULT_TOOL_TIMEOUT_MS = 30_000\n\n/**\n * 依据执行入参解析出传给 handler 的执行上下文(含始终存在的取消信号)。\n *\n * 组合调用方 `signal` 与超时信号:超时时长优先级 `deadline` > `timeoutMs` > 工具默认 > 全局默认。\n * 返回上下文与实际生效的超时毫秒数(用于超时错误信息)。\n */\nfunction resolveExecutionContext(\n options: ToolExecutionOptions | undefined,\n toolTimeoutMs: number | undefined,\n): { context: ToolExecutionContext, timeoutMs: number } {\n const now = Date.now()\n const timeoutMs = options?.deadline !== undefined\n ? Math.max(0, options.deadline - now)\n : options?.timeoutMs ?? toolTimeoutMs ?? DEFAULT_TOOL_TIMEOUT_MS\n const deadline = options?.deadline ?? now + timeoutMs\n\n const timeoutSignal = AbortSignal.timeout(timeoutMs)\n const signal = options?.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n return {\n context: { signal, objectId: options?.objectId, sessionId: options?.sessionId, deadline },\n timeoutMs,\n }\n}\n\n/**\n * 执行 handler 并与取消信号竞速:即便 handler 未响应 signal,取消 / 超时后也立即停止等待。\n *\n * 返回 handler 结果,或在取消 / 超时时抛出(由调用方映射为 TOOL_TIMEOUT)。\n */\nasync function runWithCancellation<T>(\n run: (context: ToolExecutionContext) => Promise<T> | T,\n context: ToolExecutionContext,\n): Promise<T> {\n const { signal } = context\n if (signal.aborted)\n throw new DOMException('Aborted', 'AbortError')\n\n return await new Promise<T>((resolve, reject) => {\n const onAbort = (): void => reject(new DOMException('Aborted', 'AbortError'))\n signal.addEventListener('abort', onAbort, { once: true })\n Promise.resolve()\n .then(() => run(context))\n .then(\n (value) => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n (error: unknown) => {\n signal.removeEventListener('abort', onAbort)\n reject(error instanceof Error ? error : new Error(String(error)))\n },\n )\n })\n}\n\n/** 判断错误是否为取消 / 超时(AbortError / TimeoutError) */\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError')\n}\n\n// ─── 工具定义 ───\n\n/**\n * 定义工具(Zod schema 类型推断 + 自动参数校验)\n *\n * 调用 `execute()` 时自动用 Zod schema 校验输入,校验失败返回 `VALIDATION_FAILED` 错误。\n *\n * @param options - 工具选项(名称、描述、参数 schema、处理函数)\n * @returns 工具实例(含 `execute` 和 `toDefinition`)\n *\n * @example\n * ```ts\n * const weatherTool = defineTool({\n * name: 'getWeather',\n * description: '获取天气',\n * parameters: z.object({ city: z.string() }),\n * handler: async ({ city }) => ({ temp: 25, city }),\n * })\n * const result = await weatherTool.execute({ city: '北京' })\n * ```\n */\nexport function defineTool<TInput, TOutput>(\n options: DefineToolOptions<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n const { name, description, parameters, handler, timeoutMs } = options\n\n return {\n name,\n description,\n parameters,\n\n async execute(input: TInput, execOptions?: ToolExecutionOptions): Promise<HaiResult<TOutput>> {\n const parseResult = parameters.safeParse(input)\n if (!parseResult.success) {\n return err(HaiAIError.TOOL_VALIDATION_FAILED, parseResult.error.message)\n }\n const { context, timeoutMs: effectiveTimeout } = resolveExecutionContext(execOptions, timeoutMs)\n const authorizer = execOptions?.authorize\n if (authorizer) {\n try {\n const allowed = await runWithCancellation(\n ctx => authorizer({ toolName: name, input: parseResult.data, context: ctx }),\n context,\n )\n if (!allowed)\n return err(HaiAIError.TOOL_FORBIDDEN, aiM('ai_toolForbidden', { params: { name } }))\n }\n catch (error) {\n if (isAbortError(error))\n return err(HaiAIError.TOOL_TIMEOUT, aiM('ai_toolTimeout', { params: { name, ms: effectiveTimeout } }), error)\n return err(HaiAIError.TOOL_FORBIDDEN, aiM('ai_toolForbidden', { params: { name } }))\n }\n }\n\n try {\n const output = await runWithCancellation(ctx => handler(parseResult.data, ctx), context)\n return ok(output)\n }\n catch (error) {\n if (isAbortError(error))\n return err(HaiAIError.TOOL_TIMEOUT, aiM('ai_toolTimeout', { params: { name, ms: effectiveTimeout } }), error)\n return err(HaiAIError.TOOL_EXECUTION_FAILED, error instanceof Error ? error.message : String(error), error)\n }\n },\n\n toDefinition(): ToolDefinition {\n return {\n type: 'function',\n function: {\n name,\n description,\n parameters: zodToJsonSchema(parameters),\n },\n }\n },\n }\n}\n\n// ─── 工具注册表 ───\n\n/**\n * 创建工具注册表(闭包实现,非 class)\n *\n * 注册表默认拒绝重复名称;确需替换时必须显式调用 `replace()`。\n *\n * @returns 工具注册表实例\n *\n * @example\n * ```ts\n * const registry = createToolRegistry()\n * registry.registerMany([weatherTool, searchTool])\n * const defs = registry.getDefinitions() // 用于 ChatCompletionRequest.tools\n * const result = await registry.execute(toolCall)\n * ```\n */\nexport function createToolRegistry(options: ToolRegistryOptions = {}): ToolRegistryOperations {\n const tools: Map<string, Tool> = new Map()\n\n function duplicateTool(name: string): HaiResult<void> {\n return err(HaiAIError.TOOL_ALREADY_REGISTERED, aiM('ai_toolAlreadyRegistered', { params: { name } }))\n }\n\n const registry: ToolRegistryOperations = {\n /** 注册单个工具;默认拒绝同名覆盖 */\n register<TInput, TOutput>(tool: Tool<TInput, TOutput>): HaiResult<void> {\n if (tools.has(tool.name))\n return duplicateTool(tool.name)\n tools.set(tool.name, tool as Tool)\n return ok(undefined)\n },\n\n /** 原子批量注册工具;发现任何重名时不写入 */\n registerMany(toolList: Tool<unknown, unknown>[]): HaiResult<void> {\n const incomingNames = new Set<string>()\n for (const tool of toolList) {\n if (tools.has(tool.name) || incomingNames.has(tool.name))\n return duplicateTool(tool.name)\n incomingNames.add(tool.name)\n }\n for (const tool of toolList)\n tools.set(tool.name, tool as Tool)\n return ok(undefined)\n },\n\n /** 显式替换已注册工具 */\n replace<TInput, TOutput>(tool: Tool<TInput, TOutput>): HaiResult<void> {\n if (!tools.has(tool.name))\n return err(HaiAIError.TOOL_NOT_FOUND, aiM('ai_toolNotFound', { params: { name: tool.name } }))\n tools.set(tool.name, tool as Tool)\n return ok(undefined)\n },\n\n /** 移除指定名称的工具,返回是否成功删除 */\n unregister(name: string): boolean {\n return tools.delete(name)\n },\n\n /** 按名称获取工具实例(未注册返回 `undefined`) */\n get(name: string): Tool | undefined {\n return tools.get(name)\n },\n\n /** 判断是否已注册指定名称的工具 */\n has(name: string): boolean {\n return tools.has(name)\n },\n\n /** 获取所有已注册工具的名称列表 */\n getNames(): string[] {\n return Array.from(tools.keys())\n },\n\n /** 获取所有工具的 OpenAI function calling 定义 */\n getDefinitions(): ToolDefinition[] {\n return Array.from(tools.values()).map(tool => tool.toDefinition())\n },\n\n /** 执行单个工具调用,解析 JSON 参数后调用工具的 execute 方法(透传执行上下文) */\n async execute(toolCall: ToolCall, execOptions?: ToolExecutionOptions): Promise<HaiResult<ToolMessage>> {\n // 仅支持 function 类型工具调用(OpenAI SDK union 含 custom 类型)\n if (toolCall.type !== 'function') {\n return err(HaiAIError.TOOL_NOT_FOUND, aiM('ai_toolNotFound', { params: { name: 'unknown' } }))\n }\n const tool = tools.get(toolCall.function.name)\n if (!tool) {\n return err(HaiAIError.TOOL_NOT_FOUND, aiM('ai_toolNotFound', { params: { name: toolCall.function.name } }))\n }\n\n let args: unknown\n try {\n args = JSON.parse(toolCall.function.arguments)\n }\n catch {\n return err(HaiAIError.TOOL_VALIDATION_FAILED, aiM('ai_toolInvalidJson'))\n }\n\n const registryAuthorize = options.authorize\n const executionAuthorize = execOptions?.authorize\n const authorize = registryAuthorize || executionAuthorize\n ? async (request: Parameters<NonNullable<ToolExecutionOptions['authorize']>>[0]): Promise<boolean> => {\n if (registryAuthorize && !await registryAuthorize(request))\n return false\n if (executionAuthorize && !await executionAuthorize(request))\n return false\n return true\n }\n : undefined\n\n const result = await tool.execute(args, { ...execOptions, authorize })\n if (!result.success) {\n return result\n }\n\n const content = typeof result.data === 'string'\n ? result.data\n : JSON.stringify(result.data)\n\n return ok({\n role: 'tool',\n content,\n tool_call_id: toolCall.id,\n })\n },\n\n /** 批量执行工具调用(默认串行),仅显式 parallel=true 时并行 */\n async executeAll(\n toolCalls: ToolCall[],\n options: ToolExecutionOptions & { parallel?: boolean } = {},\n ): Promise<HaiResult<ToolMessage[]>> {\n const { parallel = false, ...execOptions } = options\n const messages: ToolMessage[] = []\n\n if (parallel) {\n const results = await Promise.all(\n toolCalls.map(tc => registry.execute(tc, execOptions)),\n )\n for (const result of results) {\n if (!result.success) {\n return result\n }\n messages.push(result.data)\n }\n }\n else {\n for (const toolCall of toolCalls) {\n const result = await registry.execute(toolCall, execOptions)\n if (!result.success) {\n return result\n }\n messages.push(result.data)\n }\n }\n\n return ok(messages)\n },\n\n /** 清空所有已注册工具 */\n clear(): void {\n tools.clear()\n },\n\n /** 已注册工具数量 */\n get size(): number {\n return tools.size\n },\n }\n\n return registry\n}\n\n// ─── Zod → JSON Schema ───\n\n/**\n * 将 Zod schema 转换为 JSON Schema(移除 $schema 字段)\n *\n * @param schema - Zod 类型定义\n * @returns JSON Schema 对象\n */\nfunction zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = zod.toJSONSchema(schema)\n const { $schema: _, ...rest } = jsonSchema as Record<string, unknown>\n return rest\n}\n","/**\n * @h-ai/ai — LLM Provider: Anthropic Messages API 实现\n *\n * 通过原生 `fetch` 直连 Anthropic Messages API(`/v1/messages`),无需引入 SDK,\n * 天然支持 `AbortSignal` 取消。将框架统一的 Chat Completions 请求/响应形状与\n * Anthropic 协议互相转换,使 `ai.llm.chat/chatStream` 的调用方无需感知底层协议差异。\n *\n * 文本对话与工具调用(tool_use / tool_result)支持;流式覆盖文本增量与用量统计。\n * @module ai-llm-provider-anthropic\n */\n\nimport type { HaiErrorDef, HaiResult } from '@h-ai/core'\n\nimport type { AILLMFunctionsDeps, ChatCompletionChunk, ChatCompletionRequest, ChatCompletionResponse, ChatMessage, LLMProvider, TempModelConfig, ToolCall, ToolDefinition } from '../ai-llm-types.js'\n\nimport process from 'node:process'\nimport { err, ok } from '@h-ai/core'\n\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { createSSEDecoder } from '../ai-llm-stream.js'\n\nconst ANTHROPIC_VERSION = '2023-06-01'\nconst DEFAULT_ANTHROPIC_BASE_URL = 'https://api.anthropic.com'\nconst DEFAULT_MAX_TOKENS = 4096\n\n// ─── Anthropic REST 形状(无 SDK,最小类型定义) ───\n\ninterface AnthropicTextBlock { type: 'text', text: string }\ninterface AnthropicToolUseBlock { type: 'tool_use', id: string, name: string, input: unknown }\ninterface AnthropicToolResultBlock { type: 'tool_result', tool_use_id: string, content: string }\ntype AnthropicContentBlock = AnthropicTextBlock | AnthropicToolUseBlock | AnthropicToolResultBlock\n\ninterface AnthropicMessage { role: 'user' | 'assistant', content: string | AnthropicContentBlock[] }\n\ninterface AnthropicTool { name: string, description?: string, input_schema: Record<string, unknown> }\n\ninterface AnthropicRequest {\n model: string\n max_tokens: number\n messages: AnthropicMessage[]\n system?: string\n temperature?: number\n top_p?: number\n tools?: AnthropicTool[]\n stream?: boolean\n}\n\ninterface AnthropicUsage { input_tokens: number, output_tokens: number }\n\ninterface AnthropicResponse {\n id: string\n model: string\n content: AnthropicContentBlock[]\n stop_reason: string | null\n usage: AnthropicUsage\n}\n\n/** 已解析的 Anthropic 端点参数 */\ninterface ResolvedAnthropic {\n apiKey: string\n baseUrl: string\n model: string\n maxTokens: number\n temperature?: number\n timeout: number\n}\n\n// ─── 辅助转换 ───\n\n/** 从消息内容提取纯文本(字符串直接返回,多模态数组拼接 text 片段,忽略 refusal 等非文本块) */\nfunction contentToText(content: unknown): string {\n if (typeof content === 'string')\n return content\n if (Array.isArray(content))\n return content.map(part => (isRecord(part) && part.type === 'text' && typeof part.text === 'string' ? part.text : '')).filter(Boolean).join('')\n return ''\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\n/**\n * 将框架消息转换为 Anthropic messages + 顶层 system\n *\n * - system / developer 消息合并为顶层 `system` 字符串\n * - assistant 的 `tool_calls` 转 tool_use 块;tool 消息转 tool_result 块\n * - 连续同角色消息各自成条(Anthropic 允许交替,SDK 侧一般无强约束)\n */\nfunction toAnthropicMessages(messages: ChatMessage[]): { messages: AnthropicMessage[], system?: string } {\n const systemParts: string[] = []\n const result: AnthropicMessage[] = []\n\n for (const message of messages) {\n if (message.role === 'system' || message.role === 'developer') {\n const text = contentToText(message.content)\n if (text)\n systemParts.push(text)\n continue\n }\n\n if (message.role === 'tool') {\n result.push({\n role: 'user',\n content: [{ type: 'tool_result', tool_use_id: message.tool_call_id, content: contentToText(message.content) }],\n })\n continue\n }\n\n if (message.role === 'assistant') {\n const blocks: AnthropicContentBlock[] = []\n const text = contentToText(message.content)\n if (text)\n blocks.push({ type: 'text', text })\n if (message.tool_calls) {\n for (const call of message.tool_calls) {\n if (call.type === 'function') {\n let input: unknown = {}\n try {\n input = call.function.arguments ? JSON.parse(call.function.arguments) : {}\n }\n catch {\n input = {}\n }\n blocks.push({ type: 'tool_use', id: call.id, name: call.function.name, input })\n }\n }\n }\n result.push({ role: 'assistant', content: blocks.length > 0 ? blocks : (text || '') })\n continue\n }\n\n // user\n result.push({ role: 'user', content: contentToText(message.content) })\n }\n\n return { messages: result, system: systemParts.length > 0 ? systemParts.join('\\n\\n') : undefined }\n}\n\n/** 将 Chat Completions 工具定义转换为 Anthropic 工具定义 */\nfunction toAnthropicTools(tools?: ToolDefinition[]): AnthropicTool[] | undefined {\n if (!tools || tools.length === 0)\n return undefined\n const mapped: AnthropicTool[] = []\n for (const tool of tools) {\n if (tool.type !== 'function')\n continue\n mapped.push({\n name: tool.function.name,\n description: tool.function.description ?? undefined,\n input_schema: (tool.function.parameters ?? { type: 'object', properties: {} }) as Record<string, unknown>,\n })\n }\n return mapped.length > 0 ? mapped : undefined\n}\n\n/** 将 Anthropic stop_reason 映射为 Chat Completions finish_reason */\nfunction mapStopReason(stopReason: string | null, hasToolUse: boolean): string {\n if (hasToolUse || stopReason === 'tool_use')\n return 'tool_calls'\n if (stopReason === 'max_tokens')\n return 'length'\n return 'stop'\n}\n\n/** 将 Anthropic 响应转换为 Chat Completions 响应形状 */\nfunction toChatResponse(response: AnthropicResponse, model: string): ChatCompletionResponse {\n const textParts: string[] = []\n const toolCalls: ToolCall[] = []\n for (const block of response.content) {\n if (block.type === 'text')\n textParts.push(block.text)\n else if (block.type === 'tool_use')\n toolCalls.push({ id: block.id, type: 'function', function: { name: block.name, arguments: JSON.stringify(block.input ?? {}) } })\n }\n const text = textParts.join('')\n\n return {\n id: response.id,\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: response.model ?? model,\n choices: [{\n index: 0,\n message: {\n role: 'assistant',\n content: toolCalls.length > 0 && text.length === 0 ? null : text,\n refusal: null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n },\n finish_reason: mapStopReason(response.stop_reason, toolCalls.length > 0) as ChatCompletionResponse['choices'][number]['finish_reason'],\n logprobs: null,\n }],\n usage: {\n prompt_tokens: response.usage.input_tokens,\n completion_tokens: response.usage.output_tokens,\n total_tokens: response.usage.input_tokens + response.usage.output_tokens,\n },\n }\n}\n\n/** 构造纯文本增量的流块 */\nfunction textChunk(id: string, model: string, delta: string): ChatCompletionChunk {\n return {\n id,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [{ index: 0, delta: { content: delta }, finish_reason: null, logprobs: null }],\n }\n}\n\n// ─── 工厂 ───\n\n/**\n * 创建 Anthropic LLM Provider\n *\n * @param deps - LLM 子功能依赖(含校验后配置)\n * @returns LLMProvider 实例\n */\nexport function createAnthropicProvider(deps: AILLMFunctionsDeps): LLMProvider {\n const { config } = deps\n\n /**\n * 解析 Anthropic 端点参数\n *\n * apiKey / baseUrl 采用 Anthropic 专属环境变量兜底(ANTHROPIC_API_KEY / ANTHROPIC_BASE_URL),\n * 避免误用面向 OpenAI 的全局默认 baseUrl。\n */\n function resolveAnthropic(requestModel?: string, tempModel?: TempModelConfig): HaiResult<ResolvedAnthropic> {\n const entry = requestModel ? config.llm.models?.find(m => m.id === requestModel || m.model === requestModel) : undefined\n const model = tempModel?.model ?? entry?.model ?? requestModel ?? config.llm.model ?? 'claude-3-5-sonnet-latest'\n const apiKey = tempModel?.apiKey ?? entry?.apiKey ?? config.llm.apiKey ?? process.env.HAI_AI_ANTHROPIC_API_KEY ?? process.env.ANTHROPIC_API_KEY\n if (!apiKey)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_configError', { params: { error: 'API Key is required for Anthropic' } }))\n const baseUrl = (tempModel?.baseUrl ?? entry?.baseUrl ?? process.env.HAI_AI_ANTHROPIC_BASE_URL ?? process.env.ANTHROPIC_BASE_URL ?? DEFAULT_ANTHROPIC_BASE_URL).replace(/\\/+$/, '')\n return ok({\n apiKey,\n baseUrl,\n model,\n maxTokens: tempModel?.maxTokens ?? entry?.maxTokens ?? config.llm.maxTokens ?? DEFAULT_MAX_TOKENS,\n temperature: tempModel?.temperature ?? entry?.temperature ?? config.llm.temperature,\n timeout: tempModel?.timeout ?? entry?.timeout ?? config.llm.timeout ?? 60000,\n })\n }\n\n /** 构造 Anthropic 请求体 */\n function buildRequest(request: ChatCompletionRequest, resolved: ResolvedAnthropic, stream: boolean): AnthropicRequest {\n const { messages, system } = toAnthropicMessages(request.messages)\n const temperature = request.temperature ?? resolved.temperature\n return {\n model: resolved.model,\n max_tokens: request.max_tokens ?? resolved.maxTokens,\n messages,\n ...(system ? { system } : {}),\n ...(temperature != null ? { temperature } : {}),\n ...(request.top_p != null ? { top_p: request.top_p } : {}),\n ...(toAnthropicTools(request.tools) ? { tools: toAnthropicTools(request.tools) } : {}),\n stream,\n }\n }\n\n /** 发送 fetch 请求并统一超时/取消/错误处理 */\n async function post(resolved: ResolvedAnthropic, body: AnthropicRequest, signal?: AbortSignal): Promise<Response> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), resolved.timeout)\n // 合并外部取消信号与超时信号\n if (signal) {\n if (signal.aborted)\n controller.abort()\n else\n signal.addEventListener('abort', () => controller.abort(), { once: true })\n }\n try {\n return await fetch(`${resolved.baseUrl}/v1/messages`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': resolved.apiKey,\n 'anthropic-version': ANTHROPIC_VERSION,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n })\n }\n finally {\n clearTimeout(timer)\n }\n }\n\n /** 将 HTTP 错误状态映射为标准错误定义 */\n function httpError(status: number, detail: string): { def: HaiErrorDef, message: string } {\n if (status === 429)\n return { def: HaiAIError.RATE_LIMITED, message: detail }\n if (status === 404)\n return { def: HaiAIError.MODEL_NOT_FOUND, message: detail }\n if (status === 400)\n return { def: HaiAIError.INVALID_REQUEST, message: detail }\n return { def: HaiAIError.API_ERROR, message: detail }\n }\n\n return {\n async chat(request): Promise<HaiResult<ChatCompletionResponse>> {\n const resolvedResult = resolveAnthropic(request.model, request.tempModel)\n if (!resolvedResult.success)\n return resolvedResult\n const resolved = resolvedResult.data\n try {\n const res = await post(resolved, buildRequest(request, resolved, false), request.signal)\n if (!res.ok) {\n const detail = await res.text().catch(() => res.statusText)\n const mapped = httpError(res.status, detail.slice(0, 500))\n return err(mapped.def, mapped.message, { status: res.status })\n }\n const data = await res.json() as AnthropicResponse\n return ok(toChatResponse(data, resolved.model))\n }\n catch (error) {\n if (error instanceof Error && error.name === 'AbortError')\n return err(HaiAIError.TIMEOUT, aiM('ai_requestTimeout'), { message: error.message })\n return err(HaiAIError.INTERNAL_ERROR, aiM('ai_internalError', { params: { error: error instanceof Error ? error.message : 'Unknown error' } }), error)\n }\n },\n\n async* chatStream(request): AsyncIterable<ChatCompletionChunk> {\n const resolvedResult = resolveAnthropic(request.model, request.tempModel)\n if (!resolvedResult.success)\n throw new Error(resolvedResult.error.message)\n const resolved = resolvedResult.data\n\n const res = await post(resolved, buildRequest(request, resolved, true), request.signal)\n if (!res.ok || !res.body) {\n const detail = await res.text().catch(() => res.statusText)\n throw new Error(`Anthropic stream failed (${res.status}): ${detail.slice(0, 300)}`)\n }\n\n const decoder = createSSEDecoder()\n const reader = res.body.getReader()\n const textDecoder = new TextDecoder()\n\n while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n for (const event of decoder.decode(textDecoder.decode(value, { stream: true }))) {\n if (!event.data || event.data === '[DONE]')\n continue\n let payload: { type?: string, delta?: { type?: string, text?: string }, usage?: AnthropicUsage, message?: { usage?: AnthropicUsage } }\n try {\n payload = JSON.parse(event.data)\n }\n catch {\n continue\n }\n // 文本增量\n if (payload.type === 'content_block_delta' && payload.delta?.type === 'text_delta' && payload.delta.text) {\n yield textChunk(resolved.model, resolved.model, payload.delta.text)\n }\n // 完成事件:携带输出用量\n else if (payload.type === 'message_delta' && payload.usage) {\n yield {\n id: resolved.model,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model: resolved.model,\n choices: [{ index: 0, delta: {}, finish_reason: 'stop', logprobs: null }],\n usage: {\n prompt_tokens: payload.message?.usage?.input_tokens ?? 0,\n completion_tokens: payload.usage.output_tokens,\n total_tokens: (payload.message?.usage?.input_tokens ?? 0) + payload.usage.output_tokens,\n },\n }\n }\n }\n }\n },\n\n async listModels(): Promise<HaiResult<string[]>> {\n // Anthropic 未提供公开的模型列表端点;返回配置中声明的模型名\n const models = new Set<string>()\n if (config.llm.model)\n models.add(config.llm.model)\n for (const entry of config.llm.models ?? []) {\n if ((entry.api ?? config.llm.api) === 'anthropic')\n models.add(entry.model)\n }\n return ok([...models])\n },\n }\n}\n","/**\n * @h-ai/ai — OpenAI Responses API 适配器\n *\n * 将框架统一的 Chat Completions 请求/响应形状与 OpenAI Responses API\n * (`/v1/responses`)互相转换,使 `ai.llm.chat/chatStream` 的调用方无需感知底层协议差异。\n *\n * 纯函数、无副作用,便于单测。文本对话与非流式工具调用完整支持;\n * 流式仅覆盖文本增量(流式工具调用建议使用 `api: 'chat'`)。\n * @module ai-llm-provider-openai-responses\n */\n\nimport type OpenAI from 'openai'\n\nimport type {\n AssistantMessage,\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatMessage,\n ToolCall,\n ToolDefinition,\n} from '../ai-llm-types.js'\n\ntype ResponseInput = OpenAI.Responses.ResponseInput\ntype ResponseInputItem = OpenAI.Responses.ResponseInputItem\ntype ResponsesResponse = OpenAI.Responses.Response\ntype ResponseStreamEvent = OpenAI.Responses.ResponseStreamEvent\ntype ResponsesTool = OpenAI.Responses.Tool\n\n/** 从消息内容中提取纯文本(字符串直接返回,多模态数组拼接其 text 片段,忽略 refusal 等非文本块) */\nfunction contentToText(content: unknown): string {\n if (typeof content === 'string')\n return content\n if (Array.isArray(content)) {\n return content\n .map(part => (isRecord(part) && part.type === 'text' && typeof part.text === 'string' ? part.text : ''))\n .filter(Boolean)\n .join('')\n }\n return ''\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\n/**\n * 将框架消息列表转换为 Responses API 的 input 项\n *\n * - system / developer / user:映射为 EasyInputMessage\n * - assistant:文本映射为 assistant 消息;`tool_calls` 映射为 function_call 项\n * - tool:映射为 function_call_output 项(按 tool_call_id 关联)\n */\nexport function toResponsesInput(messages: ChatMessage[]): ResponseInput {\n const items: ResponseInputItem[] = []\n for (const message of messages) {\n if (message.role === 'tool') {\n items.push({\n type: 'function_call_output',\n call_id: message.tool_call_id,\n output: contentToText(message.content),\n })\n continue\n }\n\n if (message.role === 'assistant') {\n const assistant = message as AssistantMessage\n const text = contentToText(assistant.content)\n if (text)\n items.push({ role: 'assistant', content: text })\n if (assistant.tool_calls) {\n for (const call of assistant.tool_calls) {\n if (call.type === 'function') {\n items.push({\n type: 'function_call',\n call_id: call.id,\n name: call.function.name,\n arguments: call.function.arguments,\n })\n }\n }\n }\n continue\n }\n\n // system / developer / user——仅映射 EasyInputMessage 支持的角色(跳过遗留 function 角色)\n if (message.role === 'user' || message.role === 'system' || message.role === 'developer')\n items.push({ role: message.role, content: contentToText(message.content) })\n }\n return items\n}\n\n/** 将 Chat Completions 工具定义转换为 Responses API 工具定义 */\nexport function toResponsesTools(tools?: ToolDefinition[]): ResponsesTool[] | undefined {\n if (!tools || tools.length === 0)\n return undefined\n const mapped: ResponsesTool[] = []\n for (const tool of tools) {\n if (tool.type !== 'function')\n continue\n mapped.push({\n type: 'function',\n name: tool.function.name,\n description: tool.function.description ?? null,\n parameters: (tool.function.parameters ?? {}) as Record<string, unknown>,\n strict: tool.function.strict ?? false,\n })\n }\n return mapped.length > 0 ? mapped : undefined\n}\n\n/** 从 Responses 响应的 output 数组提取 function_call → Chat Completions tool_calls */\nfunction extractToolCalls(response: ResponsesResponse): ToolCall[] {\n const toolCalls: ToolCall[] = []\n for (const item of response.output) {\n if (item.type === 'function_call') {\n toolCalls.push({\n id: item.call_id,\n type: 'function',\n function: { name: item.name, arguments: item.arguments },\n })\n }\n }\n return toolCalls\n}\n\n/** 将 Responses usage 映射为 Chat Completions usage */\nfunction mapUsage(usage: ResponsesResponse['usage']): ChatCompletionResponse['usage'] | undefined {\n if (!usage)\n return undefined\n return {\n prompt_tokens: usage.input_tokens,\n completion_tokens: usage.output_tokens,\n total_tokens: usage.total_tokens,\n }\n}\n\n/**\n * 将 Responses API 的完整响应转换为 Chat Completions 响应形状\n *\n * @param response - Responses API 响应\n * @param model - 请求使用的模型名(响应缺省时回退)\n */\nexport function responsesToChatResponse(response: ResponsesResponse, model: string): ChatCompletionResponse {\n const toolCalls = extractToolCalls(response)\n const text = response.output_text ?? ''\n\n const message: ChatCompletionResponse['choices'][number]['message'] = {\n role: 'assistant',\n content: toolCalls.length > 0 && text.length === 0 ? null : text,\n refusal: null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n }\n\n const usage = mapUsage(response.usage)\n\n return {\n id: response.id,\n object: 'chat.completion',\n created: response.created_at,\n model: response.model ?? model,\n choices: [{\n index: 0,\n message,\n finish_reason: toolCalls.length > 0 ? 'tool_calls' : 'stop',\n logprobs: null,\n }],\n ...(usage ? { usage } : {}),\n }\n}\n\n/**\n * 将单个 Responses 流事件转换为 Chat Completions 流块\n *\n * 仅处理文本增量与完成事件;其余事件(工具调用、推理等)返回 null 由上层忽略。\n *\n * @param event - Responses 流事件\n * @param model - 请求使用的模型名\n * @returns 对应的 ChatCompletionChunk,或 null(无需转发的事件)\n */\nexport function responsesEventToChunk(event: ResponseStreamEvent, model: string): ChatCompletionChunk | null {\n if (event.type === 'response.output_text.delta') {\n return {\n id: event.item_id,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [{ index: 0, delta: { content: event.delta }, finish_reason: null, logprobs: null }],\n }\n }\n\n if (event.type === 'response.completed') {\n const usage = mapUsage(event.response.usage)\n return {\n id: event.response.id,\n object: 'chat.completion.chunk',\n created: event.response.created_at,\n model: event.response.model ?? model,\n choices: [{ index: 0, delta: {}, finish_reason: 'stop', logprobs: null }],\n ...(usage ? { usage } : {}),\n }\n }\n\n return null\n}\n","/**\n * @h-ai/ai — LLM Provider: OpenAI 兼容实现\n *\n * 工厂函数创建,基于 OpenAI SDK 支持所有 OpenAI 兼容的 API 端点。\n * @module ai-llm-provider-openai\n */\n\nimport type { HaiErrorDef, HaiResult } from '@h-ai/core'\n\nimport type {\n AILLMFunctionsDeps,\n ChatCompletionChunk,\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatMessage,\n LLMProvider,\n TempModelConfig,\n} from '../ai-llm-types.js'\n\nimport process from 'node:process'\nimport { err, ok } from '@h-ai/core'\nimport OpenAI from 'openai'\n\nimport { resolveModelEntry } from '../../ai-config.js'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport {\n responsesEventToChunk,\n responsesToChatResponse,\n toResponsesInput,\n toResponsesTools,\n} from './ai-llm-provider-openai-responses.js'\n\n// ─── 辅助函数 ───\n\n/**\n * 清理错误对象中可能包含的敏感信息\n *\n * OpenAI SDK 的 APIError 可能在 headers 中携带 Authorization Bearer Token,\n * 直接作为 cause 传递会泄漏 API Key。此函数仅保留安全字段。\n *\n * @param error - 原始错误对象\n * @returns 去除敏感信息的错误摘要\n */\nfunction sanitizeErrorCause(error: unknown): { message: string, status?: number, code?: string } {\n if (error instanceof OpenAI.APIError) {\n return { message: error.message, status: error.status, code: error.code ?? undefined }\n }\n if (error instanceof Error) {\n return { message: error.message }\n }\n return { message: String(error) }\n}\n\n/**\n * 将 OpenAI SDK 异常映射为标准错误定义 + 消息\n *\n * 映射规则:\n * - HTTP 429 → `RATE_LIMITED`\n * - HTTP 404 → `MODEL_NOT_FOUND`\n * - HTTP 400 → `INVALID_REQUEST`\n * - 其他 `APIError` → `API_ERROR`\n * - `AbortError` → `TIMEOUT`\n * - 其他 → `INTERNAL_ERROR`\n *\n * @param error - 捕获的异常\n * @returns 统一错误映射(cause 已脱敏,不含 API Key)\n */\nfunction toAIError(error: unknown): { def: HaiErrorDef, message: string, cause: unknown } {\n if (error instanceof OpenAI.APIError) {\n let def = HaiAIError.API_ERROR\n if (error.status === 429) {\n def = HaiAIError.RATE_LIMITED\n }\n else if (error.status === 404) {\n def = HaiAIError.MODEL_NOT_FOUND\n }\n else if (error.status === 400) {\n def = HaiAIError.INVALID_REQUEST\n }\n return { def, message: error.message, cause: sanitizeErrorCause(error) }\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n def: HaiAIError.TIMEOUT,\n message: aiM('ai_requestTimeout'),\n cause: sanitizeErrorCause(error),\n }\n }\n\n return {\n def: HaiAIError.INTERNAL_ERROR,\n message: aiM('ai_internalError', {\n params: { error: error instanceof Error ? error.message : 'Unknown error' },\n }),\n cause: sanitizeErrorCause(error),\n }\n}\n\nfunction toOpenAIMessage(message: ChatMessage): OpenAI.Chat.Completions.ChatCompletionMessageParam {\n if (message.role === 'developer') {\n const developerMessage: OpenAI.Chat.Completions.ChatCompletionDeveloperMessageParam = {\n role: 'developer',\n content: message.content,\n ...(message.name ? { name: message.name } : {}),\n }\n return developerMessage\n }\n\n return message\n}\n\n// ─── 工厂函数 ───\n\n/** 已解析的客户端及其参数回填默认值(maxTokens/temperature 仅临时模型路径有值) */\ninterface ResolvedClient {\n client: OpenAI\n model: string\n /** API 协议:chat = Chat Completions;responses = Responses API */\n api: 'chat' | 'responses'\n maxTokens?: number\n temperature?: number\n}\n\n/**\n * 创建 OpenAI 兼容 LLM Provider\n *\n * 支持所有 OpenAI 兼容 API 端点(如 Azure OpenAI、本地 Ollama 等)。\n * 通过 `resolveModelEntry()` 统一解析模型配置(apiKey / baseUrl / timeout 等),\n * 支持多模型条目各自配置不同的 API 端点。\n *\n * @param deps - LLM 子功能依赖(含校验后配置)\n * @returns LLMProvider 实例\n */\nexport function createOpenAIProvider(deps: AILLMFunctionsDeps): LLMProvider {\n const { config } = deps\n\n // 缓存客户端实例,按 apiKey+baseURL+timeout 复用,支持多端点并发调用\n const clientCache = new Map<string, OpenAI>()\n\n // 临时模型客户端缓存:与常驻 clientCache 隔离,带 TTL 过期(默认 10 分钟,见 LLMConfig.tempModelCacheTtl)\n const tempClientCache = new Map<string, { client: OpenAI, expiresAt: number }>()\n const tempCacheTtl = config.llm.tempModelCacheTtl ?? 600000\n\n function getClient(apiKey: string, baseURL: string, timeout: number): OpenAI {\n const key = `${apiKey}::${baseURL}::${timeout}`\n let client = clientCache.get(key)\n if (!client) {\n client = new OpenAI({ apiKey, baseURL, timeout })\n clientCache.set(key, client)\n }\n return client\n }\n\n /**\n * 获取临时模型客户端(带 TTL 过期)\n *\n * 每次调用惰性清理过期实例(无需定时器,避免 close 清理负担)。\n * 命中未过期缓存直接复用;否则创建新实例并记录过期时间(自创建起 `tempCacheTtl` 毫秒)。\n */\n function getTempClient(apiKey: string, baseURL: string, timeout: number): OpenAI {\n const now = Date.now()\n // 惰性清理过期实例,避免缓存无限增长\n for (const [k, v] of tempClientCache) {\n if (v.expiresAt <= now)\n tempClientCache.delete(k)\n }\n const key = `${apiKey}::${baseURL}::${timeout}`\n const cached = tempClientCache.get(key)\n if (cached)\n return cached.client\n const client = new OpenAI({ apiKey, baseURL, timeout })\n tempClientCache.set(key, { client, expiresAt: now + tempCacheTtl })\n return client\n }\n\n function resolveClient(requestModel?: string, tempModel?: TempModelConfig): HaiResult<ResolvedClient> {\n if (tempModel)\n return resolveTempClient(tempModel)\n const resolvedResult = resolveModelEntry(config.llm, 'chat', requestModel, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for chat' } }),\n })\n if (!resolvedResult.success)\n return resolvedResult\n const { apiKey, baseUrl, timeout, model, api } = resolvedResult.data\n // 本 Provider 覆盖 OpenAI 原生的两种协议;anthropic 由路由层分派到 Anthropic Provider\n const resolvedApi = api === 'responses' ? 'responses' : 'chat'\n return ok({ client: getClient(apiKey ?? '', baseUrl ?? 'https://api.openai.com/v1', timeout), model, api: resolvedApi })\n }\n\n /**\n * 解析临时模型客户端\n *\n * 临时模型字段优先,未指定时回退到全局 LLM 配置 / 环境变量;\n * `maxTokens` / `temperature` 作为请求未显式指定时的回填默认值返回。\n */\n function resolveTempClient(tempModel: TempModelConfig): HaiResult<ResolvedClient> {\n const apiKey = tempModel.apiKey ?? config.llm.apiKey ?? process.env.HAI_AI_LLM_API_KEY ?? process.env.OPENAI_API_KEY\n if (!apiKey)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_configError', { params: { error: 'API Key is required for temp model' } }))\n const baseUrl = tempModel.baseUrl ?? config.llm.baseUrl ?? process.env.HAI_AI_LLM_BASE_URL ?? process.env.OPENAI_BASE_URL ?? 'https://api.openai.com/v1'\n const timeout = tempModel.timeout ?? config.llm.timeout ?? 60000\n const api = (tempModel.api ?? config.llm.api) === 'responses' ? 'responses' : 'chat'\n return ok({\n client: getTempClient(apiKey, baseUrl, timeout),\n model: tempModel.model,\n api,\n maxTokens: tempModel.maxTokens ?? config.llm.maxTokens,\n temperature: tempModel.temperature ?? config.llm.temperature,\n })\n }\n\n /**\n * 构建 Responses API 请求参数(非流式基础形状)\n *\n * 将 Chat Completions 语义映射到 Responses:messages→input、max_tokens→max_output_tokens、\n * tools 转 Responses 工具定义;`tool_choice` 仅透传字符串枚举。\n */\n function buildResponsesParams(\n request: ChatCompletionRequest,\n resolved: ResolvedClient,\n ): OpenAI.Responses.ResponseCreateParamsNonStreaming {\n const maxOutput = request.max_tokens ?? resolved.maxTokens\n const temperature = request.temperature ?? resolved.temperature\n const toolChoice = typeof request.tool_choice === 'string' ? request.tool_choice : undefined\n return {\n model: resolved.model,\n input: toResponsesInput(request.messages),\n ...(maxOutput != null ? { max_output_tokens: maxOutput } : {}),\n ...(temperature != null ? { temperature } : {}),\n ...(request.top_p != null ? { top_p: request.top_p } : {}),\n ...(toResponsesTools(request.tools) ? { tools: toResponsesTools(request.tools) } : {}),\n ...(toolChoice ? { tool_choice: toolChoice } : {}),\n stream: false,\n }\n }\n\n return {\n async chat(request: ChatCompletionRequest): Promise<HaiResult<ChatCompletionResponse>> {\n const clientResult = resolveClient(request.model, request.tempModel)\n if (!clientResult.success)\n return clientResult\n const resolved = clientResult.data\n const { client, model, maxTokens, temperature, api } = resolved\n const { objectId: _objectId, sessionId: _sessionId, tempModel: _tempModel, signal, ...openaiRequest } = request\n try {\n // Responses API 分支:转换请求/响应形状,对调用方透明\n if (api === 'responses') {\n const response = await client.responses.create(buildResponsesParams(request, resolved), { signal })\n return ok(responsesToChatResponse(response, model))\n }\n\n const openaiMessages = request.messages.map(toOpenAIMessage)\n const params = {\n ...openaiRequest,\n messages: openaiMessages,\n model,\n ...(maxTokens !== undefined && openaiRequest.max_tokens == null ? { max_tokens: maxTokens } : {}),\n ...(temperature !== undefined && openaiRequest.temperature == null ? { temperature } : {}),\n stream: false,\n } as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n // 仅在存在取消信号时传入请求选项,避免无谓的第二参数\n const response = signal\n ? await client.chat.completions.create(params, { signal })\n : await client.chat.completions.create(params)\n return ok(response)\n }\n catch (error) {\n const mapped = toAIError(error)\n return err(mapped.def, mapped.message, mapped.cause)\n }\n },\n\n async* chatStream(request: ChatCompletionRequest): AsyncIterable<ChatCompletionChunk> {\n const clientResult = resolveClient(request.model, request.tempModel)\n if (!clientResult.success)\n throw new Error(clientResult.error.message)\n const resolved = clientResult.data\n const { client, model, maxTokens, temperature, api } = resolved\n const { objectId: _objectId, sessionId: _sessionId, tempModel: _tempModel, signal, ...openaiRequest } = request\n\n // Responses API 流式分支:转发文本增量与完成事件\n if (api === 'responses') {\n const responsesStream = await client.responses.create(\n { ...buildResponsesParams(request, resolved), stream: true },\n { signal },\n )\n for await (const event of responsesStream) {\n const chunk = responsesEventToChunk(event, model)\n if (chunk)\n yield chunk\n }\n return\n }\n\n const openaiMessages = request.messages.map(toOpenAIMessage)\n const params = {\n ...openaiRequest,\n messages: openaiMessages,\n model,\n ...(maxTokens !== undefined && openaiRequest.max_tokens == null ? { max_tokens: maxTokens } : {}),\n ...(temperature !== undefined && openaiRequest.temperature == null ? { temperature } : {}),\n stream: true,\n } as OpenAI.Chat.ChatCompletionCreateParamsStreaming\n const stream = signal\n ? await client.chat.completions.create(params, { signal })\n : await client.chat.completions.create(params)\n for await (const chunk of stream) {\n yield chunk\n }\n },\n\n async listModels(): Promise<HaiResult<string[]>> {\n const clientResult = resolveClient()\n if (!clientResult.success)\n return clientResult\n const { client } = clientResult.data\n try {\n const response = await client.models.list()\n const models = response.data.map((m: { id: string }) => m.id)\n return ok(models)\n }\n catch (error) {\n const mapped = toAIError(error)\n return err(mapped.def, mapped.message, mapped.cause)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — LLM Provider 路由层\n *\n * 按每次请求解析出的 API 协议(`chat` / `responses` / `anthropic`)分派到具体 Provider,\n * 对上层 `ai.llm` 暴露统一的 `LLMProvider` 接口。OpenAI Provider 内部同时覆盖\n * Chat Completions 与 Responses 两种原生协议;Anthropic 走独立 Provider。\n * @module ai-llm-provider-router\n */\n\nimport type { AILLMFunctionsDeps, ChatCompletionChunk, ChatCompletionRequest, LLMProvider } from '../ai-llm-types.js'\n\nimport { resolveModelApi } from '../../ai-config.js'\nimport { createAnthropicProvider } from './ai-llm-provider-anthropic.js'\nimport { createOpenAIProvider } from './ai-llm-provider-openai.js'\n\n/**\n * 创建按协议分派的 LLM Provider\n *\n * @param deps - LLM 子功能依赖(含校验后配置)\n * @returns 统一的 LLMProvider(内部按模型 `api` 路由)\n */\nexport function createLLMProvider(deps: AILLMFunctionsDeps): LLMProvider {\n const openai = createOpenAIProvider(deps)\n // Anthropic Provider 惰性创建:仅在实际使用到 anthropic 协议时初始化\n let anthropic: LLMProvider | undefined\n\n function getAnthropic(): LLMProvider {\n anthropic ??= createAnthropicProvider(deps)\n return anthropic\n }\n\n /** 按请求解析协议并选择 Provider(chat / responses → OpenAI;anthropic → Anthropic) */\n function pick(request: ChatCompletionRequest): LLMProvider {\n const api = resolveModelApi(deps.config.llm, request.model, request.tempModel?.api)\n return api === 'anthropic' ? getAnthropic() : openai\n }\n\n return {\n chat: request => pick(request).chat(request),\n chatStream: (request): AsyncIterable<ChatCompletionChunk> => pick(request).chatStream(request),\n listModels: () => {\n const api = deps.config.llm.api ?? 'chat'\n return api === 'anthropic' ? getAnthropic().listModels() : openai.listModels()\n },\n }\n}\n","/**\n * @h-ai/ai — LLM 子功能工厂\n *\n * 根据配置创建 OpenAI Provider,组装 LLM 操作接口。\n * 同时导出工具与流处理的纯函数包装器(不依赖配置,可独立使用)。\n * @module ai-llm-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AIConfig } from '../ai-config.js'\n\nimport type { AIRelStore, InteractionScope, SessionInfo } from '../store/ai-store-types.js'\nimport type {\n AskOptions,\n ChatCompletionChunk,\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatHistoryOptions,\n ChatMessage,\n ChatRecord,\n GenerateObjectRequest,\n LLMOperations,\n StreamOperations,\n TokenUsage,\n ToolsOperations,\n} from './ai-llm-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { z } from 'zod'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { sessionStoreKey } from '../store/ai-store-key.js'\nimport { collectStream, createSSEDecoder, createStreamProcessor, encodeSSE } from './ai-llm-stream.js'\nimport { createToolRegistry, defineTool } from './ai-llm-tool.js'\nimport { createLLMProvider } from './providers/ai-llm-provider-router.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'llm' })\n\n// ─── LLM 子功能 ───\n\n/** LLM 子功能存储依赖 */\nexport interface AILLMStores {\n /** 对话记录存储(可选;未传入时不记录) */\n recordStore?: AIRelStore<ChatRecord>\n /** 会话信息存储(可选;未传入时 listSessions 返回空) */\n sessionStore?: AIRelStore<SessionInfo>\n}\n\n/** LLM 子功能创建结果 */\nexport interface AILLMFunctions {\n /** LLM 操作接口(对话 / 流式对话 / 模型列表 / 历史 / 会话) */\n llm: LLMOperations\n /** 工具操作接口(定义工具 / 创建注册表) */\n tools: ToolsOperations\n /** 流处理操作接口(流处理器 / SSE 编解码) */\n stream: StreamOperations\n}\n\n/**\n * 创建 LLM 相关的全部子功能\n *\n * 根据配置创建 OpenAI Provider,组装 LLM、工具、流处理三个操作接口。\n * 若传入 `deps.recordStore`,chat 调用会自动保存 ChatRecord。\n *\n * @param config - 校验后的 AI 配置\n * @param deps - 可选依赖(记录存储、会话存储)\n * @returns `{ llm, tools, stream }` 三个操作接口\n */\nexport function createAILLMFunctions(config: AIConfig, deps?: AILLMStores): AILLMFunctions {\n const provider = createLLMProvider({ config })\n const recordStore = deps?.recordStore\n const sessionStore = deps?.sessionStore\n let recordSeq = 0\n\n /**\n * 从消息列表中提取会话标题(取最后一条用户消息,截断到 50 字符)\n */\n function extractTitle(messages: ChatMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg.role === 'user') {\n const text = typeof msg.content === 'string'\n ? msg.content\n : msg.content.filter(c => c.type === 'text').map(c => c.text).join(' ')\n return text.length > 50 ? `${text.slice(0, 50)}...` : text\n }\n }\n return 'New Session'\n }\n\n /**\n * 保存 ChatRecord 并同步更新 SessionInfo\n */\n async function saveRecordAndSession(\n record: ChatRecord,\n messages: ChatMessage[],\n ): Promise<void> {\n await recordStore!.save(record.id, record, { objectId: record.objectId, sessionId: record.sessionId })\n logger.trace('Chat record saved', { id: record.id, objectId: record.objectId, sessionId: record.sessionId })\n\n if (sessionStore) {\n // 会话目录与上下文正文共用同一复合键,避免不同主体相同 sessionId 互相覆盖\n const sessionKey = sessionStoreKey({ objectId: record.objectId, sessionId: record.sessionId })\n const existing = await sessionStore.get(sessionKey)\n const now = Date.now()\n if (existing) {\n await sessionStore.save(sessionKey, { ...existing, updatedAt: now }, { objectId: existing.objectId })\n }\n else {\n await sessionStore.save(sessionKey, {\n sessionId: record.sessionId,\n objectId: record.objectId,\n title: extractTitle(messages),\n createdAt: now,\n updatedAt: now,\n }, { objectId: record.objectId })\n }\n }\n }\n\n /**\n * 包装 chat,在有 objectId 时自动保存 ChatRecord\n */\n async function chatWithRecord(request: ChatCompletionRequest): Promise<HaiResult<ChatCompletionResponse>> {\n const start = Date.now()\n const result = await provider.chat(request)\n\n // 仅在调用成功且传入了 objectId + recordStore 且未禁用持久化时记录\n if (result.success && request.objectId && recordStore && request.enablePersist !== false) {\n try {\n const response = result.data\n const choice = response.choices[0]\n const record: ChatRecord = {\n id: `${response.id}_${Date.now()}_${recordSeq++}`,\n objectId: request.objectId,\n sessionId: request.sessionId ?? 'default',\n request: {\n model: response.model,\n messages: request.messages,\n },\n response: {\n content: choice?.message?.content ?? '',\n toolCalls: choice?.message?.tool_calls,\n finishReason: choice?.finish_reason ?? 'stop',\n usage: response.usage ?? { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n },\n createdAt: Date.now(),\n duration: Date.now() - start,\n }\n await saveRecordAndSession(record, request.messages)\n }\n catch (error) {\n // 记录失败不影响 chat 结果\n logger.debug('Failed to save chat record', { error })\n }\n }\n\n return result\n }\n\n /**\n * 包装 chatStream,在有 objectId 时自动保存 ChatRecord\n *\n * 流式输出不受影响,记录在流消费完成后异步保存。\n */\n async function* chatStreamWithRecord(request: ChatCompletionRequest): AsyncIterable<ChatCompletionChunk> {\n const start = Date.now()\n const shouldRecord = !!(request.objectId && recordStore && request.enablePersist !== false)\n\n // 累积流式响应的中间状态\n let content = ''\n let finishReason: string | null = null\n // 使用更窄的本地类型:流式响应中工具调用均为 function 类型\n const toolCalls: Array<{ id: string, type: 'function', function: { name: string, arguments: string } }> = []\n let streamId = ''\n let resolvedModel = request.model ?? request.tempModel?.model ?? ''\n\n for await (const chunk of provider.chatStream(request)) {\n yield chunk\n\n if (!shouldRecord)\n continue\n\n // 累积元数据\n if (!streamId && chunk.id)\n streamId = chunk.id\n if (!resolvedModel && chunk.model)\n resolvedModel = chunk.model\n\n for (const choice of chunk.choices) {\n if (choice.delta.content)\n content += choice.delta.content\n if (choice.finish_reason)\n finishReason = choice.finish_reason\n // 累积工具调用片段\n if (choice.delta.tool_calls) {\n for (const tc of choice.delta.tool_calls) {\n if (!toolCalls[tc.index]) {\n toolCalls[tc.index] = { id: tc.id ?? '', type: 'function', function: { name: tc.function?.name ?? '', arguments: '' } }\n }\n if (tc.function?.arguments)\n toolCalls[tc.index].function.arguments += tc.function.arguments\n if (tc.function?.name)\n toolCalls[tc.index].function.name = tc.function.name\n if (tc.id)\n toolCalls[tc.index].id = tc.id\n }\n }\n }\n }\n\n // 流消费完成后保存记录\n if (shouldRecord) {\n try {\n const usage: TokenUsage = { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 }\n const record: ChatRecord = {\n id: `${streamId || 'stream'}_${Date.now()}_${recordSeq++}`,\n objectId: request.objectId!,\n sessionId: request.sessionId ?? 'default',\n request: {\n model: resolvedModel,\n messages: request.messages,\n },\n response: {\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls.filter(Boolean) : undefined,\n finishReason: finishReason ?? 'stop',\n usage,\n },\n createdAt: Date.now(),\n duration: Date.now() - start,\n }\n await saveRecordAndSession(record, request.messages)\n }\n catch (error) {\n logger.debug('Failed to save stream chat record', { error })\n }\n }\n }\n\n /**\n * 查询对话历史记录\n */\n async function getHistory(\n scope: InteractionScope,\n options?: ChatHistoryOptions,\n ): Promise<HaiResult<ChatRecord[]>> {\n if (!recordStore) {\n return ok([])\n }\n try {\n const records = await recordStore.query({\n objectId: scope.objectId,\n sessionId: scope.sessionId,\n orderBy: { field: 'createdAt', direction: options?.order ?? 'desc' },\n limit: options?.limit,\n })\n return ok(records)\n }\n catch (error) {\n return err(HaiAIError.LLM_HISTORY_FAILED, aiM('ai_llmHistoryFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n }\n\n /**\n * 列出指定 objectId 下的所有会话\n */\n async function listSessions(\n objectId: string,\n ): Promise<HaiResult<SessionInfo[]>> {\n if (!sessionStore) {\n return ok([])\n }\n try {\n const sessions = await sessionStore.query({\n objectId,\n orderBy: { field: 'updatedAt', direction: 'desc' },\n })\n return ok(sessions)\n }\n catch (error) {\n return err(HaiAIError.LLM_HISTORY_FAILED, aiM('ai_llmHistoryFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n }\n\n const llm: LLMOperations = {\n chat: chatWithRecord,\n chatStream: chatStreamWithRecord,\n listModels: () => provider.listModels(),\n getHistory,\n listSessions,\n\n async ask(question: string, options?: AskOptions): Promise<HaiResult<string>> {\n const messages: ChatMessage[] = []\n if (options?.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt })\n }\n messages.push({ role: 'user', content: question })\n const result = await chatWithRecord({\n messages,\n model: options?.model,\n temperature: options?.temperature,\n objectId: options?.objectId,\n sessionId: options?.sessionId,\n enablePersist: options?.enablePersist,\n tempModel: options?.tempModel,\n signal: options?.signal,\n })\n if (!result.success)\n return result as HaiResult<never>\n return ok(result.data.choices[0]?.message?.content ?? '')\n },\n\n async* askStream(question: string, options?: AskOptions): AsyncIterable<string> {\n const messages: ChatMessage[] = []\n if (options?.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt })\n }\n messages.push({ role: 'user', content: question })\n for await (const chunk of chatStreamWithRecord({\n messages,\n model: options?.model,\n temperature: options?.temperature,\n objectId: options?.objectId,\n sessionId: options?.sessionId,\n enablePersist: options?.enablePersist,\n tempModel: options?.tempModel,\n signal: options?.signal,\n })) {\n const delta = chunk.choices[0]?.delta?.content\n if (delta)\n yield delta\n }\n },\n\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<HaiResult<T>> {\n const baseMessages: ChatMessage[] = []\n if (request.systemPrompt)\n baseMessages.push({ role: 'system', content: request.systemPrompt })\n baseMessages.push(...request.messages)\n\n const jsonSchema = z.toJSONSchema(request.schema)\n const schemaName = request.schemaName ?? 'result'\n const maxRepairs = request.maxRepairs ?? 1\n let lastError = ''\n\n for (let attempt = 0; attempt <= maxRepairs; attempt++) {\n const messages: ChatMessage[] = attempt === 0\n ? baseMessages\n : [...baseMessages, { role: 'user', content: aiM('ai_generateObjectRepair', { params: { error: lastError } }) }]\n const result = await chatWithRecord({\n messages,\n model: request.model,\n temperature: request.temperature,\n tempModel: request.tempModel,\n enablePersist: false,\n signal: request.signal,\n response_format: { type: 'json_schema', json_schema: { name: schemaName, schema: jsonSchema, strict: true } },\n })\n if (!result.success)\n return result as HaiResult<never>\n\n const content = result.data.choices[0]?.message?.content\n const text = typeof content === 'string' ? content : ''\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n }\n catch {\n lastError = 'invalid JSON'\n continue\n }\n const validated = request.schema.safeParse(parsed)\n if (validated.success)\n return ok(validated.data)\n lastError = validated.error.message\n }\n\n return err(HaiAIError.INVALID_REQUEST, aiM('ai_generateObjectFailed', { params: { error: lastError || 'unknown' } }))\n },\n }\n\n const tools: ToolsOperations = {\n define: defineTool,\n createRegistry: createToolRegistry,\n }\n\n const stream: StreamOperations = {\n createProcessor: createStreamProcessor,\n collect: collectStream,\n createSSEDecoder,\n encodeSSE,\n }\n\n return { llm, tools, stream }\n}\n","/**\n * @h-ai/ai — MCP 子功能工厂\n *\n * 提供 MCP 工具/资源/提示词的注册与调用功能。\n * @module ai-mcp-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type {\n AIMCPFunctionsDeps,\n MCPContext,\n MCPOperations,\n MCPPrompt,\n MCPPromptMessage,\n MCPResource,\n MCPResourceContent,\n MCPToolDefinition,\n MCPToolHandler,\n} from './ai-mcp-types.js'\n\nimport { err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\n// ─── 内部类型 ───\n\n/** 工具注册记录(定义 + 处理器) */\ninterface ToolRegistration {\n /** 工具元数据 */\n definition: MCPToolDefinition\n /** 工具执行处理器 */\n handler: MCPToolHandler\n}\n\n/** 资源注册记录(元数据 + 内容加载器) */\ninterface ResourceRegistration {\n /** 资源元数据 */\n resource: MCPResource\n /** 内容加载器(延迟读取) */\n handler: () => Promise<MCPResourceContent>\n}\n\n/** 提示词注册记录(元数据 + 模板渲染器) */\ninterface PromptRegistration {\n /** 提示词元数据 */\n prompt: MCPPrompt\n /** 模板渲染器(接收参数,返回消息列表) */\n handler: (args: Record<string, string>) => Promise<MCPPromptMessage[]>\n}\n\n// ─── 工厂函数 ───\n\n/**\n * 创建 MCP 子功能\n *\n * 提供工具、资源、提示词的注册与调用功能。\n * 注册是同步,调用是异步。所有调用方法返回 `HaiResult<T>`。\n *\n * @param _deps - MCP 子功能依赖(config 保留供将来使用)\n * @returns MCPOperations 接口\n *\n * @example\n * ```ts\n * const mcp = createAIMCPFunctions({ config })\n * mcp.registerTool(\n * { name: 'echo', description: '回音', inputSchema: { type: 'object' } },\n * async (input) => input,\n * )\n * const result = await mcp.callTool('echo', { msg: 'hi' })\n * ```\n */\nexport function createAIMCPFunctions(_deps: AIMCPFunctionsDeps): MCPOperations {\n // _deps.config 保留供将来使用\n\n /** 工具注册表(按 name 索引) */\n const tools = new Map<string, ToolRegistration>()\n /** 资源注册表(按 uri 索引) */\n const resources = new Map<string, ResourceRegistration>()\n /** 提示词注册表(按 name 索引) */\n const prompts = new Map<string, PromptRegistration>()\n\n return {\n /** 注册 MCP 工具(同名覆盖) */\n registerTool<TInput, TOutput>(\n definition: MCPToolDefinition,\n handler: MCPToolHandler<TInput, TOutput>,\n ): HaiResult<void> {\n tools.set(definition.name, {\n definition,\n handler: handler as MCPToolHandler,\n })\n return ok(undefined)\n },\n\n /** 注册 MCP 资源(同 URI 覆盖) */\n registerResource(\n resource: MCPResource,\n handler: () => Promise<MCPResourceContent>,\n ): HaiResult<void> {\n resources.set(resource.uri, { resource, handler })\n return ok(undefined)\n },\n\n /** 注册 MCP 提示词模板(同名覆盖) */\n registerPrompt(\n prompt: MCPPrompt,\n handler: (args: Record<string, string>) => Promise<MCPPromptMessage[]>,\n ): HaiResult<void> {\n prompts.set(prompt.name, { prompt, handler })\n return ok(undefined)\n },\n\n /**\n * 调用已注册的 MCP 工具\n *\n * @param name - 工具名称\n * @param args - 输入参数\n * @param context - 执行上下文(可选,未传时自动生成 requestId)\n * @returns 工具返回值或 `MCP_TOOL_ERROR`\n */\n async callTool(\n name: string,\n args: unknown,\n context?: MCPContext,\n ): Promise<HaiResult<unknown>> {\n try {\n const registration = tools.get(name)\n if (!registration) {\n return err(HaiAIError.MCP_TOOL_ERROR, aiM('ai_mcpToolNotFound', { params: { name } }))\n }\n const ctx: MCPContext = context || { requestId: crypto.randomUUID() }\n const result = await registration.handler(args, ctx)\n return ok(result)\n }\n catch (error) {\n return err(\n HaiAIError.MCP_TOOL_ERROR,\n aiM('ai_mcpToolFailed', {\n params: { name, error: error instanceof Error ? error.message : 'Unknown error' },\n }),\n error,\n )\n }\n },\n\n /**\n * 读取已注册的 MCP 资源\n *\n * @param uri - 资源 URI\n * @returns 资源内容或 `MCP_RESOURCE_ERROR`\n */\n async readResource(uri: string): Promise<HaiResult<MCPResourceContent>> {\n try {\n const registration = resources.get(uri)\n if (!registration) {\n return err(HaiAIError.MCP_RESOURCE_ERROR, aiM('ai_mcpResourceNotFound', { params: { uri } }))\n }\n const content = await registration.handler()\n return ok(content)\n }\n catch (error) {\n return err(\n HaiAIError.MCP_RESOURCE_ERROR,\n aiM('ai_mcpResourceFailed', {\n params: { uri, error: error instanceof Error ? error.message : 'Unknown error' },\n }),\n error,\n )\n }\n },\n\n /**\n * 获取已注册的 MCP 提示词\n *\n * 自动校验必填参数,缺少时返回 `MCP_PROTOCOL_ERROR`。\n *\n * @param name - 提示词名称\n * @param args - 模板参数\n * @returns 渲染后的消息列表或错误\n */\n async getPrompt(\n name: string,\n args: Record<string, string>,\n ): Promise<HaiResult<MCPPromptMessage[]>> {\n try {\n const registration = prompts.get(name)\n if (!registration) {\n return err(HaiAIError.MCP_PROTOCOL_ERROR, aiM('ai_mcpPromptNotFound', { params: { name } }))\n }\n\n // 验证必需参数\n for (const arg of registration.prompt.arguments || []) {\n if (arg.required && !(arg.name in args)) {\n return err(HaiAIError.MCP_PROTOCOL_ERROR, aiM('ai_mcpPromptMissingArg', { params: { name, arg: arg.name } }))\n }\n }\n\n const messages = await registration.handler(args)\n return ok(messages)\n }\n catch (error) {\n return err(\n HaiAIError.MCP_PROTOCOL_ERROR,\n aiM('ai_mcpPromptFailed', {\n params: { name, error: error instanceof Error ? error.message : 'Unknown error' },\n }),\n error,\n )\n }\n },\n }\n}\n","/**\n * @h-ai/ai — Memory 公共入口封装(作用域绑定 + 管理接口 + 空清空保护)\n *\n * 在 Provider 实现的 {@link MemoryCoreOperations} 基础上,封装出对外的 {@link MemoryOperations}:\n * - `scoped(binding)`:返回自动绑定 objectId / scope 的安全实例(多租户推荐入口);\n * - `admin.clearAll({ confirm })`:唯一的全局清空入口,需显式确认;\n * - `clear`:拒绝空过滤调用,防止「忘记传条件」导致误清全局。\n * @module memory/ai-memory-facade\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type {\n MemoryClearAllOptions,\n MemoryClearOptions,\n MemoryCoreOperations,\n MemoryEntryInput,\n MemoryOperations,\n ScopedMemoryBinding,\n ScopedMemoryOperations,\n} from './ai-memory-types.js'\n\nimport { err } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\n/**\n * 创建绑定作用域的记忆实例:所有操作自动携带 objectId / scope,get/update/remove 自动归属校验。\n */\nfunction createScopedMemory(core: MemoryCoreOperations, binding: ScopedMemoryBinding): ScopedMemoryOperations {\n const { objectId, scope } = binding\n const accessScope = { objectId, scope }\n\n return {\n extract: (messages: ChatMessage[], options) =>\n core.extract(messages, { ...options, objectId, scope }),\n recall: (query: string, options) =>\n core.recall(query, { ...options, objectId, scope }),\n injectMemories: (messages: ChatMessage[], options) =>\n core.injectMemories(messages, { ...options, objectId, scope }),\n add: (entry: Omit<MemoryEntryInput, 'objectId' | 'scope'>) =>\n core.add({ ...entry, objectId, scope }),\n update: (memoryId: string, updates) => core.update(memoryId, updates, accessScope),\n get: (memoryId: string) => core.get(memoryId, accessScope),\n remove: (memoryId: string) => core.remove(memoryId, accessScope),\n list: options =>\n core.list({ ...options, objectId, scope }),\n listPage: options =>\n core.listPage({ ...options, objectId, scope }),\n clear: options =>\n core.clear({ ...options, objectId, scope }),\n }\n}\n\n/**\n * 将 Provider 核心操作封装为对外的公共记忆操作接口。\n *\n * @param core - Provider 实现的核心操作\n * @returns 增加 scoped / admin 且对 clear 施加空过滤保护的公共接口\n */\nexport function createMemoryOperations(core: MemoryCoreOperations): MemoryOperations {\n return {\n ...core,\n\n /**\n * 清空记忆(空过滤保护)。\n *\n * 未传任何过滤条件(objectId / types / scope 全空)时**拒绝执行**,\n * 避免误清全局;全局清空必须显式使用 `admin.clearAll({ confirm: true })`。\n */\n async clear(options?: MemoryClearOptions): Promise<HaiResult<void>> {\n const hasFilter = Boolean(options?.objectId) || Boolean(options?.types?.length) || Boolean(options?.scope)\n if (!hasFilter) {\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryClearRequiresFilter'))\n }\n return core.clear(options)\n },\n\n scoped: (binding: ScopedMemoryBinding) => createScopedMemory(core, binding),\n\n admin: {\n async clearAll(options: MemoryClearAllOptions): Promise<HaiResult<void>> {\n if (options?.confirm !== true) {\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryClearAllUnconfirmed'))\n }\n return core.clear()\n },\n },\n }\n}\n","/**\n * @h-ai/ai — Memory 记忆提取\n *\n * 使用 LLM 从对话消息中提取值得记住的事实、偏好、事件等。\n * @module ai-memory-extractor\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage, LLMOperations, TempModelConfig } from '../llm/ai-llm-types.js'\nimport type { MemoryEntryInput, MemoryType } from './ai-memory-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory-extractor' })\nconst LEADING_MARKDOWN_FENCE_REGEX = /^```(?:json)?\\n?/\nconst TRAILING_MARKDOWN_FENCE_REGEX = /\\n?```$/\n\n// ─── 提取提示词 ───\n\nconst MEMORY_EXTRACTION_SYSTEM_PROMPT = `You are a memory extraction assistant. Analyze the conversation and extract important information worth remembering for future interactions.\n\nExtract items in the following categories:\n- \"fact\": Factual information mentioned in the conversation\n- \"preference\": User preferences, likes, dislikes, or habits\n- \"event\": Important events, deadlines, or time-specific information\n- \"entity\": Key people, organizations, projects, or concepts mentioned\n- \"instruction\": Explicit user instructions or rules for future behavior\n\nReturn a JSON array of extracted memories. Each memory has:\n- \"content\": a concise description of the memory (string, required)\n- \"type\": one of \"fact\", \"preference\", \"event\", \"entity\", \"instruction\" (required)\n- \"importance\": a float from 0.0 to 1.0 indicating how important this is to remember (required)\n\nRules:\n- Only extract clearly stated information. Do NOT infer or guess.\n- Be concise — each memory should be a single clear statement.\n- Deduplicate: do not extract the same information twice.\n- Rate importance based on likely future usefulness (0.3 = minor detail, 0.7 = moderately useful, 1.0 = critical).\n- Return an empty array [] if no memories worth extracting are found.\n- Return ONLY the JSON array, no markdown fences, no explanation.`\n\n/**\n * 将对话消息格式化为文本\n */\nfunction formatMessages(messages: ChatMessage[]): string {\n return messages\n .filter(m => m.role === 'user' || m.role === 'assistant')\n .map((m) => {\n const content = typeof m.content === 'string' ? m.content : '[multimodal content]'\n return `${m.role}: ${content}`\n })\n .join('\\n')\n}\n\n/**\n * 从对话中提取记忆\n *\n * @param llm - LLM 操作接口\n * @param messages - 对话消息列表\n * @param options - 提取选项\n * @param options.types - 只提取指定类型\n * @param options.model - 指定提取用的模型\n * @param options.minImportance - 过滤低重要性条目\n * @param options.objectId - 所属主体 ID\n * @param options.systemPrompt - 自定义提取用的系统提示词\n * @returns 提取到的记忆输入列表\n * @param options.tempModel - 临时模型配置\n */\nexport async function extractMemories(\n llm: LLMOperations,\n messages: ChatMessage[],\n options?: {\n types?: MemoryType[]\n model?: string\n minImportance?: number\n objectId?: string\n systemPrompt?: string\n tempModel?: TempModelConfig\n },\n): Promise<HaiResult<MemoryEntryInput[]>> {\n const conversationText = formatMessages(messages)\n if (!conversationText.trim()) {\n return ok([])\n }\n\n try {\n let userPrompt = conversationText\n if (options?.types && options.types.length > 0) {\n userPrompt += `\\n\\nOnly extract memories of these types: ${options.types.join(', ')}`\n }\n\n const chatResult = await llm.chat({\n model: options?.model,\n ...(options?.tempModel ? { tempModel: options.tempModel } : {}),\n messages: [\n { role: 'system', content: options?.systemPrompt ?? MEMORY_EXTRACTION_SYSTEM_PROMPT },\n { role: 'user', content: userPrompt },\n ],\n temperature: 0.1,\n })\n\n if (!chatResult.success) {\n logger.warn('Memory extraction LLM call failed', { error: chatResult.error })\n return err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(chatResult.error.message) } }), chatResult.error)\n }\n\n const content = chatResult.data.choices[0]?.message?.content ?? ''\n let entries = parseMemoryResponse(content)\n\n // 按 minImportance 过滤\n if (options?.minImportance && options.minImportance > 0) {\n entries = entries.filter(e => (e.importance ?? 0) >= options.minImportance!)\n }\n\n // 按类型过滤\n if (options?.types && options.types.length > 0) {\n const typeSet = new Set<MemoryType>(options.types)\n entries = entries.filter(e => typeSet.has(e.type))\n }\n\n // 附加 objectId\n if (options?.objectId) {\n entries = entries.map(e => ({ ...e, objectId: options.objectId }))\n }\n\n logger.trace('Memory extraction completed', { messageCount: messages.length, extractedCount: entries.length })\n return ok(entries)\n }\n catch (error) {\n logger.error('Memory extraction failed', { error })\n return err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(error) } }), error)\n }\n}\n\n// ─── 响应解析 ───\n\nconst VALID_MEMORY_TYPES = new Set<string>(['fact', 'preference', 'event', 'entity', 'instruction'])\n\n/**\n * 解析 LLM 返回的记忆 JSON\n */\nfunction parseMemoryResponse(content: string): MemoryEntryInput[] {\n let cleaned = content.trim()\n\n // 去除 markdown 代码围栏\n if (cleaned.startsWith('```')) {\n cleaned = cleaned.replace(LEADING_MARKDOWN_FENCE_REGEX, '').replace(TRAILING_MARKDOWN_FENCE_REGEX, '')\n }\n\n try {\n const parsed = JSON.parse(cleaned) as unknown\n\n if (Array.isArray(parsed)) {\n return parsed.filter(isValidMemoryItem).map(normalizeMemoryItem)\n }\n\n if (typeof parsed === 'object' && parsed !== null && 'memories' in parsed) {\n const memories = (parsed as { memories: unknown }).memories\n if (Array.isArray(memories)) {\n return memories.filter(isValidMemoryItem).map(normalizeMemoryItem)\n }\n }\n\n logger.warn('Memory extraction returned unexpected format', { content: content.slice(0, 200) })\n return []\n }\n catch {\n logger.warn('Memory extraction returned invalid JSON', { content: content.slice(0, 200) })\n return []\n }\n}\n\n/**\n * 校验记忆结构\n */\nfunction isValidMemoryItem(item: unknown): item is Record<string, unknown> {\n if (typeof item !== 'object' || item === null)\n return false\n const obj = item as Record<string, unknown>\n return typeof obj.content === 'string' && obj.content.length > 0\n && typeof obj.type === 'string'\n}\n\n/**\n * 标准化记忆条目\n */\nfunction normalizeMemoryItem(item: Record<string, unknown>): MemoryEntryInput {\n const type = VALID_MEMORY_TYPES.has(item.type as string)\n ? item.type as MemoryType\n : 'fact'\n\n const importance = typeof item.importance === 'number'\n ? Math.max(0, Math.min(1, item.importance))\n : 0.5\n\n return {\n content: (item.content as string).trim(),\n type,\n importance,\n }\n}\n","/**\n * @h-ai/ai — Memory 注入共享实现\n *\n * 原生与 Mem0 后端共用同一套上下文注入行为,确保切换后端不改变消息结构。\n * @module ai-memory-injection\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { MemoryAccessScope, MemoryEntry, MemoryInjectionOptions, MemoryRecallOptions } from './ai-memory-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory' })\n\ntype RecallMemories = (query: string, options?: MemoryRecallOptions) => Promise<HaiResult<MemoryEntry[]>>\n\n/**\n * 按 ID 访问单条记忆时的归属校验(native / Mem0 后端共用)。\n *\n * 返回 `true` 表示该记忆不属于调用主体 / 作用域,调用方应统一返回 `MEMORY_NOT_FOUND`;\n * `accessScope` 未传时不做校验(返回 `false`,向后兼容)。\n */\nexport function isMemoryAccessDenied(entry: MemoryEntry, accessScope?: MemoryAccessScope): boolean {\n if (!accessScope)\n return false\n if (entry.objectId !== accessScope.objectId)\n return true\n if (accessScope.scope) {\n if (!entry.scope)\n return true\n const entryScope = entry.scope as Record<string, unknown>\n return !Object.entries(accessScope.scope).every(([key, value]) => entryScope[key] === value)\n }\n return false\n}\n\n/** 从消息中提取最后一条用户文本 */\nfunction extractQueryFromMessages(messages: ChatMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (message.role === 'user')\n return typeof message.content === 'string' ? message.content : ''\n }\n return ''\n}\n\n/** 将召回结果注入消息列表 */\nexport async function injectRelevantMemories(\n messages: ChatMessage[],\n options: MemoryInjectionOptions | undefined,\n recall: RecallMemories,\n): Promise<HaiResult<ChatMessage[]>> {\n const topK = options?.topK ?? 5\n const position = options?.position ?? 'system'\n\n try {\n const query = extractQueryFromMessages(messages)\n if (!query)\n return ok([...messages])\n\n const recallResult = await recall(query, {\n topK,\n candidateMultiplier: options?.candidateMultiplier,\n objectId: options?.objectId,\n scope: options?.scope,\n types: options?.types,\n minImportance: options?.minImportance,\n })\n if (!recallResult.success) {\n return err(HaiAIError.MEMORY_ENRICH_FAILED, aiM('ai_memoryEnrichFailed', { params: { error: recallResult.error.message } }), recallResult.error)\n }\n\n if (recallResult.data.length === 0)\n return ok([...messages])\n\n let memoryText = recallResult.data\n .map((memory, index) => `[${index + 1}] (${memory.type}) ${memory.content}`)\n .join('\\n')\n\n if (options?.maxTokens && options.maxTokens > 0) {\n const estimatedTokens = memoryText.length * 0.25\n if (estimatedTokens > options.maxTokens) {\n const maxChars = Math.floor(options.maxTokens / 0.25)\n memoryText = `${memoryText.slice(0, maxChars)}...`\n }\n }\n\n const memoryBlock = `\\n\\n--- Relevant Memories ---\\n${memoryText}\\n--- End Memories ---`\n const result = [...messages]\n\n if (position === 'system') {\n const systemIndex = result.findIndex(message => message.role === 'system')\n if (systemIndex >= 0) {\n const systemMessage = result[systemIndex]\n result[systemIndex] = {\n ...systemMessage,\n content: (systemMessage as { content: string }).content + memoryBlock,\n }\n }\n else {\n result.unshift({\n role: 'system',\n content: `You have the following relevant memories from previous interactions:${memoryBlock}`,\n })\n }\n }\n else {\n let lastUserIndex = -1\n for (let index = result.length - 1; index >= 0; index--) {\n if (result[index].role === 'user') {\n lastUserIndex = index\n break\n }\n }\n if (lastUserIndex > 0) {\n result.splice(lastUserIndex, 0, {\n role: 'system',\n content: `Relevant memories:${memoryBlock}`,\n })\n }\n }\n\n logger.trace('Memories enriched', { count: recallResult.data.length, position })\n return ok(result)\n }\n catch (error) {\n logger.error('Memory enrichment failed', { error })\n return err(HaiAIError.MEMORY_ENRICH_FAILED, aiM('ai_memoryEnrichFailed', { params: { error: String(error) } }), error)\n }\n}\n","/**\n * @h-ai/ai — Mem0 OSS 记忆 Provider(真·嵌入式 mem0 引擎)\n *\n * 通过 `mem0ai/oss` 的 `Memory` 引擎实现记忆能力,LLM / Embedder 从 AIConfig 提取\n * (OpenAI 兼容,走 baseURL),向量库从 storeProvider 暴露的原始连接映射:\n * qdrant / pgvector 复用同一后端;lancedb / chroma 等 mem0 不支持的持久化后端默认\n * fail-fast,仅在显式允许时退回 in-memory 存储。历史记录禁用以避免额外 SQLite 依赖。\n * @module ai-memory-provider-mem0-oss\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { MemoryConfig as Mem0Config, Memory as Mem0Memory, MemoryItem as Mem0MemoryItem } from 'mem0ai/oss'\n\nimport type { AIConfig, MemoryConfig } from '../../ai-config.js'\nimport type { ChatMessage, LLMOperations } from '../../llm/ai-llm-types.js'\nimport type { AIVectorBackend } from '../../store/ai-store-types.js'\nimport type {\n MemoryAccessScope,\n MemoryCoreOperations,\n MemoryEntry,\n MemoryEntryInput,\n MemoryExtractOptions,\n MemoryType,\n MemoryUpdateInput,\n} from '../ai-memory-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../../ai-config.js'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { extractMemories as extractTypedMemories } from '../ai-memory-extractor.js'\nimport { injectRelevantMemories, isMemoryAccessDenied } from '../ai-memory-injection.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory-mem0-oss' })\nconst DEFAULT_IMPORTANCE = 0.5\nconst DEFAULT_OBJECT_ID = 'hai-global'\nconst MEMORY_TYPES = new Set<MemoryType>(['fact', 'preference', 'event', 'entity', 'instruction'])\n\n/** 创建 Mem0 OSS Provider 的依赖 */\nexport interface Mem0OssDeps {\n /** 记忆配置(与 native 共用顶层字段) */\n config: MemoryConfig\n /** 完整 AI 配置(用于解析 LLM / Embedder) */\n aiConfig: AIConfig\n /** hai LLM 操作接口(用于框架层记忆提取,保证 type/importance 分类与 native 一致) */\n llm: LLMOperations\n /** 向量库集合名 */\n collectionName: string\n /** 向量维度(可选,未提供时由 mem0 探测) */\n embeddingDims?: number\n /** hai vecdb 后端连接(qdrant / pgvector 复用;不支持的后端默认 fail-fast) */\n vectorBackend?: AIVectorBackend\n}\n\ninterface Mem0OssContext {\n memory: Mem0Memory\n /** hai LLM 操作接口(框架层提取用) */\n llm: LLMOperations\n /** 提取默认 systemPrompt(模块配置,可被调用级 systemPrompt 覆盖) */\n systemPrompt?: string\n defaultObjectId: string\n /** 检索默认返回数量 */\n defaultTopK: number\n /** 候选池倍数(scope 过滤前的候选取回宽度 = topK × candidateMultiplier) */\n candidateMultiplier: number\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction normalizeType(value: unknown, fallback: MemoryType): MemoryType {\n return typeof value === 'string' && MEMORY_TYPES.has(value as MemoryType) ? value as MemoryType : fallback\n}\n\nfunction normalizeImportance(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? Math.max(0, Math.min(1, value)) : fallback\n}\n\nfunction parseTimestamp(value: unknown, fallback: number): number {\n if (typeof value === 'string' || typeof value === 'number') {\n const timestamp = new Date(value).getTime()\n if (Number.isFinite(timestamp))\n return timestamp\n }\n return fallback\n}\n\n/**\n * 将 hai 业务字段编码为 mem0 metadata\n *\n * 完整保留业务 metadata,\n * 并记录归属主体 `hai_object_id`。\n * `category` 额外平铺到顶层,兼容 consolidation 逻辑与 mem0 过滤。\n *\n * @param entry - 记忆输入字段(type / importance / scope / metadata)\n * @param objectId - 归属主体 ID(写入 hai_object_id)\n */\nfunction buildMetadata(\n entry: Pick<MemoryEntryInput, 'type' | 'importance' | 'scope' | 'metadata'>,\n objectId: string,\n): Record<string, unknown> {\n const metadata: Record<string, unknown> = {\n hai_type: entry.type,\n hai_importance: entry.importance ?? DEFAULT_IMPORTANCE,\n hai_object_id: objectId,\n }\n if (entry.scope)\n metadata.hai_scope = entry.scope\n if (entry.metadata && Object.keys(entry.metadata).length > 0)\n metadata.hai_metadata = entry.metadata\n const category = entry.metadata?.category\n if (typeof category === 'string' && category.trim().length > 0)\n metadata.category = category.trim()\n return metadata\n}\n\n/**\n * 从 mem0 metadata 还原 hai 公共元数据(剥离内部保留键)\n *\n * 优先返回完整业务 metadata(`hai_metadata`);对早期仅平铺 `category` 的数据做兼容。\n */\nfunction toPublicMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const business: Record<string, unknown> = isRecord(metadata.hai_metadata) ? { ...metadata.hai_metadata } : {}\n if (business.category === undefined && typeof metadata.category === 'string' && metadata.category.trim().length > 0)\n business.category = metadata.category.trim()\n return Object.keys(business).length > 0 ? business : undefined\n}\n\n/** 将 mem0 MemoryItem 映射为 hai MemoryEntry */\nfunction toMemoryEntry(item: Mem0MemoryItem, fallbackObjectId: string): MemoryEntry {\n const metadata = isRecord(item.metadata) ? item.metadata : {}\n const now = Date.now()\n const createdAt = parseTimestamp(item.createdAt, now)\n const scope = isRecord(metadata.hai_scope) ? metadata.hai_scope : undefined\n // 优先使用写入时记录的归属主体,避免按 memoryId 直读时误判为默认主体\n const objectId = typeof metadata.hai_object_id === 'string' ? metadata.hai_object_id : fallbackObjectId\n\n return {\n id: item.id,\n content: item.memory ?? '',\n type: normalizeType(metadata.hai_type, 'fact'),\n importance: normalizeImportance(metadata.hai_importance, DEFAULT_IMPORTANCE),\n objectId,\n scope,\n metadata: toPublicMetadata(metadata),\n createdAt,\n lastAccessedAt: parseTimestamp(item.updatedAt, createdAt),\n accessCount: 0,\n }\n}\n\n/**\n * 判断记忆条目是否匹配指定业务作用域(key-value 全部相等;条目无 scope 时不匹配)\n */\nfunction matchScope(entry: MemoryEntry, scope: Record<string, unknown>): boolean {\n if (!entry.scope)\n return false\n return Object.entries(scope).every(([k, v]) => (entry.scope as Record<string, unknown>)[k] === v)\n}\n\n/** mem0 向量库解析结果:配置 + 实际生效 provider + 是否持久化 */\ninterface Mem0VectorStoreResolution {\n vectorStore: Mem0Config['vectorStore']\n /** 实际生效的向量 provider(qdrant / pgvector / memory) */\n provider: string\n /** 是否为持久化后端(服务重启后数据是否保留) */\n persistent: boolean\n}\n\n/**\n * 将 hai vecdb 后端映射为 mem0 vectorStore 配置\n *\n * mem0 TS 仅支持 qdrant / pgvector。当底层后端为 lancedb / chroma / 未知时无法映射,\n * 默认 fail-fast(返回错误)以避免服务重启后记忆静默丢失;仅当显式允许时才退回内存存储。\n */\nfunction buildVectorStoreConfig(deps: Mem0OssDeps): HaiResult<Mem0VectorStoreResolution> {\n const collectionName = deps.collectionName\n const dimension = deps.embeddingDims\n const backend = deps.vectorBackend\n\n if (backend?.type === 'qdrant') {\n return ok({\n provider: 'qdrant',\n persistent: true,\n vectorStore: {\n provider: 'qdrant',\n config: {\n url: backend.url,\n apiKey: backend.apiKey,\n collectionName,\n ...(dimension ? { dimension, embeddingModelDims: dimension } : {}),\n },\n },\n })\n }\n\n if (backend?.type === 'pgvector') {\n return ok({\n provider: 'pgvector',\n persistent: true,\n vectorStore: {\n provider: 'pgvector',\n config: {\n host: backend.host,\n port: backend.port,\n dbName: backend.database,\n user: backend.user,\n password: backend.password,\n connectionString: backend.connectionString,\n collectionName,\n ...(dimension ? { dimension, embeddingModelDims: dimension } : {}),\n },\n },\n })\n }\n\n // 配置了持久化后端但 mem0 无法映射(lancedb / chroma / 未知):默认 fail-fast,\n // 避免服务重启后记忆静默丢失;仅当 memory.allowEphemeralFallback=true 时退回内存存储。\n if (backend && !deps.config.allowEphemeralFallback) {\n return err(\n HaiAIError.CONFIGURATION_ERROR,\n aiM('ai_memoryEphemeralFallbackDenied', { params: { backend: backend.type } }),\n )\n }\n if (backend)\n logger.warn('Mem0 OSS falls back to in-memory vector store (allowEphemeralFallback=true); data will not survive restart', { backend: backend.type })\n return ok({\n provider: 'memory',\n persistent: false,\n vectorStore: {\n provider: 'memory',\n config: {\n collectionName,\n ...(dimension ? { dimension } : {}),\n },\n },\n })\n}\n\n/** 解析 LLM / Embedder 配置并构建 mem0 Memory 配置(含实际生效向量 provider 与持久化状态) */\nfunction buildMem0Config(deps: Mem0OssDeps): HaiResult<{ config: Mem0Config, vectorProvider: string, persistent: boolean }> {\n const llmResolved = resolveModelEntry(deps.aiConfig.llm, 'extraction', undefined, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for mem0 LLM' } }),\n })\n if (!llmResolved.success)\n return llmResolved\n\n const embedderResolved = resolveModelEntry(deps.aiConfig.llm, 'embedding', undefined, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for mem0 embedder' } }),\n })\n if (!embedderResolved.success)\n return embedderResolved\n\n const vectorResolved = buildVectorStoreConfig(deps)\n if (!vectorResolved.success)\n return vectorResolved\n\n return ok({\n vectorProvider: vectorResolved.data.provider,\n persistent: vectorResolved.data.persistent,\n config: {\n llm: {\n provider: 'openai',\n config: {\n apiKey: llmResolved.data.apiKey,\n model: llmResolved.data.model,\n baseURL: llmResolved.data.baseUrl,\n temperature: 0.1,\n },\n },\n embedder: {\n provider: 'openai',\n config: {\n apiKey: embedderResolved.data.apiKey,\n model: embedderResolved.data.model,\n baseURL: embedderResolved.data.baseUrl,\n ...(deps.embeddingDims ? { embeddingDims: deps.embeddingDims } : {}),\n },\n },\n vectorStore: vectorResolved.data.vectorStore,\n disableHistory: true,\n customInstructions: deps.config.systemPrompt,\n },\n })\n}\n\nasync function extractMemories(context: Mem0OssContext, messages: ChatMessage[], options?: MemoryExtractOptions): Promise<HaiResult<MemoryEntry[]>> {\n const objectId = options?.objectId ?? context.defaultObjectId\n\n // 在框架层用统一提取器完成分类与打分(honor types / model / minImportance / systemPrompt / tempModel),\n // 再以 infer:false 写入 mem0 并保留 hai_type / hai_importance,确保与 native 后端业务语义一致。\n const extracted = await extractTypedMemories(context.llm, messages, {\n types: options?.types,\n model: options?.model,\n minImportance: options?.minImportance,\n systemPrompt: options?.systemPrompt ?? context.systemPrompt,\n objectId,\n tempModel: options?.tempModel,\n })\n if (!extracted.success)\n return extracted\n if (extracted.data.length === 0)\n return ok([])\n\n try {\n // 批量并发写入,避免 await-in-loop(N+1)\n const stored = await Promise.all(extracted.data.map(async (entry) => {\n const response = await context.memory.add([{ role: 'user', content: entry.content }], {\n userId: objectId,\n metadata: buildMetadata({ type: entry.type, importance: entry.importance, scope: options?.scope, metadata: entry.metadata }, objectId),\n infer: false,\n })\n const item = response.results[0]\n return item ? toMemoryEntry(item, objectId) : undefined\n }))\n return ok(stored.filter((entry): entry is MemoryEntry => entry !== undefined))\n }\n catch (error) {\n logger.error('Mem0 OSS extract failed', { error })\n return err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(error) } }), error)\n }\n}\n\nasync function recallMemories(context: Mem0OssContext, query: string, options?: { topK?: number, candidateMultiplier?: number, objectId?: string, minImportance?: number, types?: MemoryType[], recencyWeight?: number, scope?: Record<string, unknown> }): Promise<HaiResult<MemoryEntry[]>> {\n const objectId = options?.objectId ?? context.defaultObjectId\n const topK = options?.topK ?? context.defaultTopK\n const candidateMultiplier = Math.max(1, options?.candidateMultiplier ?? context.candidateMultiplier)\n try {\n // mem0 无法下推 scope(存于 metadata),只能先取回更大的候选池再在内存过滤。\n // 若仅取 topK,scope 命中的记忆很可能已被同主体其它主题/角色的高相关条目挤出候选,导致漏召回。\n const response = await context.memory.search(query, {\n filters: { userId: objectId },\n topK: topK * candidateMultiplier,\n })\n let entries = response.results\n .map(item => toMemoryEntry(item, objectId))\n // 主体隔离兜底:即便底层向量库未按 user 过滤,也确保只召回归属该主体的记忆\n .filter(entry => entry.objectId === objectId)\n // 按业务作用域严格过滤,避免同一主体下不同主题/角色互相召回\n .filter(entry => !options?.scope || matchScope(entry, options.scope))\n // 按类型过滤\n .filter(entry => !options?.types?.length || options.types.includes(entry.type))\n .filter(entry => entry.importance >= (options?.minImportance ?? 0))\n\n // 时间衰减重排:mem0 已按相关度排序,以排名作为相关度代理与时间新近度线性加权\n const recencyWeight = options?.recencyWeight\n if (recencyWeight && recencyWeight > 0 && entries.length > 1) {\n const times = entries.map(entry => entry.createdAt)\n const minTime = Math.min(...times)\n const span = Math.max(1, Math.max(...times) - minTime)\n const count = entries.length\n entries = entries\n .map((entry, index) => {\n const relevance = 1 - index / (count - 1)\n const recency = (entry.createdAt - minTime) / span\n return { entry, score: relevance * (1 - recencyWeight) + recency * recencyWeight }\n })\n .sort((a, b) => b.score - a.score)\n .map(ranked => ranked.entry)\n }\n\n return ok(entries.slice(0, topK))\n }\n catch (error) {\n logger.error('Mem0 OSS recall failed', { error })\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n}\n\nasync function addMemory(context: Mem0OssContext, entry: MemoryEntryInput): Promise<HaiResult<MemoryEntry>> {\n const objectId = entry.objectId ?? context.defaultObjectId\n try {\n const response = await context.memory.add([{ role: 'user', content: entry.content }], {\n userId: objectId,\n metadata: buildMetadata(entry, objectId),\n infer: false,\n })\n const stored = response.results[0]\n if (!stored)\n throw new Error('Mem0 OSS did not return the stored memory')\n return ok(toMemoryEntry(stored, objectId))\n }\n catch (error) {\n logger.error('Mem0 OSS add failed', { error })\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 更新一条记忆的任意字段(content / type / importance / metadata / scope)\n *\n * mem0 OSS 的 `update()` 仅能改写记忆文本,且未暴露 metadata 更新 API,其内部 vectorStore\n * 为私有字段,无法安全地原地改写 payload。为完整实现更新语义,此处采用\n * 「读取现有条目 → 合并字段 → 删除旧条目 → infer:false 重新写入」的方式。\n *\n * 代价:mem0 后端会为更新后的记忆分配新的 memoryId(与 native 后端保持稳定 id 的行为不同,\n * 已在 README 中作为后端差异说明);通过 `timestamp` 保留原始创建时间。\n */\nasync function updateMemory(context: Mem0OssContext, memoryId: string, updates: MemoryUpdateInput, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n try {\n const item = await context.memory.get(memoryId)\n if (!item)\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n\n const existing = toMemoryEntry(item, context.defaultObjectId)\n if (isMemoryAccessDenied(existing, accessScope))\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n const objectId = existing.objectId ?? context.defaultObjectId\n\n // 仅改文本:mem0.update 可原地更新,保持 memoryId 稳定\n const onlyContentChanged = updates.content !== undefined\n && updates.type === undefined\n && updates.importance === undefined\n && updates.metadata === undefined\n if (onlyContentChanged) {\n await context.memory.update(memoryId, updates.content!)\n const refreshed = await context.memory.get(memoryId)\n return ok(refreshed ? toMemoryEntry(refreshed, objectId) : { ...existing, content: updates.content! })\n }\n\n // 涉及 type / importance / metadata:删除后按合并结果重建\n const merged: MemoryEntryInput = {\n content: updates.content ?? existing.content,\n type: updates.type ?? existing.type,\n importance: updates.importance ?? existing.importance,\n objectId,\n scope: existing.scope,\n metadata: updates.metadata ?? existing.metadata,\n }\n await context.memory.delete(memoryId)\n const response = await context.memory.add([{ role: 'user', content: merged.content }], {\n userId: objectId,\n metadata: buildMetadata(merged, objectId),\n infer: false,\n timestamp: existing.createdAt,\n })\n const stored = response.results[0]\n if (!stored)\n throw new Error('Mem0 OSS did not return the updated memory')\n return ok(toMemoryEntry(stored, objectId))\n }\n catch (error) {\n logger.error('Mem0 OSS update failed', { id: memoryId, error })\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n}\n\nasync function getMemory(context: Mem0OssContext, memoryId: string, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n try {\n const item = await context.memory.get(memoryId)\n if (!item)\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n const entry = toMemoryEntry(item, context.defaultObjectId)\n if (isMemoryAccessDenied(entry, accessScope))\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n return ok(entry)\n }\n catch (error) {\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n}\n\nasync function removeMemory(context: Mem0OssContext, memoryId: string, accessScope?: MemoryAccessScope): Promise<HaiResult<void>> {\n try {\n if (accessScope) {\n const item = await context.memory.get(memoryId)\n if (!item || isMemoryAccessDenied(toMemoryEntry(item, context.defaultObjectId), accessScope))\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n await context.memory.delete(memoryId)\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 列出指定主体的记忆条目(供 list / listPage / clear 复用)\n *\n * objectId 走 mem0 过滤,types / scope 在内存中匹配(scope 存于 metadata.hai_scope,无法下推)。\n * `limit` 必须在 types / scope 过滤**之后**应用:若在 getAll 时截断,目标类型/作用域的记忆\n * 很可能不在前 N 条候选内,导致漏返回甚至返回空列表(与 native provider 语义保持一致)。\n */\nasync function listMemories(context: Mem0OssContext, options?: { objectId?: string, types?: MemoryType[], scope?: Record<string, unknown>, limit?: number }): Promise<MemoryEntry[]> {\n const objectId = options?.objectId ?? context.defaultObjectId\n // 完整取回该主体候选(不在此处传 topK),过滤后再截取 limit\n const response = await context.memory.getAll({ filters: { userId: objectId } })\n let entries = response.results\n .map(item => toMemoryEntry(item, objectId))\n .filter(entry => entry.objectId === objectId)\n if (options?.types?.length)\n entries = entries.filter(entry => options.types!.includes(entry.type))\n if (options?.scope)\n entries = entries.filter(entry => matchScope(entry, options.scope!))\n return options?.limit !== undefined ? entries.slice(0, options.limit) : entries\n}\n\n/**\n * 创建 Mem0 OSS 记忆操作接口\n *\n * @param deps - LLM / Embedder / 向量库来源\n * @returns MemoryOperations 实例\n * @throws 当 `mem0ai` 未安装或配置缺失时抛出,由 `ai.init()` 转为 HaiResult\n */\nexport async function createMem0OssMemoryOperations(deps: Mem0OssDeps): Promise<MemoryCoreOperations> {\n const configResult = buildMem0Config(deps)\n if (!configResult.success)\n throw configResult.error\n\n let mod: typeof import('mem0ai/oss')\n try {\n mod = await import('mem0ai/oss')\n }\n catch (error) {\n logger.error('Failed to load mem0ai/oss', { error })\n throw new Error('mem0ai is required for memory.provider=\"mem0\"; install it with `pnpm add mem0ai`')\n }\n\n // 暴露实际生效的向量 provider 与持久化状态,便于运维确认记忆是否会在重启后保留\n logger.info('Mem0 OSS memory initialized', {\n vectorProvider: configResult.data.vectorProvider,\n persistent: configResult.data.persistent,\n })\n\n const context: Mem0OssContext = {\n memory: new mod.Memory(configResult.data.config),\n llm: deps.llm,\n systemPrompt: deps.config.systemPrompt,\n defaultObjectId: DEFAULT_OBJECT_ID,\n defaultTopK: deps.config.defaultTopK,\n candidateMultiplier: deps.config.candidateMultiplier,\n }\n\n const recall: MemoryCoreOperations['recall'] = (query, options) => recallMemories(context, query, {\n topK: options?.topK ?? deps.config.defaultTopK,\n candidateMultiplier: options?.candidateMultiplier,\n objectId: options?.objectId,\n minImportance: options?.minImportance,\n types: options?.types,\n recencyWeight: options?.recencyWeight,\n scope: options?.scope,\n })\n\n return {\n extract: (messages, options) => extractMemories(context, messages, options),\n recall,\n injectMemories: (messages, options) => injectRelevantMemories(messages, options, recall),\n add: entry => addMemory(context, entry),\n update: (memoryId, updates, accessScope) => updateMemory(context, memoryId, updates, accessScope),\n get: (memoryId, accessScope) => getMemory(context, memoryId, accessScope),\n remove: (memoryId, accessScope) => removeMemory(context, memoryId, accessScope),\n async list(options) {\n try {\n return ok(await listMemories(context, options))\n }\n catch (error) {\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n },\n async listPage(options) {\n try {\n const offset = options?.offset ?? 0\n const limit = options?.limit ?? 20\n // mem0 getAll 不支持 offset 分页,只能取回匹配集合后在内存切片(后端能力限制,已在 README 说明)\n const all = await listMemories(context, { objectId: options?.objectId, types: options?.types, scope: options?.scope })\n return ok({ items: all.slice(offset, offset + limit), total: all.length })\n }\n catch (error) {\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n },\n /**\n * 清除记忆\n *\n * - 无任何过滤条件:`reset()` 清空整个后端。\n * - 仅 objectId(无 types / scope):`deleteAll({ userId })` 删除该主体全部记忆。\n * - 含 types 或 scope:先列出同时匹配的条目,再逐条 `delete`,避免误删该主体其他类型/作用域的记忆。\n */\n async clear(options) {\n try {\n const hasTypeOrScope = Boolean(options?.types?.length) || Boolean(options?.scope)\n\n if (!options?.objectId && !hasTypeOrScope) {\n await context.memory.reset()\n return ok(undefined)\n }\n\n if (options?.objectId && !hasTypeOrScope) {\n await context.memory.deleteAll({ userId: options.objectId })\n return ok(undefined)\n }\n\n // 存在 types / scope:精确匹配后逐条删除\n const matched = await listMemories(context, { objectId: options?.objectId, types: options?.types, scope: options?.scope })\n for (const entry of matched)\n await context.memory.delete(entry.id)\n logger.debug('Mem0 OSS memories cleared', { removed: matched.length, objectId: options?.objectId, types: options?.types, scoped: Boolean(options?.scope) })\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — Memory 合并(Mem0 式增量更新)\n *\n * 对一批抽取事实与相关既有记忆做单次 LLM 合并决策,产出 ADD/UPDATE/DELETE/NONE\n * 操作并应用,实现增量更新、跨条去重与矛盾删除。作为 native 记忆的默认写入策略。\n * @module ai-memory-consolidation\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type {\n MemoryEntry,\n MemoryEntryInput,\n MemoryExtractOptions,\n MemoryOperations,\n MemoryType,\n} from './ai-memory-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { extractMemories } from './ai-memory-extractor.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory-consolidation' })\nconst DEFAULT_IMPORTANCE = 0.5\nconst MEMORY_TYPES = new Set<MemoryType>(['fact', 'preference', 'event', 'entity', 'instruction'])\nconst LEADING_CODE_FENCE_REGEX = /^```(?:json)?\\n?/\nconst TRAILING_CODE_FENCE_REGEX = /\\n?```$/\n\nconst MEMORY_CONSOLIDATION_SYSTEM_PROMPT = [\n 'You maintain a long-term memory store using the Mem0 consolidation algorithm.',\n 'You receive existing related memories (each with an id) and newly extracted facts.',\n 'Decide the minimal set of operations that keeps the store consistent and non-redundant.',\n 'Return exactly one JSON object: { \"memory\": [ { \"id\"?, \"text\", \"type\", \"importance\", \"category\"?, \"event\" } ] }.',\n 'Allowed event values:',\n '- \"ADD\": the fact is new information; omit id.',\n '- \"UPDATE\": refine an existing memory; include its id and the merged text.',\n '- \"DELETE\": an existing memory is contradicted or obsolete; include its id.',\n '- \"NONE\": an existing memory already fully covers the fact; include its id and make no change.',\n 'Rules:',\n '- \"type\" must be one of: fact, preference, event, entity, instruction.',\n '- \"importance\" is a float in [0, 1].',\n '- \"category\" is an optional short topical label (e.g. \"work\", \"food\", \"travel\").',\n '- Only reference ids that appear in the provided existing memories.',\n '- Be conservative: prefer UPDATE or NONE over duplicating information with ADD.',\n 'Return JSON only, without markdown fences or explanation.',\n].join('\\n')\n\n/** 单条合并操作 */\ninterface ConsolidationOp {\n event: 'ADD' | 'UPDATE' | 'DELETE' | 'NONE'\n id?: string\n text: string\n type: MemoryType\n importance: number\n category?: string\n}\n\n/** 合并依赖:默认记忆引擎通过公共操作接口注入 */\nexport interface ConsolidationDeps {\n llm: LLMOperations\n recall: MemoryOperations['recall']\n add: MemoryOperations['add']\n update: MemoryOperations['update']\n remove: MemoryOperations['remove']\n /** 检索相关既有记忆的数量 */\n relatedTopK: number\n /** 抽取阶段的自定义 systemPrompt */\n systemPrompt?: string\n}\n\nfunction stripCodeFences(content: string): string {\n const cleaned = content.trim()\n if (!cleaned.startsWith('```'))\n return cleaned\n return cleaned.replace(LEADING_CODE_FENCE_REGEX, '').replace(TRAILING_CODE_FENCE_REGEX, '').trim()\n}\n\nfunction normalizeText(content: string): string {\n return content.trim().replace(/\\s+/g, ' ').toLocaleLowerCase()\n}\n\nfunction normalizeType(value: unknown, fallback: MemoryType): MemoryType {\n return typeof value === 'string' && MEMORY_TYPES.has(value as MemoryType)\n ? value as MemoryType\n : fallback\n}\n\nfunction normalizeImportance(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.max(0, Math.min(1, value))\n : fallback\n}\n\n/** 收集候选事实的相关既有记忆,按 id 去重 */\nasync function collectRelated(\n deps: ConsolidationDeps,\n candidates: MemoryEntryInput[],\n options?: MemoryExtractOptions,\n): Promise<HaiResult<MemoryEntry[]>> {\n const recallResults = await Promise.all(\n candidates.map(candidate => deps.recall(candidate.content, {\n topK: deps.relatedTopK,\n objectId: candidate.objectId ?? options?.objectId,\n scope: options?.scope,\n types: options?.types,\n })),\n )\n\n const related = new Map<string, MemoryEntry>()\n for (const result of recallResults) {\n if (!result.success)\n return result\n for (const entry of result.data)\n related.set(entry.id, entry)\n }\n return ok([...related.values()])\n}\n\n/**\n * 解析 LLM 返回的合并操作列表\n *\n * 缺失的 type / importance / category 会从匹配文本的候选事实回填;UPDATE/DELETE/NONE\n * 的 id 必须命中既有记忆,否则 UPDATE 降级为 ADD、DELETE/NONE 丢弃。\n */\nfunction parseConsolidationOps(\n raw: string,\n candidates: MemoryEntryInput[],\n relatedIds: Set<string>,\n): ConsolidationOp[] {\n const parsed = JSON.parse(stripCodeFences(raw)) as unknown\n const list = Array.isArray(parsed)\n ? parsed\n : typeof parsed === 'object' && parsed !== null && Array.isArray((parsed as { memory?: unknown }).memory)\n ? (parsed as { memory: unknown[] }).memory\n : []\n\n const candidateByText = new Map(candidates.map(candidate => [normalizeText(candidate.content), candidate]))\n const ops: ConsolidationOp[] = []\n\n for (const item of list) {\n if (typeof item !== 'object' || item === null)\n continue\n const record = item as Record<string, unknown>\n const text = typeof record.text === 'string' ? record.text.trim() : ''\n if (!text)\n continue\n\n const event = String(record.event ?? 'ADD').toUpperCase()\n const fallback = candidateByText.get(normalizeText(text))\n const type = normalizeType(record.type, fallback?.type ?? 'fact')\n const importance = normalizeImportance(record.importance, fallback?.importance ?? DEFAULT_IMPORTANCE)\n const category = typeof record.category === 'string' && record.category.trim().length > 0\n ? record.category.trim()\n : readCategory(fallback?.metadata)\n const id = typeof record.id === 'string' ? record.id : undefined\n\n if (event === 'UPDATE' && id && relatedIds.has(id)) {\n ops.push({ event: 'UPDATE', id, text, type, importance, category })\n }\n else if (event === 'DELETE' && id && relatedIds.has(id)) {\n ops.push({ event: 'DELETE', id, text, type, importance })\n }\n else if (event === 'NONE') {\n // 已被既有记忆覆盖,无需写入\n continue\n }\n else {\n ops.push({ event: 'ADD', text, type, importance, category })\n }\n }\n\n return ops\n}\n\n/** 从元数据中读取 category(若有) */\nfunction readCategory(metadata: Record<string, unknown> | undefined): string | undefined {\n const value = metadata?.category\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined\n}\n\n/** 合并 category 到元数据 */\nfunction withCategory(metadata: Record<string, unknown> | undefined, category: string | undefined): Record<string, unknown> | undefined {\n if (!category)\n return metadata\n return { ...metadata, category }\n}\n\n/**\n * 应用合并操作\n *\n * 顺序执行以保证容量淘汰(maxEntriesPerObject / maxEntriesGlobal)状态一致;批量规模受单次抽取的事实数量约束\n * (通常远小于 20 条)。返回新增与更新后的记忆条目。\n */\nasync function applyConsolidationOps(\n deps: ConsolidationDeps,\n ops: ConsolidationOp[],\n options?: MemoryExtractOptions,\n): Promise<HaiResult<MemoryEntry[]>> {\n const entries: MemoryEntry[] = []\n\n for (const op of ops) {\n if (op.event === 'DELETE' && op.id) {\n const removeResult = await deps.remove(op.id)\n if (!removeResult.success)\n logger.warn('Consolidation delete skipped', { id: op.id, error: removeResult.error.message })\n continue\n }\n\n if (op.event === 'UPDATE' && op.id) {\n const updateResult = await deps.update(op.id, {\n content: op.text,\n type: op.type,\n importance: op.importance,\n metadata: op.category ? { category: op.category } : undefined,\n })\n if (!updateResult.success)\n return updateResult\n entries.push(updateResult.data)\n continue\n }\n\n const addResult = await deps.add({\n content: op.text,\n type: op.type,\n importance: op.importance,\n objectId: options?.objectId,\n scope: options?.scope,\n metadata: withCategory(undefined, op.category),\n })\n if (!addResult.success)\n return addResult\n entries.push(addResult.data)\n }\n\n return ok(entries)\n}\n\n/**\n * 从对话消息中抽取事实并执行 Mem0 式合并\n *\n * 流程:抽取事实 → 检索相关记忆 → 单次 LLM 批量合并 → 应用 ADD/UPDATE/DELETE 操作。\n *\n * @param deps - 合并依赖(LLM + 记忆操作 + relatedTopK)\n * @param messages - 对话消息列表\n * @param options - 抽取选项(types / minImportance / objectId / scope / model 等)\n * @returns 新增与更新后的记忆条目\n */\nexport async function extractAndConsolidate(\n deps: ConsolidationDeps,\n messages: ChatMessage[],\n options?: MemoryExtractOptions,\n): Promise<HaiResult<MemoryEntry[]>> {\n logger.trace('Consolidation extract', { messageCount: messages.length })\n\n const extractResult = await extractMemories(deps.llm, messages, {\n types: options?.types,\n model: options?.model,\n minImportance: options?.minImportance,\n objectId: options?.objectId,\n systemPrompt: options?.systemPrompt ?? deps.systemPrompt,\n tempModel: options?.tempModel,\n })\n if (!extractResult.success)\n return extractResult\n\n const candidates = extractResult.data\n if (candidates.length === 0)\n return ok([])\n\n const relatedResult = await collectRelated(deps, candidates, options)\n if (!relatedResult.success)\n return relatedResult\n const related = relatedResult.data\n\n const consolidationResult = await deps.llm.chat({\n model: options?.model,\n ...(options?.tempModel ? { tempModel: options.tempModel } : {}),\n messages: [\n { role: 'system', content: MEMORY_CONSOLIDATION_SYSTEM_PROMPT },\n {\n role: 'user',\n content: JSON.stringify({\n existingMemories: related.map(entry => ({\n id: entry.id,\n content: entry.content,\n type: entry.type,\n importance: entry.importance,\n category: readCategory(entry.metadata),\n })),\n newFacts: candidates.map(candidate => ({\n text: candidate.content,\n type: candidate.type,\n importance: candidate.importance ?? DEFAULT_IMPORTANCE,\n })),\n }),\n },\n ],\n temperature: 0.1,\n })\n if (!consolidationResult.success) {\n return err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(consolidationResult.error.message) } }), consolidationResult.error)\n }\n\n const rawContent = consolidationResult.data.choices[0]?.message?.content ?? ''\n const relatedIds = new Set(related.map(entry => entry.id))\n let ops: ConsolidationOp[]\n try {\n ops = parseConsolidationOps(rawContent, candidates, relatedIds)\n }\n catch {\n // 解析失败时退化为直接新增全部候选事实,保证抽取结果不丢失\n logger.warn('Consolidation returned invalid JSON, falling back to ADD-all', { content: rawContent.slice(0, 200) })\n ops = candidates.map(candidate => ({\n event: 'ADD' as const,\n text: candidate.content,\n type: candidate.type,\n importance: candidate.importance ?? DEFAULT_IMPORTANCE,\n }))\n }\n\n const applyResult = await applyConsolidationOps(deps, ops, options)\n if (!applyResult.success)\n return applyResult\n\n logger.trace('Consolidation completed', { candidates: candidates.length, related: related.length, ops: ops.length, written: applyResult.data.length })\n return ok(applyResult.data)\n}\n","/**\n * @h-ai/ai — 原生记忆 Provider(hai 自研引擎)\n *\n * 基于 AIRelStore + AIVectorStore 抽象,复用 vecdb / reldb / LLM / Embedding 组件,\n * 提供记忆的提取、存储、检索与注入。`extract` 采用共享的 mem0 式批量合并\n * (ADD/UPDATE/DELETE/NONE),跨条去重并增量更新。\n *\n * 与 mem0 OSS Provider(`ai-memory-provider-mem0-oss.ts`)并列,二者实现同一\n * `MemoryOperations` 接口,通过 `memory.provider` 配置切换。\n * @module ai-memory-provider-native\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { MemoryConfig } from '../../ai-config.js'\n\nimport type { EmbeddingOperations } from '../../embedding/ai-embedding-types.js'\nimport type { ChatMessage, LLMOperations } from '../../llm/ai-llm-types.js'\nimport type { AIRelStore, AIVectorStore, StorePage, WhereClause } from '../../store/ai-store-types.js'\nimport type {\n MemoryAccessScope,\n MemoryClearOptions,\n MemoryCoreOperations,\n MemoryEntry,\n MemoryEntryInput,\n MemoryExtractOptions,\n MemoryInjectionOptions,\n MemoryListOptions,\n MemoryListPageOptions,\n MemoryRecallOptions,\n MemoryUpdateInput,\n} from '../ai-memory-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { extractAndConsolidate } from '../ai-memory-consolidation.js'\nimport { injectRelevantMemories, isMemoryAccessDenied } from '../ai-memory-injection.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory-native' })\n\n/** 记忆淘汰的时间窗口:超过 7 天的记忆 recency 分量衰减为 0。 */\nconst EVICTION_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000\n\n/**\n * 生成记忆条目唯一 ID\n *\n * 形如 `mem_<毫秒时间戳>_<随机后缀>`,保证同一毫秒内多次写入也不冲突。\n */\nfunction generateId(): string {\n return `mem_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`\n}\n\n/**\n * 计算两个等长向量的余弦相似度\n *\n * 长度不一致或任一向量为零向量时返回 0(视为不相关),作为向量检索的回退度量。\n */\nfunction cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length)\n return 0\n let dot = 0\n let normA = 0\n let normB = 0\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i]\n normA += a[i] * a[i]\n normB += b[i] * b[i]\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dot / denom\n}\n\n/**\n * 判断记忆条目是否匹配指定的业务作用域\n *\n * scope 存放在 JSON 列中,未建立索引,因此匹配在内存中完成:\n * 要求 scope 的每个 key-value 都与条目的 scope 严格相等;条目无 scope 时不匹配\n * (指定 scope 的查询不应召回全局记忆)。\n *\n * @param entry - 记忆条目\n * @param scope - 期望匹配的作用域(key-value 全部满足才算命中)\n */\nfunction matchScope(entry: MemoryEntry, scope: Record<string, unknown>): boolean {\n if (!entry.scope)\n return false\n return Object.entries(scope).every(([k, v]) => entry.scope![k] === v)\n}\n\n/**\n * 创建原生 Memory 操作接口\n *\n * 提供基于 LLM 的记忆提取并持久化、基于向量相似度的记忆检索,并支持将相关记忆\n * 注入消息用于 LLM 上下文。\n *\n * @param config - 记忆配置(maxEntriesPerObject / maxEntriesGlobal、recencyDecay、systemPrompt 等)\n * @param llm - LLM 操作接口(用于记忆提取)\n * @param embedding - Embedding 接口(可为 null,为 null 时使用关键词回退)\n * @param store - 记忆条目持久化存储\n * @param vectorStore - 向量库存储(用于语义检索)\n * @returns MemoryCoreOperations 实例\n */\nexport function createNativeMemoryOperations(\n config: MemoryConfig,\n llm: LLMOperations,\n embedding: EmbeddingOperations | null,\n store: AIRelStore<MemoryEntry>,\n vectorStore: AIVectorStore,\n): MemoryCoreOperations {\n /**\n * 为文本计算 embedding 向量(embedding 不可用或关闭时返回 undefined)\n */\n async function computeVector(text: string): Promise<number[] | undefined> {\n if (!config.embeddingEnabled || !embedding)\n return undefined\n\n const result = await embedding.embedText(text)\n if (result.success)\n return result.data\n\n logger.warn('Failed to compute embedding for memory', { error: result.error })\n return undefined\n }\n\n /**\n * 从给定候选集中淘汰优先级最低的一条(importance 0.7 + recency 0.3 加权最小者)\n *\n * @param candidates - 参与淘汰评估的候选条目(通常按 objectId 或全局筛出)\n */\n async function evictLowest(candidates: MemoryEntry[]): Promise<void> {\n if (candidates.length === 0)\n return\n\n const now = Date.now()\n let lowestScore = Infinity\n let lowestId: string | null = null\n\n for (const entry of candidates) {\n const age = now - entry.createdAt\n const recency = Math.max(0, 1 - age / EVICTION_MAX_AGE_MS)\n const score = entry.importance * 0.7 + recency * 0.3\n if (score < lowestScore) {\n lowestScore = score\n lowestId = entry.id\n }\n }\n\n if (lowestId) {\n await store.remove(lowestId)\n await vectorStore.remove(lowestId)\n }\n }\n\n /**\n * 按需淘汰记忆条目,保障多用户配额隔离\n *\n * 分两级触发:\n * 1. 单主体配额(maxEntriesPerObject):仅在传入 objectId 时生效,只统计并淘汰\n * 该主体自身的条目,避免用户 A 大量写入淘汰掉用户 B 的记忆。\n * 2. 全局配额(maxEntriesGlobal):跨所有主体的总量保护,超限时淘汰全局最低优先级条目。\n *\n * @param objectId - 即将写入条目的所属主体(undefined 表示全局记忆,仅受全局配额约束)\n */\n async function evictIfNeeded(objectId?: string): Promise<void> {\n // 全局总量保护\n const globalTotal = await store.count()\n if (globalTotal >= config.maxEntriesGlobal) {\n const all = await store.query({ orderBy: { field: 'createdAt', direction: 'asc' }, limit: globalTotal })\n await evictLowest(all)\n }\n\n // 单主体配额:仅对具名主体生效(undefined 时 store 不会按 object_id 过滤,会误统计全局)\n if (objectId) {\n const objectTotal = await store.count({ objectId })\n if (objectTotal >= config.maxEntriesPerObject) {\n const objectEntries = await store.query({ objectId, orderBy: { field: 'createdAt', direction: 'asc' }, limit: objectTotal })\n await evictLowest(objectEntries)\n }\n }\n }\n\n /**\n * 持久化一条记忆条目(含向量 upsert),写入前按主体配额淘汰\n */\n async function saveEntry(input: MemoryEntryInput, vector?: number[]): Promise<MemoryEntry> {\n await evictIfNeeded(input.objectId)\n\n const now = Date.now()\n const entry: MemoryEntry = {\n id: generateId(),\n content: input.content,\n type: input.type,\n importance: input.importance ?? 0.5,\n objectId: input.objectId,\n scope: input.scope,\n metadata: input.metadata,\n vector,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 0,\n }\n\n await store.save(entry.id, entry, { objectId: entry.objectId })\n\n if (vector) {\n await vectorStore.upsert(entry.id, vector, {\n objectId: entry.objectId,\n type: entry.type,\n })\n }\n\n return entry\n }\n\n /**\n * 更新一条记忆的任意字段(content / type / importance / metadata),\n * content 变更时重算向量并同步向量库。\n */\n async function updateEntry(memoryId: string, updates: MemoryUpdateInput, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n try {\n const existing = await store.get(memoryId)\n if (!existing || isMemoryAccessDenied(existing, accessScope)) {\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n\n if (updates.content !== undefined)\n existing.content = updates.content\n if (updates.type !== undefined)\n existing.type = updates.type\n if (updates.importance !== undefined)\n existing.importance = updates.importance\n if (updates.metadata !== undefined)\n existing.metadata = updates.metadata\n\n // 内容变更时重新计算向量\n if (updates.content !== undefined) {\n const vector = await computeVector(updates.content)\n existing.vector = vector\n if (vector) {\n await vectorStore.upsert(memoryId, vector, {\n objectId: existing.objectId,\n type: existing.type,\n })\n }\n }\n\n await store.save(memoryId, existing, { objectId: existing.objectId })\n logger.trace('Memory updated', { id: memoryId })\n return ok(existing)\n }\n catch (error) {\n logger.error('Memory update failed', { id: memoryId, error })\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n }\n\n /**\n * 检索最相关的记忆条目(内部实现,供 recall / extract / injectMemories 共用)\n *\n * 三阶段:候选筛选(objectId / type / minImportance / scope)→ 综合打分\n * (向量相似度 + 重要性 + 时间新鲜度)→ 排序截取 topK。\n *\n * @param query - 查询文本\n * @param options - 检索选项(objectId / type / minImportance / scope / topK 等)\n * @param updateAccessStats - 是否更新命中条目的访问统计(recall 为 true,提取阶段为 false)\n */\n async function recallEntries(\n query: string,\n options?: MemoryRecallOptions,\n updateAccessStats = true,\n ): Promise<HaiResult<MemoryEntry[]>> {\n const topK = options?.topK ?? config.defaultTopK\n const recencyWeight = options?.recencyWeight ?? (1 - config.recencyDecay)\n const candidateMultiplier = Math.max(1, options?.candidateMultiplier ?? config.candidateMultiplier)\n\n logger.trace('Recalling memories', { query: query.slice(0, 100), topK, updateAccessStats })\n\n try {\n const where: WhereClause<MemoryEntry> = {}\n\n const types = options?.types\n if (types && types.length === 1) {\n where.type = types[0]\n }\n else if (types && types.length > 1) {\n where.type = { $in: types }\n }\n\n if (options?.minImportance && options.minImportance > 0) {\n where.importance = { $gte: options.minImportance }\n }\n\n const allCandidates = await store.query({\n objectId: options?.objectId,\n scope: options?.scope,\n where: Object.keys(where).length > 0 ? where : undefined,\n })\n\n // scope 过滤在内存中完成:指定 scope 时 key-value 严格匹配,不纳入全局记忆(scope 为 null/undefined)\n const candidates = options?.scope\n ? allCandidates.filter(e => matchScope(e, options.scope!))\n : allCandidates\n\n if (candidates.length === 0) {\n return ok([])\n }\n\n let queryVector: number[] | undefined\n if (config.embeddingEnabled && embedding) {\n const embedResult = await embedding.embedText(query)\n if (embedResult.success) {\n queryVector = embedResult.data\n }\n }\n\n const vectorScores = new Map<string, number>()\n if (queryVector) {\n const vectorResults = await vectorStore.search(queryVector, {\n topK: topK * candidateMultiplier,\n filter: options?.objectId ? { objectId: options.objectId } : undefined,\n })\n for (const r of vectorResults) {\n vectorScores.set(r.id, r.score)\n }\n }\n\n const now = Date.now()\n\n const scored = candidates.map((entry) => {\n let similarity = vectorScores.get(entry.id) ?? 0\n if (!similarity && queryVector && entry.vector) {\n similarity = cosineSimilarity(queryVector, entry.vector)\n }\n else if (!similarity) {\n const queryLower = query.toLowerCase()\n const contentLower = entry.content.toLowerCase()\n similarity = contentLower.includes(queryLower) ? 0.8 : 0\n }\n\n const age = now - entry.createdAt\n const recency = Math.max(0, 1 - age / EVICTION_MAX_AGE_MS)\n const relevance = similarity * 0.8 + entry.importance * 0.2\n const score = relevance * (1 - recencyWeight) + recency * recencyWeight\n\n return { entry, score }\n })\n\n scored.sort((a, b) => b.score - a.score)\n const results: MemoryEntry[] = []\n for (const { entry } of scored.slice(0, topK)) {\n if (updateAccessStats) {\n entry.lastAccessedAt = now\n entry.accessCount++\n await store.save(entry.id, entry, { objectId: entry.objectId })\n results.push(entry)\n continue\n }\n\n results.push({ ...entry })\n }\n\n logger.trace('Memory recall completed', { query: query.slice(0, 50), resultCount: results.length, updateAccessStats })\n return ok(results)\n }\n catch (error) {\n logger.error('Memory recall failed', { error })\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n }\n\n const operations: MemoryCoreOperations = {\n /**\n * 从对话消息中提取记忆并合并存储(Mem0 式增量更新)\n *\n * 抽取事实 → 检索相关记忆 → 单次 LLM 批量合并 → 应用 ADD/UPDATE/DELETE/NONE。\n * 相比逐条写回,能跨条去重、增量更新并删除被矛盾的旧记忆。\n *\n * @param messages - 待分析的对话消息列表\n * @param options - 可选(记忆类型过滤、最小重要性阈值、自定义 model / systemPrompt / scope 等)\n * @returns `ok(MemoryEntry[])` 新写入与更新后的记忆列表;LLM 调用失败时返回 `MEMORY_EXTRACT_FAILED`\n */\n async extract(messages: ChatMessage[], options?: MemoryExtractOptions): Promise<HaiResult<MemoryEntry[]>> {\n return extractAndConsolidate({\n llm,\n recall: (query, recallOptions) => recallEntries(query, recallOptions, false),\n add: entry => operations.add(entry),\n update: (memoryId, updates) => updateEntry(memoryId, updates),\n remove: memoryId => operations.remove(memoryId),\n relatedTopK: config.writebackRelatedTopK,\n systemPrompt: config.systemPrompt,\n }, messages, options)\n },\n\n /**\n * 根据查询文本检索最相关的记忆条目并更新访问统计\n */\n async recall(query: string, options?: MemoryRecallOptions): Promise<HaiResult<MemoryEntry[]>> {\n return recallEntries(query, options, true)\n },\n\n /**\n * 将检索到的相关记忆注入消息列表(system 追加或最后一条用户消息前插入)\n */\n async injectMemories(messages: ChatMessage[], options?: MemoryInjectionOptions): Promise<HaiResult<ChatMessage[]>> {\n return injectRelevantMemories(messages, options, recallEntries)\n },\n\n /**\n * 手动添加一条记忆(非 LLM 提取),超过主体配额时自动淘汰最低优先级条目\n *\n * @param entry - 记忆条目输入(content、type、importance、objectId、scope、metadata 等)\n * @returns `ok(MemoryEntry)` 含完整字段(id、时间戳等);存储失败时返回 `MEMORY_STORE_FAILED`\n */\n async add(entry: MemoryEntryInput): Promise<HaiResult<MemoryEntry>> {\n try {\n const vector = await computeVector(entry.content)\n const stored = await saveEntry(entry, vector)\n logger.trace('Memory added', { id: stored.id, type: stored.type })\n return ok(stored)\n }\n catch (error) {\n logger.error('Memory add failed', { error })\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 更新一条已有记忆(仅更新传入字段,content 变更时重算向量)\n */\n async update(memoryId: string, updates: MemoryUpdateInput, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n return updateEntry(memoryId, updates, accessScope)\n },\n\n /**\n * 根据 ID 获取一条记忆并更新访问统计\n *\n * @param memoryId - 记忆条目的唯一 ID\n * @param accessScope - 可选归属校验(不匹配返回 MEMORY_NOT_FOUND)\n * @returns `ok(MemoryEntry)` 操作成功;ID 不存在或归属不符时返回 `MEMORY_NOT_FOUND`\n */\n async get(memoryId: string, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n const entry = await store.get(memoryId)\n if (!entry || isMemoryAccessDenied(entry, accessScope)) {\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n entry.lastAccessedAt = Date.now()\n entry.accessCount++\n await store.save(memoryId, entry, { objectId: entry.objectId })\n return ok(entry)\n },\n\n /**\n * 根据 ID 删除一条记忆(同时清理关系存储与向量库)\n *\n * @param memoryId - 记忆条目的唯一 ID\n * @param accessScope - 可选归属校验(不匹配返回 MEMORY_NOT_FOUND)\n * @returns `ok(undefined)` 删除成功;ID 不存在或归属不符时返回 `MEMORY_NOT_FOUND`\n */\n async remove(memoryId: string, accessScope?: MemoryAccessScope): Promise<HaiResult<void>> {\n if (accessScope) {\n const existing = await store.get(memoryId)\n if (!existing || isMemoryAccessDenied(existing, accessScope)) {\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n }\n const removed = await store.remove(memoryId)\n if (!removed) {\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n await vectorStore.remove(memoryId)\n logger.trace('Memory removed', { id: memoryId })\n return ok(undefined)\n },\n\n /**\n * 列出记忆条目(不分页)\n *\n * objectId / type 走存储层索引过滤,scope 在内存中 key-value 严格匹配。\n *\n * @param options - 可选(objectId、type、scope 过滤,limit 限制数量)\n * @returns `ok(MemoryEntry[])` 按创建时间降序排列的记忆列表\n */\n async list(options?: MemoryListOptions): Promise<HaiResult<MemoryEntry[]>> {\n const where: WhereClause<MemoryEntry> = {}\n if (options?.types && options.types.length === 1)\n where.type = options.types[0]\n else if (options?.types && options.types.length > 1)\n where.type = { $in: options.types }\n\n const results = await store.query({\n objectId: options?.objectId,\n scope: options?.scope,\n where: Object.keys(where).length > 0 ? where : undefined,\n orderBy: { field: 'createdAt', direction: 'desc' },\n // scope 需要内存过滤,故不能在存储层直接 limit(否则可能截断掉待匹配条目)\n limit: options?.scope ? undefined : options?.limit,\n })\n\n if (!options?.scope)\n return ok(results)\n\n const filtered = results.filter(e => matchScope(e, options.scope!))\n return ok(options.limit ? filtered.slice(0, options.limit) : filtered)\n },\n\n /**\n * 分页列出记忆条目\n *\n * 无 scope 时走存储层原生分页;指定 scope 时因作用域存于 JSON 列无法下推,\n * 先按 objectId / type 取出候选,再内存过滤后切片(数据量大时应优先用 objectId 收窄)。\n *\n * @param options - 可选(objectId、type、scope 过滤,offset / limit 分页参数)\n * @returns `ok(StorePage<MemoryEntry>)` 含当前页数据与总数\n */\n async listPage(options?: MemoryListPageOptions): Promise<HaiResult<StorePage<MemoryEntry>>> {\n const where: WhereClause<MemoryEntry> = {}\n if (options?.types && options.types.length === 1)\n where.type = options.types[0]\n else if (options?.types && options.types.length > 1)\n where.type = { $in: options.types }\n\n const offset = options?.offset ?? 0\n const limit = options?.limit ?? 20\n\n if (!options?.scope) {\n const page = await store.queryPage(\n {\n objectId: options?.objectId,\n where: Object.keys(where).length > 0 ? where : undefined,\n orderBy: { field: 'createdAt', direction: 'desc' },\n },\n { offset, limit },\n )\n return ok(page)\n }\n\n const all = await store.query({\n objectId: options?.objectId,\n scope: options?.scope,\n where: Object.keys(where).length > 0 ? where : undefined,\n orderBy: { field: 'createdAt', direction: 'desc' },\n })\n const filtered = all.filter(e => matchScope(e, options.scope!))\n return ok({ items: filtered.slice(offset, offset + limit), total: filtered.length })\n },\n\n /**\n * 清除记忆条目(安全语义)\n *\n * - 不传任何过滤条件:清空全部记忆(含向量库)。\n * - 传入 objectId / types / scope:仅删除同时满足全部条件的条目,避免误删。\n *\n * @param options - 可选范围过滤(objectId / types / scope 任意组合)\n * @returns `ok(undefined)` 操作成功\n */\n async clear(options?: MemoryClearOptions): Promise<HaiResult<void>> {\n if (!options?.types && !options?.objectId && !options?.scope) {\n await store.clear()\n await vectorStore.clear()\n logger.debug('All memories cleared')\n return ok(undefined)\n }\n\n const where: WhereClause<MemoryEntry> = {}\n if (options.types && options.types.length === 1)\n where.type = options.types[0]\n else if (options.types && options.types.length > 1)\n where.type = { $in: options.types }\n\n const candidates = await store.query({\n objectId: options.objectId,\n scope: options.scope,\n where: Object.keys(where).length > 0 ? where : undefined,\n })\n const toRemove = options.scope\n ? candidates.filter(e => matchScope(e, options.scope!))\n : candidates\n\n for (const entry of toRemove) {\n await store.remove(entry.id)\n await vectorStore.remove(entry.id)\n }\n logger.debug('Memories cleared', { removed: toRemove.length, objectId: options.objectId, types: options.types, scoped: Boolean(options.scope) })\n return ok(undefined)\n },\n }\n\n return operations\n}\n","/**\n * @h-ai/ai — Persona 子功能实现\n *\n * 基于 AIRelStore 持久化 AI 角色档案,并提供系统提示词组合。\n * 角色是全局共享的(不按 objectId 隔离),因此存储仅按 id 主键。\n * @module ai-persona-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AIRelStore } from '../store/ai-store-types.js'\nimport type { PersonaOperations, PersonaProfile, PersonaProfileInput, PersonaProfileUpdate, PersonaScopeOptions } from './ai-persona-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'persona' })\n\n/** 默认主体:平台内置角色(未指定 objectId 时使用) */\nconst DEFAULT_OBJECT_ID = 'system'\n\n/** 构造存储键(JSON 数组序列化 [objectId, personaId],避免朴素拼接碰撞) */\nfunction personaKey(objectId: string, id: string): string {\n return JSON.stringify([objectId, id])\n}\n\n/**\n * 将角色档案的 traits 组合进系统提示词\n *\n * 无 traits 时直接返回 systemPrompt;有 traits 时追加一段「性格特征」清单。\n */\nfunction composeSystemPrompt(profile: PersonaProfile): string {\n if (profile.traits.length === 0)\n return profile.systemPrompt\n const traitLines = profile.traits.map(t => `- ${t}`).join('\\n')\n return `${profile.systemPrompt}\\n\\n性格特征:\\n${traitLines}`\n}\n\n/**\n * 创建 Persona 操作接口\n *\n * @param store - 角色档案持久化存储(按 [objectId, id] 复合键隔离多租户)\n * @returns PersonaOperations 实例\n */\nexport function createPersonaOperations(store: AIRelStore<PersonaProfile>): PersonaOperations {\n return {\n async save(input: PersonaProfileInput): Promise<HaiResult<PersonaProfile>> {\n try {\n const now = Date.now()\n const objectId = input.objectId ?? DEFAULT_OBJECT_ID\n const key = personaKey(objectId, input.id)\n const existing = await store.get(key)\n const profile: PersonaProfile = {\n id: input.id,\n objectId,\n name: input.name,\n systemPrompt: input.systemPrompt,\n traits: input.traits ?? [],\n metadata: input.metadata,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n }\n await store.save(key, profile, { objectId })\n logger.trace('Persona saved', { id: profile.id, objectId })\n return ok(profile)\n }\n catch (error) {\n return err(HaiAIError.PERSONA_SAVE_FAILED, aiM('ai_personaSaveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async get(id: string, options?: PersonaScopeOptions): Promise<HaiResult<PersonaProfile>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n const profile = await store.get(personaKey(objectId, id))\n if (!profile)\n return err(HaiAIError.PERSONA_NOT_FOUND, aiM('ai_personaNotFound', { params: { id } }))\n return ok(profile)\n },\n\n async update(id: string, updates: PersonaProfileUpdate, options?: PersonaScopeOptions): Promise<HaiResult<PersonaProfile>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n const key = personaKey(objectId, id)\n const existing = await store.get(key)\n if (!existing)\n return err(HaiAIError.PERSONA_NOT_FOUND, aiM('ai_personaNotFound', { params: { id } }))\n try {\n const profile: PersonaProfile = {\n ...existing,\n name: updates.name ?? existing.name,\n systemPrompt: updates.systemPrompt ?? existing.systemPrompt,\n traits: updates.traits ?? existing.traits,\n metadata: updates.metadata ?? existing.metadata,\n updatedAt: Date.now(),\n }\n await store.save(key, profile, { objectId })\n return ok(profile)\n }\n catch (error) {\n return err(HaiAIError.PERSONA_SAVE_FAILED, aiM('ai_personaSaveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async remove(id: string, options?: PersonaScopeOptions): Promise<HaiResult<void>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n await store.remove(personaKey(objectId, id))\n return ok(undefined)\n },\n\n async list(options?: PersonaScopeOptions): Promise<HaiResult<PersonaProfile[]>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n const profiles = await store.query({ objectId, orderBy: { field: 'createdAt', direction: 'asc' } })\n return ok(profiles)\n },\n\n async compose(id: string, options?: PersonaScopeOptions): Promise<HaiResult<string>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n const profile = await store.get(personaKey(objectId, id))\n if (!profile)\n return err(HaiAIError.PERSONA_NOT_FOUND, aiM('ai_personaNotFound', { params: { id } }))\n return ok(composeSystemPrompt(profile))\n },\n }\n}\n","/**\n * @h-ai/ai — RAG 子功能实现\n *\n * 组合 Retrieval + LLM 实现检索增强生成。\n * @module ai-rag-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type { Citation, RetrievalOperations } from '../retrieval/ai-retrieval-types.js'\nimport type {\n RagContextItem,\n RagOperations,\n RagOptions,\n RagResult,\n RagStreamEvent,\n} from './ai-rag-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'rag' })\n\n// ─── 默认提示词 ───\n\nconst DEFAULT_RAG_SYSTEM_PROMPT = `You are a helpful assistant. Answer the user's question based on the provided context.\nIf the context doesn't contain relevant information, say so honestly.\nWhen using information from the context, cite the source by its number, e.g. [1] or [2].`\n\n/**\n * 默认上下文格式化:将检索结果格式化为编号列表,含标题和 URL、便于 LLM 注明信源\n */\nfunction defaultFormatContext(items: RagContextItem[]): string {\n if (items.length === 0)\n return 'No relevant context found.'\n\n return items\n .map((item, i) => {\n const sourceLabel = item.citation?.title ?? item.citation?.url ?? item.sourceId\n const urlPart = item.citation?.url ? ` (${item.citation.url})` : ''\n return `[${i + 1}] Source: ${sourceLabel}${urlPart}\\n${item.content}`\n })\n .join('\\n\\n')\n}\n\n/**\n * 创建 RAG 操作接口\n *\n * @param llm - LLM 操作(用于生成回答)\n * @param retrieval - Retrieval 操作(用于检索上下文)\n * @returns RagOperations 实例\n */\nexport function createRagOperations(llm: LLMOperations, retrieval: RetrievalOperations): RagOperations {\n return {\n /**\n * 执行 RAG 查询\n *\n * 流程:\n * 1. 向量检索相关文档(`retrieval.retrieve`)\n * 2. 格式化为编号列表上下文(可通过 `options.formatContext` 自定义)\n * 3. 组装系统提示 + 上下文 → 调用 LLM 生成回答\n *\n * @param query - 用户查询文本\n * @param options - 可选配置(sources / topK / minScore / systemPrompt / formatContext / history 等)\n * @returns `ok(RagResult)` 含 answer、context 列表与引用信源;检索或生成失败时返回错误\n */\n async query(query: string, options?: RagOptions): Promise<HaiResult<RagResult>> {\n logger.trace('Starting RAG query', { query: query.slice(0, 100) })\n\n try {\n // 阶段1:检索相关上下文\n const retrieveResult = await retrieval.retrieve({\n query,\n sources: options?.sources,\n topK: options?.topK ?? 5,\n minScore: options?.minScore,\n enableRerank: options?.enableRerank,\n rerankModel: options?.rerankModel,\n })\n\n if (!retrieveResult.success) {\n return err(HaiAIError.RAG_CONTEXT_BUILD_FAILED, aiM('ai_internalError', { params: { error: 'Failed to retrieve context' } }), retrieveResult.error)\n }\n\n // 构建上下文\n const contextItems: RagContextItem[] = retrieveResult.data.items.map(item => ({\n content: item.content,\n score: item.score,\n sourceId: item.sourceId,\n metadata: item.metadata,\n citation: item.citation,\n }))\n\n // 格式化上下文\n const formatFn = options?.formatContext ?? defaultFormatContext\n const contextText = formatFn(contextItems)\n\n // 阶段2:构建 LLM 消息\n const systemPrompt = options?.systemPrompt ?? DEFAULT_RAG_SYSTEM_PROMPT\n const systemContent = `${systemPrompt}\\n\\n--- Context ---\\n${contextText}\\n--- End Context ---`\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemContent },\n ]\n\n // 添加消息历史(多轮对话)\n if (options?.messages) {\n messages.push(...options.messages)\n }\n\n // 添加当前查询\n messages.push({ role: 'user', content: query })\n\n // 阶段3:调用 LLM 生成回答\n const chatResult = await llm.chat({\n model: options?.model,\n messages,\n temperature: options?.temperature,\n objectId: options?.objectId,\n sessionId: options?.sessionId,\n enablePersist: options?.enablePersist,\n signal: options?.signal,\n })\n\n if (!chatResult.success) {\n return err(HaiAIError.RAG_FAILED, aiM('ai_internalError', { params: { error: 'LLM generation failed' } }), chatResult.error)\n }\n\n const choice = chatResult.data.choices[0]\n const answer = choice?.message?.content ?? ''\n\n logger.trace('RAG query completed', {\n contextCount: contextItems.length,\n model: chatResult.data.model,\n })\n\n // 从上下文项中去重聚合信源引用\n const citationMap = new Map<string, Citation>()\n for (const ctx of contextItems) {\n if (ctx.citation) {\n const key = ctx.citation.documentId ?? ctx.citation.chunkId ?? ctx.citation.url ?? `${ctx.sourceId}:${ctx.content.slice(0, 50)}`\n if (!citationMap.has(key)) {\n citationMap.set(key, ctx.citation)\n }\n }\n }\n const citations = Array.from(citationMap.values())\n\n return ok({\n answer,\n context: contextItems,\n citations,\n query,\n model: chatResult.data.model,\n usage: chatResult.data.usage\n ? {\n prompt_tokens: chatResult.data.usage.prompt_tokens,\n completion_tokens: chatResult.data.usage.completion_tokens,\n total_tokens: chatResult.data.usage.total_tokens,\n }\n : undefined,\n })\n }\n catch (error) {\n logger.error('RAG query failed', { error })\n return err(HaiAIError.RAG_FAILED, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 流式 RAG 查询:先产出 context,再逐 chunk 产出 delta,最后 done\n */\n async* queryStream(query: string, options?: RagOptions): AsyncIterable<RagStreamEvent> {\n logger.trace('Starting RAG stream', { query: query.slice(0, 100) })\n\n // 阶段1:检索\n const retrieveResult = await retrieval.retrieve({\n query,\n sources: options?.sources,\n topK: options?.topK ?? 5,\n minScore: options?.minScore,\n enableRerank: options?.enableRerank,\n rerankModel: options?.rerankModel,\n })\n\n if (!retrieveResult.success) {\n throw new Error(`RAG context build failed: ${String(retrieveResult.error)}`)\n }\n\n const contextItems: RagContextItem[] = retrieveResult.data.items.map(item => ({\n content: item.content,\n score: item.score,\n sourceId: item.sourceId,\n metadata: item.metadata,\n citation: item.citation,\n }))\n\n // 去重信源\n const citationMap = new Map<string, Citation>()\n for (const ctx of contextItems) {\n if (ctx.citation) {\n const key = ctx.citation.documentId ?? ctx.citation.chunkId ?? ctx.citation.url ?? `${ctx.sourceId}:${ctx.content.slice(0, 50)}`\n if (!citationMap.has(key)) {\n citationMap.set(key, ctx.citation)\n }\n }\n }\n const citations = Array.from(citationMap.values())\n\n // 产出上下文事件\n yield { type: 'context', items: contextItems, citations }\n\n // 阶段2:流式 LLM 生成\n const formatFn = options?.formatContext ?? defaultFormatContext\n const contextText = formatFn(contextItems)\n const systemPrompt = options?.systemPrompt ?? DEFAULT_RAG_SYSTEM_PROMPT\n const systemContent = `${systemPrompt}\\n\\n--- Context ---\\n${contextText}\\n--- End Context ---`\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemContent },\n ]\n if (options?.messages) {\n messages.push(...options.messages)\n }\n messages.push({ role: 'user', content: query })\n\n const stream = llm.chatStream({\n model: options?.model,\n messages,\n temperature: options?.temperature,\n objectId: options?.objectId,\n sessionId: options?.sessionId,\n enablePersist: options?.enablePersist,\n signal: options?.signal,\n })\n\n let fullAnswer = ''\n let model = ''\n let usage: { prompt_tokens: number, completion_tokens: number, total_tokens: number } | undefined\n\n for await (const chunk of stream) {\n if (!model && chunk.model)\n model = chunk.model\n const delta = chunk.choices?.[0]?.delta?.content\n if (delta) {\n fullAnswer += delta\n yield { type: 'delta', text: delta }\n }\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens,\n completion_tokens: chunk.usage.completion_tokens,\n total_tokens: chunk.usage.total_tokens,\n }\n }\n }\n\n yield { type: 'done', answer: fullAnswer, model, usage }\n },\n }\n}\n","/**\n * @h-ai/ai — Reasoning 子功能实现\n *\n * 提供 ReAct、CoT、Plan-and-Execute 三种推理策略的实现。\n * @module ai-reasoning-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig, ModelScenario } from '../ai-config.js'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type {\n ReasoningOperations,\n ReasoningOptions,\n ReasoningResult,\n ReasoningStep,\n ReasoningStreamEvent,\n} from './ai-reasoning-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'reasoning' })\n\n// ─── 策略提示词 ───\n\nconst REACT_SYSTEM_PROMPT = `You are a reasoning agent that follows the ReAct (Reasoning and Acting) framework.\nFor each step:\n1. Think: Analyze what you know and what you need to find out.\n2. Act: If you need to use a tool, call it. If you have enough information, provide the final answer.\n3. Observe: Review the tool results.\n\nRepeat until you can provide a confident final answer.\nAlways think step by step before acting.`\n\nconst COT_SYSTEM_PROMPT = `You are a reasoning assistant that uses Chain-of-Thought reasoning.\nBreak down the problem into clear logical steps.\nShow your reasoning process explicitly.\nAfter working through all steps, provide a clear final answer.`\n\nconst PLAN_EXECUTE_SYSTEM_PROMPT = `You are a planning and execution agent.\nFirst, create a detailed step-by-step plan to solve the problem.\nThen, execute each step one by one.\nAfter completing all steps, provide the final answer.\n\nFormat your plan as a numbered list.`\n\n/**\n * 创建 Reasoning 操作接口\n *\n * @param config - 校验后的 AI 配置\n * @param llm - LLM 操作接口\n * @returns ReasoningOperations 实例\n */\nexport function createReasoningOperations(config: AIConfig, llm: LLMOperations): ReasoningOperations {\n /**\n * 提取场景对应的模型名称(仅用于构造请求, API Key 校验由 provider 层负责)\n */\n function scenarioModel(scenario: ModelScenario, explicit?: string): string | undefined {\n const result = resolveModelEntry(config.llm, scenario, explicit)\n return result.success ? result.data.model : explicit\n }\n /**\n * 执行 ReAct 策略推理\n */\n async function runReact(\n query: string,\n options: ReasoningOptions,\n ): Promise<HaiResult<ReasoningResult>> {\n const maxRounds = options.maxRounds ?? 10\n const systemPrompt = options.systemPrompt ?? REACT_SYSTEM_PROMPT\n const steps: ReasoningStep[] = []\n let stepIndex = 0\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemPrompt },\n ...(options.messages ?? []),\n { role: 'user', content: query },\n ]\n\n for (let round = 0; round < maxRounds; round++) {\n // 调用 LLM\n const chatResult = await llm.chat({\n model: scenarioModel('reasoning', options.model),\n messages,\n temperature: options.temperature,\n tools: options.tools?.getDefinitions(),\n tool_choice: options.tools ? 'auto' : undefined,\n objectId: options.objectId,\n sessionId: options.sessionId,\n enablePersist: options.enablePersist,\n signal: options.signal,\n })\n\n if (!chatResult.success)\n return chatResult\n\n const choice = chatResult.data.choices[0]\n if (!choice) {\n return err(HaiAIError.REASONING_FAILED, aiM('ai_internalError', { params: { error: 'No response from LLM' } }))\n }\n\n const assistantMessage = choice.message\n\n // 记录思考步骤\n if (assistantMessage.content) {\n steps.push({\n type: 'thought',\n content: typeof assistantMessage.content === 'string' ? assistantMessage.content : '',\n index: stepIndex++,\n })\n }\n\n // 添加助手消息到历史\n messages.push(assistantMessage)\n\n // 如果有工具调用\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0 && options.tools) {\n for (const toolCall of assistantMessage.tool_calls) {\n if (toolCall.type !== 'function')\n continue\n // 记录 action 步骤\n steps.push({\n type: 'action',\n content: `Calling tool: ${toolCall.function.name}`,\n toolCall: {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments) as Record<string, unknown>,\n },\n index: stepIndex++,\n })\n\n // 执行工具(透传取消信号与作用域,打断 / 超时时可提前中止耗时工具)\n const toolResult = await options.tools.execute(toolCall, { signal: options.signal, objectId: options.objectId, sessionId: options.sessionId })\n const rawToolContent = toolResult.success\n ? toolResult.data.content\n : `Tool error: ${toolResult.error.message}`\n const toolContent = typeof rawToolContent === 'string'\n ? rawToolContent\n : (rawToolContent as Array<{ text?: string }>).map(p => p.text ?? '').join(' ')\n\n // 记录 observation 步骤\n steps.push({\n type: 'observation',\n content: toolContent,\n index: stepIndex++,\n })\n\n // 添加工具消息\n messages.push({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: toolContent,\n })\n }\n continue\n }\n\n // 完成推理\n if (choice.finish_reason === 'stop') {\n const answer = typeof assistantMessage.content === 'string' ? assistantMessage.content : ''\n steps.push({ type: 'answer', content: answer, index: stepIndex })\n\n return ok({\n answer,\n steps,\n strategy: 'react',\n rounds: round + 1,\n messages,\n })\n }\n }\n\n // 达到最大轮次\n return err(HaiAIError.REASONING_MAX_ROUNDS, aiM('ai_internalError', { params: { error: `Max rounds (${maxRounds}) reached` } }))\n }\n\n /**\n * 执行 Chain-of-Thought 策略推理\n */\n async function runCoT(\n query: string,\n options: ReasoningOptions,\n ): Promise<HaiResult<ReasoningResult>> {\n const systemPrompt = options.systemPrompt ?? COT_SYSTEM_PROMPT\n const steps: ReasoningStep[] = []\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemPrompt },\n ...(options.messages ?? []),\n { role: 'user', content: `${query}\\n\\nPlease think step by step.` },\n ]\n\n const chatResult = await llm.chat({\n model: scenarioModel('reasoning', options.model),\n messages,\n temperature: options.temperature,\n objectId: options.objectId,\n sessionId: options.sessionId,\n enablePersist: options.enablePersist,\n signal: options.signal,\n })\n\n if (!chatResult.success)\n return chatResult\n\n const choice = chatResult.data.choices[0]\n const answer = choice?.message?.content ?? ''\n\n // 将回答解析为步骤\n const lines = answer.split('\\n').filter(l => l.trim().length > 0)\n let isAnswer = false\n let stepIndex = 0\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (trimmed.toLowerCase().startsWith('final answer') || trimmed.toLowerCase().startsWith('answer:')) {\n isAnswer = true\n }\n\n steps.push({\n type: isAnswer ? 'answer' : 'thought',\n content: trimmed,\n index: stepIndex++,\n })\n }\n\n messages.push({ role: 'assistant', content: answer })\n\n return ok({\n answer,\n steps,\n strategy: 'cot',\n rounds: 1,\n messages,\n })\n }\n\n /**\n * 执行 Plan-and-Execute 策略推理\n */\n async function runPlanExecute(\n query: string,\n options: ReasoningOptions,\n ): Promise<HaiResult<ReasoningResult>> {\n const maxRounds = options.maxRounds ?? 10\n const systemPrompt = options.systemPrompt ?? PLAN_EXECUTE_SYSTEM_PROMPT\n const steps: ReasoningStep[] = []\n let stepIndex = 0\n\n // 阶段1:生成计划\n const planMessages: ChatMessage[] = [\n { role: 'system', content: systemPrompt },\n ...(options.messages ?? []),\n { role: 'user', content: `Create a plan to solve this:\\n${query}` },\n ]\n\n const planResult = await llm.chat({\n model: scenarioModel('plan', options.planModel ?? options.model),\n messages: planMessages,\n temperature: options.temperature,\n objectId: options.objectId,\n sessionId: options.sessionId,\n enablePersist: options.enablePersist,\n signal: options.signal,\n })\n\n if (!planResult.success)\n return planResult\n\n const plan = planResult.data.choices[0]?.message?.content ?? ''\n steps.push({ type: 'plan', content: plan, index: stepIndex++ })\n\n // 阶段2:执行计划\n const executeMessages: ChatMessage[] = [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: query },\n { role: 'assistant', content: plan },\n { role: 'user', content: 'Now execute each step of the plan. Use tools if available.' },\n ]\n\n for (let round = 0; round < maxRounds; round++) {\n const execResult = await llm.chat({\n model: scenarioModel('execute', options.executeModel ?? options.model),\n messages: executeMessages,\n temperature: options.temperature,\n tools: options.tools?.getDefinitions(),\n tool_choice: options.tools ? 'auto' : undefined,\n objectId: options.objectId,\n sessionId: options.sessionId,\n enablePersist: options.enablePersist,\n signal: options.signal,\n })\n\n if (!execResult.success)\n return execResult\n\n const choice = execResult.data.choices[0]\n if (!choice)\n break\n\n const msg = choice.message\n\n if (msg.content) {\n steps.push({ type: 'thought', content: typeof msg.content === 'string' ? msg.content : '', index: stepIndex++ })\n }\n\n executeMessages.push(msg)\n\n // 工具调用\n if (msg.tool_calls && msg.tool_calls.length > 0 && options.tools) {\n for (const toolCall of msg.tool_calls) {\n if (toolCall.type !== 'function')\n continue\n steps.push({\n type: 'action',\n content: `Executing: ${toolCall.function.name}`,\n toolCall: {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments) as Record<string, unknown>,\n },\n index: stepIndex++,\n })\n\n const toolResult = await options.tools.execute(toolCall, { signal: options.signal, objectId: options.objectId, sessionId: options.sessionId })\n const rawToolContent = toolResult.success\n ? toolResult.data.content\n : `Tool error: ${toolResult.error.message}`\n const toolContent = typeof rawToolContent === 'string'\n ? rawToolContent\n : (rawToolContent as Array<{ text?: string }>).map(p => p.text ?? '').join(' ')\n\n steps.push({ type: 'observation', content: toolContent, index: stepIndex++ })\n executeMessages.push({ role: 'tool', tool_call_id: toolCall.id, content: toolContent })\n }\n continue\n }\n\n // 完成\n if (choice.finish_reason === 'stop') {\n const answer = typeof msg.content === 'string' ? msg.content : ''\n steps.push({ type: 'answer', content: answer, index: stepIndex })\n return ok({\n answer,\n steps,\n strategy: 'plan-execute',\n rounds: round + 1,\n messages: executeMessages,\n })\n }\n }\n\n return err(HaiAIError.REASONING_MAX_ROUNDS, aiM('ai_internalError', { params: { error: `Max rounds (${maxRounds}) reached` } }))\n }\n\n return {\n async run(query: string, options?: ReasoningOptions): Promise<HaiResult<ReasoningResult>> {\n const strategy = options?.strategy ?? 'react'\n logger.trace('Starting reasoning', { strategy, maxRounds: options?.maxRounds })\n\n try {\n switch (strategy) {\n case 'react':\n return await runReact(query, options ?? {})\n case 'cot':\n return await runCoT(query, options ?? {})\n case 'plan-execute':\n return await runPlanExecute(query, options ?? {})\n default:\n return err(HaiAIError.REASONING_STRATEGY_NOT_FOUND, aiM('ai_internalError', { params: { error: `Unknown strategy: ${strategy}` } }))\n }\n }\n catch (error) {\n logger.error('Reasoning failed', { error })\n return err(HaiAIError.REASONING_FAILED, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 流式推理:逐步产出推理步骤 + 最终答案增量\n *\n * 当前实现基于 run() 的结果分步产出事件,\n * 后续可优化为真正逐轮流式输出。\n */\n async* runStream(query: string, options?: ReasoningOptions): AsyncIterable<ReasoningStreamEvent> {\n const result = await this.run(query, options)\n\n if (!result.success) {\n throw result.error\n }\n\n const { steps, answer } = result.data\n\n // 产出所有推理步骤(排除最终 answer 步骤)\n for (const step of steps) {\n if (step.type !== 'answer') {\n yield { type: 'step', step }\n }\n }\n\n // 产出最终答案作为 delta\n if (answer) {\n yield { type: 'delta', text: answer }\n }\n\n // 产出完成事件\n yield { type: 'done', result: result.data }\n },\n }\n}\n","/**\n * @h-ai/ai — Rerank 子功能实现\n *\n * 基于 Cohere 兼容格式的文档重排序实现。\n * @module ai-rerank-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig } from '../ai-config.js'\n\nimport type {\n RerankDocument,\n RerankItem,\n RerankOperations,\n RerankRequest,\n RerankResponse,\n} from './ai-rerank-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'rerank' })\n\n/**\n * Cohere Rerank API 响应结果条目\n */\ninterface CohereRerankResult {\n index: number\n relevance_score: number\n document?: { text: string }\n}\n\n/**\n * Cohere Rerank API 响应体\n */\ninterface CohereRerankResponse {\n id: string\n results: CohereRerankResult[]\n meta?: Record<string, unknown>\n}\n\n/**\n * 创建 Rerank 操作接口\n *\n * 通过 Cohere 兼容的 Rerank API 对文档进行相关性重排序。\n * apiKey / baseUrl / model 统一通过 `resolveModelEntry(llm, 'rerank')` 解析,\n * 可在 `llm.models` 中为 rerank 场景配置独立的 apiKey / baseUrl。\n *\n * @param config - 校验后的 AI 配置\n * @returns RerankOperations 实例\n */\nexport function createRerankOperations(config: AIConfig): RerankOperations {\n /** 将输入文档统一转换为文本数组和 id 映射 */\n function normalizeDocuments(documents: string[] | RerankDocument[]): {\n texts: string[]\n ids: (string | undefined)[]\n } {\n if (documents.length === 0) {\n return { texts: [], ids: [] }\n }\n if (typeof documents[0] === 'string') {\n const strs = documents as string[]\n return { texts: strs, ids: strs.map(() => undefined) }\n }\n const docs = documents as RerankDocument[]\n return {\n texts: docs.map(d => d.text),\n ids: docs.map(d => d.id),\n }\n }\n\n /**\n * 调用 Cohere 兼容的 Rerank API\n */\n async function callRerankAPI(request: RerankRequest): Promise<HaiResult<RerankResponse>> {\n const resolvedResult = resolveModelEntry(config.llm, 'rerank', request.model, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for rerank' } }),\n })\n if (!resolvedResult.success)\n return resolvedResult\n const resolved = resolvedResult.data\n\n const { texts, ids } = normalizeDocuments(request.documents)\n if (texts.length === 0) {\n return err(HaiAIError.RERANK_INVALID_REQUEST, aiM('ai_rerankInvalidRequest', { params: { reason: 'documents cannot be empty' } }))\n }\n\n const body: Record<string, unknown> = {\n model: resolved.model,\n query: request.query,\n documents: texts,\n }\n if (request.topN !== undefined) {\n body.top_n = request.topN\n }\n if (request.returnDocuments) {\n body.return_documents = true\n }\n\n logger.trace('Calling rerank API', { model: resolved.model, documentCount: texts.length, topN: request.topN })\n\n try {\n const response = await fetch(`${resolved.baseUrl}/v1/rerank`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${resolved.apiKey}`,\n },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText)\n logger.error('Rerank API request failed', { status: response.status, error: errorText })\n return err(HaiAIError.RERANK_API_ERROR, aiM('ai_rerankApiFailed', { params: { error: `HTTP ${response.status}: ${errorText}` } }))\n }\n\n const data = await response.json() as CohereRerankResponse\n\n const results: RerankItem[] = data.results.map(item => ({\n index: item.index,\n id: ids[item.index],\n relevanceScore: item.relevance_score,\n document: item.document?.text,\n }))\n\n logger.trace('Rerank completed', { resultCount: results.length })\n\n return ok({ model: resolved.model, results })\n }\n catch (error) {\n logger.error('Rerank API call failed', { error })\n return err(HaiAIError.RERANK_API_ERROR, aiM('ai_rerankApiFailed', { params: { error: String(error) } }), error)\n }\n }\n\n return {\n /**\n * 对文档列表进行相关度重排\n *\n * 调用 Cohere 兼容 Rerank API,按与 query 的语义相关度对文档重新排序。\n *\n * @param request - 重排请求(query、documents、可选 topN/model)\n * @returns `ok(RerankResponse)` 含重排后的结果列表;API 调用失败时返回 `RERANK_API_ERROR`\n */\n async rerank(request: RerankRequest): Promise<HaiResult<RerankResponse>> {\n return callRerankAPI(request)\n },\n\n /**\n * 对纯文本数组进行重排(`rerank` 的简化版本)\n *\n * @param query - 用于对比相关度的查询文本\n * @param texts - 待重排的文本列表\n * @param topN - 仅返回前 N 个结果(可选)\n * @returns `ok(RerankItem[])` 按相关度降序排列的结果;API 调用失败时返回错误\n */\n async rerankTexts(query: string, texts: string[], topN?: number): Promise<HaiResult<RerankItem[]>> {\n const result = await callRerankAPI({ query, documents: texts, topN })\n if (!result.success)\n return result\n return ok(result.data.results)\n },\n }\n}\n","/**\n * @h-ai/ai — Retrieval 子功能实现\n *\n * 基于向量数据库 (@h-ai/vecdb) 和 Embedding 实现的检索功能。\n * @module ai-retrieval-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { EmbeddingOperations } from '../embedding/ai-embedding-types.js'\nimport type { RerankOperations } from '../rerank/ai-rerank-types.js'\nimport type { AIRelStore, AIStoreProvider } from '../store/ai-store-types.js'\nimport type {\n Citation,\n RetrievalOperations,\n RetrievalRequest,\n RetrievalResult,\n RetrievalResultItem,\n RetrievalSource,\n} from './ai-retrieval-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'retrieval' })\n\n/**\n * 创建 Retrieval 操作接口\n *\n * @param embeddingOps - Embedding 操作(用于将查询文本向量化)\n * @param storeProvider - 存储 Provider(用于按 collection 创建向量存储实例)\n * @param sourceStore - 检索源持久化存储(支持分布式一致)\n * @returns RetrievalOperations 实例\n */\nexport function createRetrievalOperations(\n embeddingOps: EmbeddingOperations,\n storeProvider: AIStoreProvider,\n sourceStore: AIRelStore<RetrievalSource>,\n rerankOps?: RerankOperations | null,\n): RetrievalOperations {\n // vectorStore 实例缓存(按 collection 复用,避免每次检索都创建新实例)\n const vectorStoreCache = new Map<string, ReturnType<AIStoreProvider['createVectorStore']>>()\n function getVectorStore(collection: string) {\n let store = vectorStoreCache.get(collection)\n if (!store) {\n store = storeProvider.createVectorStore(collection)\n vectorStoreCache.set(collection, store)\n }\n return store\n }\n\n return {\n /**\n * 注册检索源\n *\n * 将配置好的检索源持久化到 store,后续 `retrieve` 时根据 source.id 匹配。\n * 同一 id 不可重复注册,重复调用返回错误。\n *\n * @param source - 检索源配置(id、collection、描述等)\n * @returns `ok(undefined)` 注册成功;`err` 含错误码 `RETRIEVAL_FAILED`(重复注册)\n */\n async addSource(source: RetrievalSource): Promise<HaiResult<void>> {\n const existing = await sourceStore.get(source.id)\n if (existing) {\n return err(HaiAIError.RETRIEVAL_FAILED, aiM('ai_internalError', { params: { error: `Source '${source.id}' already exists` } }))\n }\n await sourceStore.save(source.id, source)\n logger.debug('Retrieval source added', { sourceId: source.id, collection: source.collection })\n return ok(undefined)\n },\n\n /**\n * 取消注册检索源\n *\n * 从 store 删除指定 id 的检索源。源不存在时返回 `RETRIEVAL_SOURCE_NOT_FOUND` 错误。\n *\n * @param sourceId - 检索源的唯一标识\n * @returns `ok(undefined)` 删除成功;`err` 含错误码 `RETRIEVAL_SOURCE_NOT_FOUND`\n */\n async removeSource(sourceId: string): Promise<HaiResult<void>> {\n const existing = await sourceStore.get(sourceId)\n if (!existing) {\n return err(HaiAIError.RETRIEVAL_SOURCE_NOT_FOUND, aiM('ai_internalError', { params: { error: `Source '${sourceId}' not found` } }))\n }\n await sourceStore.remove(sourceId)\n logger.debug('Retrieval source removed', { sourceId })\n return ok(undefined)\n },\n\n /**\n * 列出所有已注册的检索源\n *\n * @returns 全部检索源数组(无源时返回空数组)\n */\n async listSources(): Promise<RetrievalSource[]> {\n return sourceStore.query({})\n },\n\n /**\n * 执行向量检索\n *\n * 流程:\n * 1. 将 `request.query` 向量化(Embedding)\n * 2. 对每个目标检索源并发执行向量近邻搜索\n * 3. 合并结果 → 按 score 降序 → 截取 topK\n *\n * @param request - 检索请求(query、可选 sources / topK / minScore 等)\n * @returns `ok(RetrievalResult)` 含检索项列表与引用信息;无源时返回 `RETRIEVAL_SOURCE_NOT_FOUND` 错误\n */\n async retrieve(request: RetrievalRequest): Promise<HaiResult<RetrievalResult>> {\n const startTime = Date.now()\n\n // 确定要查询的源(从 DB 读取,分布式一致)\n const targetSources = await sourceStore.query(\n request.sources?.length\n ? { where: { id: { $in: request.sources } } }\n : {},\n )\n\n if (targetSources.length === 0) {\n return err(HaiAIError.RETRIEVAL_SOURCE_NOT_FOUND, aiM('ai_internalError', { params: { error: 'No retrieval sources configured' } }))\n }\n\n try {\n // 向量化查询文本\n const embedResult = await embeddingOps.embedText(request.query)\n if (!embedResult.success) {\n return err(HaiAIError.RETRIEVAL_FAILED, aiM('ai_internalError', { params: { error: 'Failed to embed query' } }), embedResult.error)\n }\n\n const queryVector = embedResult.data\n\n // 并发查询所有源\n const allItems: RetrievalResultItem[] = []\n\n const searchPromises = targetSources.map(async (source) => {\n const topK = request.topK ?? source.topK ?? 5\n const minScore = request.minScore ?? source.minScore\n\n const vectorStore = getVectorStore(source.collection)\n const searchResults = await vectorStore.search(queryVector, {\n topK,\n minScore,\n filter: source.filter,\n })\n\n for (const item of searchResults) {\n // 从向量记录 metadata 构建结构化信源引用\n const citation: Citation = {\n documentId: item.metadata?.documentId as string | undefined,\n title: item.metadata?.title as string | undefined ?? source.name,\n url: item.metadata?.url as string | undefined ?? source.url,\n position: item.metadata?.position as string | undefined,\n chunkId: item.id,\n collection: source.collection,\n }\n\n allItems.push({\n id: item.id,\n content: item.content ?? '',\n score: item.score,\n sourceId: source.id,\n metadata: item.metadata,\n citation,\n })\n }\n })\n\n await Promise.all(searchPromises)\n\n // 可选:Rerank 重排序\n if (request.enableRerank && rerankOps && allItems.length > 0) {\n const rerankResult = await rerankOps.rerank({\n query: request.query,\n documents: allItems.map(item => item.content),\n model: request.rerankModel,\n topN: request.topK ?? 10,\n returnDocuments: false,\n })\n if (rerankResult.success) {\n const reranked = rerankResult.data.results\n .map(r => ({ ...allItems[r.index], score: r.relevanceScore }))\n allItems.length = 0\n allItems.push(...reranked)\n }\n else {\n logger.warn('Rerank failed, falling back to vector scores', { error: rerankResult.error })\n }\n }\n\n // 按分数降序排列\n allItems.sort((a, b) => b.score - a.score)\n\n // 限制总数(取全局 topK 或所有结果)\n const topK = request.topK ?? 10\n const limitedItems = allItems.slice(0, topK)\n\n const duration = Date.now() - startTime\n logger.trace('Retrieval completed', { query: request.query, resultCount: limitedItems.length, duration })\n\n return ok({\n items: limitedItems,\n query: request.query,\n duration,\n })\n }\n catch (error) {\n logger.error('Retrieval failed', { error })\n return err(HaiAIError.RETRIEVAL_FAILED, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — Summary 子功能实现\n *\n * 使用 LLM 对对话消息生成摘要,支持增量摘要(传入前序摘要合并)。\n * @module ai-summary-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { LLMConfig, SummaryConfig } from '../ai-config.js'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type { TokenOperations } from '../token/ai-token-types.js'\nimport type { SummaryOperations, SummaryOptions, SummaryResult } from './ai-summary-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'summary' })\n\n// ─── 摘要提示词 ───\n\nconst SUMMARIZE_SYSTEM_PROMPT = `You are a conversation summarizer. Create a concise summary of the conversation that preserves:\n1. Key facts and decisions made\n2. Important context and background information\n3. User preferences or instructions mentioned\n4. Any unresolved questions or pending topics\n\nRules:\n- Be concise but comprehensive — capture all important information\n- Use third person (\"The user asked...\", \"The assistant explained...\")\n- Preserve specific details like names, numbers, dates, and technical terms\n- Structure the summary in logical paragraphs\n- Keep the summary under 500 words`\n\nconst INCREMENTAL_SUMMARIZE_SUFFIX = `You have a previous summary and new messages to incorporate.\n\nPrevious Summary:\n{previousSummary}\n\nMerge the previous summary with the new conversation messages to create an updated, comprehensive summary. Follow the same rules as above: be concise, preserve key details, use third person.`\n\n/**\n * 创建 Summary 操作接口\n *\n * @param llmConfig - LLM 配置(用于通过 resolveModelEntry 解析场景模型)\n * @param llm - LLM 操作接口(用于生成摘要)\n * @param token - Token 操作接口(用于估算摘要 Token 数)\n * @param config - Summary 配置\n * @returns SummaryOperations 实例\n */\nexport function createSummaryOperations(\n llmConfig: LLMConfig,\n llm: LLMOperations,\n token: TokenOperations,\n config: SummaryConfig,\n): SummaryOperations {\n const { systemPrompt } = config\n\n /**\n * 构建摘要用 systemPrompt\n */\n function buildSummaryPrompt(options?: SummaryOptions): string {\n const basePrompt = options?.systemPrompt ?? systemPrompt ?? SUMMARIZE_SYSTEM_PROMPT\n if (!options?.previousSummary)\n return basePrompt\n\n return `${basePrompt}\\n\\n${INCREMENTAL_SUMMARIZE_SUFFIX.replace('{previousSummary}', options.previousSummary)}`\n }\n\n /**\n * 提取场景对应的模型名称(API Key 校验由 provider 层负责)\n */\n function scenarioModel(explicit?: string): string | undefined {\n const result = resolveModelEntry(llmConfig, 'summary', explicit)\n return result.success ? result.data.model : explicit\n }\n\n /**\n * 生成摘要文本\n */\n async function generate(\n messages: ChatMessage[],\n options?: SummaryOptions,\n ): Promise<HaiResult<string>> {\n const conversationText = messages\n .filter(m => m.role !== 'system')\n .map((m) => {\n const content = m.role === 'assistant'\n ? (m.content ?? '[tool call]')\n : m.role === 'tool'\n ? `[tool result: ${m.content.slice(0, 200)}]`\n : (typeof m.content === 'string' ? m.content : '[multimodal]')\n return `${m.role}: ${content}`\n })\n .join('\\n')\n\n const prompt = buildSummaryPrompt(options)\n\n const chatResult = await llm.chat({\n model: scenarioModel(options?.model),\n messages: [\n { role: 'system', content: prompt },\n { role: 'user', content: conversationText },\n ],\n temperature: options?.temperature ?? 0.3,\n enablePersist: false,\n })\n\n if (!chatResult.success) {\n return err(HaiAIError.CONTEXT_SUMMARIZE_FAILED, aiM('ai_contextSummarizeFailed', { params: { error: String(chatResult.error.message) } }), chatResult.error)\n }\n\n return ok(chatResult.data.choices[0]?.message?.content ?? '')\n }\n\n /**\n * 生成摘要(含元数据)\n */\n async function summarize(\n messages: ChatMessage[],\n options?: SummaryOptions,\n ): Promise<HaiResult<SummaryResult>> {\n logger.trace('Summarizing messages', { messageCount: messages.length })\n\n try {\n const result = await generate(messages, options)\n if (!result.success)\n return result as HaiResult<never>\n\n const summary = result.data\n return ok({\n summary,\n tokenCount: token.estimateText(summary),\n coveredMessages: messages.filter(m => m.role !== 'system').length,\n })\n }\n catch (error) {\n logger.error('Context summarization failed', { error })\n return err(HaiAIError.CONTEXT_SUMMARIZE_FAILED, aiM('ai_contextSummarizeFailed', { params: { error: String(error) } }), error)\n }\n }\n\n return {\n generate,\n summarize,\n }\n}\n","/**\n * @h-ai/ai — Token 子功能实现\n *\n * 提供轻量级 Token 估算能力,无需外部依赖。\n * 同时导出纯函数(可指定 tokenRatio)和工厂函数(绑定配置的 tokenRatio)。\n * @module ai-token-functions\n */\n\nimport type { TokenConfig } from '../ai-config.js'\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { TokenOperations } from './ai-token-types.js'\n\n/**\n * 估算单条文本的 Token 数\n *\n * 使用字符级估算:中文约每字 1-2 token,英文约每 4 字符 1 token。\n * 这是一个保守估算,实际 token 数通常略低于此值。\n *\n * @param text - 文本内容\n * @param tokenRatio - 每字符对应的 token 数(默认 0.25)\n * @returns 估算 token 数\n */\nexport function estimateTextTokens(text: string, tokenRatio = 0.25): number {\n if (!text)\n return 0\n\n // 区分中文和非中文字符\n let cjkCount = 0\n let otherCount = 0\n\n for (const char of text) {\n const code = char.codePointAt(0) ?? 0\n // CJK 统一表意文字范围\n if (\n (code >= 0x4E00 && code <= 0x9FFF)\n || (code >= 0x3400 && code <= 0x4DBF)\n || (code >= 0x20000 && code <= 0x2A6DF)\n ) {\n cjkCount++\n }\n else {\n otherCount++\n }\n }\n\n // 中文:约 1.5 token/字;其他:按 tokenRatio 计算\n return Math.ceil(cjkCount * 1.5 + otherCount * tokenRatio)\n}\n\n/**\n * 估算消息列表的总 Token 数\n *\n * 包含消息结构开销(每条消息约 4 token 用于角色标记和分隔)。\n *\n * @param messages - 消息列表\n * @param tokenRatio - 每字符对应的 token 数\n * @returns 估算 token 总数\n */\nexport function estimateMessagesTokens(messages: ChatMessage[], tokenRatio = 0.25): number {\n let total = 0\n\n for (const msg of messages) {\n // 每条消息固定开销(角色标记 + 分隔符)\n total += 4\n\n const content = getMessageContent(msg)\n total += estimateTextTokens(content, tokenRatio)\n }\n\n // 回复开始标记\n total += 2\n\n return total\n}\n\n/**\n * 提取消息的文本内容\n */\nfunction getMessageContent(msg: ChatMessage): string {\n if (msg.role === 'assistant') {\n const c = msg.content\n if (typeof c === 'string')\n return c\n if (Array.isArray(c))\n return (c as Array<{ type: string, text?: string }>).filter(p => p.type === 'text').map(p => p.text ?? '').join(' ')\n return ''\n }\n if (msg.role === 'tool') {\n const c = msg.content\n if (typeof c === 'string')\n return c\n if (Array.isArray(c))\n return (c as Array<{ type: string, text?: string }>).filter(p => p.type === 'text').map(p => p.text ?? '').join(' ')\n return ''\n }\n // system / user\n const content = (msg as { content: string | Array<{ type: string, text?: string }> }).content\n if (typeof content === 'string')\n return content\n if (Array.isArray(content)) {\n return content\n .filter((c): c is { type: 'text', text: string } => c.type === 'text')\n .map(c => c.text)\n .join(' ')\n }\n return ''\n}\n\n/**\n * 创建 Token 操作接口\n *\n * @param config - Token 配置\n * @returns TokenOperations 实例\n */\nexport function createTokenOperations(config: TokenConfig): TokenOperations {\n const { tokenRatio } = config\n return {\n estimateText: (text: string) => estimateTextTokens(text, tokenRatio),\n estimateMessages: (messages: ChatMessage[]) => estimateMessagesTokens(messages, tokenRatio),\n }\n}\n","/**\n * @h-ai/ai — 子功能组装工厂\n *\n * 将所有子功能的创建逻辑集中在此文件,main.ts 仅做生命周期管理和 API 编排。\n * @module ai-functions\n */\n\nimport type { DatapipeFunctions } from '@h-ai/datapipe'\n\nimport type { AIConfig } from './ai-config.js'\nimport type { AudioOperations } from './audio/ai-audio-types.js'\nimport type { CompressOperations } from './compress/ai-compress-types.js'\nimport type { ContextOperations } from './context/ai-context-types.js'\nimport type { EmbeddingOperations } from './embedding/ai-embedding-types.js'\nimport type { FileOperations } from './file/ai-file-types.js'\nimport type { KnowledgeOperations } from './knowledge/ai-knowledge-types.js'\nimport type { ChatMessage, ChatRecord, LLMOperations } from './llm/ai-llm-types.js'\nimport type { MCPOperations } from './mcp/ai-mcp-types.js'\nimport type { MemoryEntry, MemoryOperations } from './memory/ai-memory-types.js'\nimport type { PersonaOperations, PersonaProfile } from './persona/ai-persona-types.js'\nimport type { RagOperations } from './rag/ai-rag-types.js'\nimport type { ReasoningOperations } from './reasoning/ai-reasoning-types.js'\nimport type { RerankOperations } from './rerank/ai-rerank-types.js'\nimport type { RetrievalOperations, RetrievalSource } from './retrieval/ai-retrieval-types.js'\nimport type { AIStoreProvider, SessionInfo } from './store/ai-store-types.js'\nimport type { SummaryOperations, SummaryResult } from './summary/ai-summary-types.js'\nimport type { TokenOperations } from './token/ai-token-types.js'\n\nimport { core } from '@h-ai/core'\n\nimport { CompressConfigSchema, KnowledgeConfigSchema, MemoryConfigSchema, RetrievalConfigSchema, SummaryConfigSchema, TokenConfigSchema } from './ai-config.js'\nimport { createAudioOperations } from './audio/ai-audio-functions.js'\nimport { createCompressOperations } from './compress/ai-compress-functions.js'\nimport { createContextOperations } from './context/ai-context-functions.js'\nimport { createEmbeddingOperations } from './embedding/ai-embedding-functions.js'\nimport { createFileOperations } from './file/ai-file-functions.js'\nimport { createKnowledgeOperations } from './knowledge/ai-knowledge-functions.js'\nimport { createAILLMFunctions } from './llm/ai-llm-functions.js'\nimport { createAIMCPFunctions } from './mcp/ai-mcp-functions.js'\nimport { createMemoryOperations } from './memory/ai-memory-facade.js'\nimport { createMem0OssMemoryOperations } from './memory/providers/ai-memory-provider-mem0-oss.js'\nimport { createNativeMemoryOperations } from './memory/providers/ai-memory-provider-native.js'\nimport { createPersonaOperations } from './persona/ai-persona-functions.js'\nimport { createRagOperations } from './rag/ai-rag-functions.js'\nimport { createReasoningOperations } from './reasoning/ai-reasoning-functions.js'\nimport { createRerankOperations } from './rerank/ai-rerank-functions.js'\nimport { createRetrievalOperations } from './retrieval/ai-retrieval-functions.js'\nimport { createSummaryOperations } from './summary/ai-summary-functions.js'\nimport { createTokenOperations } from './token/ai-token-functions.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'functions' })\n\n/** 子功能组装依赖 */\nexport interface AISubsystemDeps {\n storeProvider: AIStoreProvider\n datapipe: DatapipeFunctions\n}\n\n/** 子功能组装结果 */\nexport interface AISubsystems {\n llm: LLMOperations\n mcp: MCPOperations\n embedding: EmbeddingOperations\n reasoning: ReasoningOperations\n rerank: RerankOperations\n retrieval: RetrievalOperations\n rag: RagOperations\n knowledge: KnowledgeOperations\n memory: MemoryOperations\n persona: PersonaOperations\n token: TokenOperations\n summary: SummaryOperations\n compress: CompressOperations\n context: ContextOperations\n file: FileOperations\n audio: AudioOperations\n}\n\n/**\n * 组装所有 AI 子功能实例\n *\n * 根据 parsed config 和外部依赖创建所有子功能操作接口。\n * 与 main.ts 解耦——main 仅负责生命周期,本函数负责创建逻辑。\n */\nexport async function createAISubsystems(config: AIConfig, deps: AISubsystemDeps): Promise<AISubsystems> {\n const { storeProvider, datapipe: datapipeDep } = deps\n\n // 记忆后端:mem0 OSS 自管理存储,无需 hai 的 memoryStore / memoryVectorStore\n const memoryParsed = MemoryConfigSchema.parse(config.memory ?? {})\n const useMem0Oss = memoryParsed.provider === 'mem0'\n\n // 通过 Provider 创建存储实例\n const chatRecordStore = storeProvider.createRelStore<ChatRecord>('hai_ai_chat_records', { hasObjectId: true, hasSessionId: true })\n const sessionStore = storeProvider.createRelStore<SessionInfo>('hai_ai_sessions', { hasObjectId: true })\n const sourceStore = storeProvider.createRelStore<RetrievalSource>('hai_ai_retrieval_sources')\n const memoryStore = useMem0Oss ? null : storeProvider.createRelStore<MemoryEntry>('hai_ai_memory', { hasObjectId: true, hasScopeIndex: true })\n const contextStore = storeProvider.createRelStore<{ messages: ChatMessage[], summaries: SummaryResult[], updatedAt: number }>('hai_ai_context', { hasObjectId: true, hasSessionId: true })\n const personaStore = storeProvider.createRelStore<PersonaProfile>('hai_ai_persona', { hasObjectId: true })\n\n // 向量存储\n const memoryVectorStore = useMem0Oss ? null : storeProvider.createVectorStore('hai_ai_memory_vectors')\n\n // 统一初始化(建表等)\n await storeProvider.initialize()\n\n const llmFunctions = createAILLMFunctions(config, { recordStore: chatRecordStore, sessionStore })\n const llm = llmFunctions.llm\n\n // MCP\n const mcp = createAIMCPFunctions({ config })\n\n // Embedding\n const embedding = createEmbeddingOperations(config)\n\n // Reasoning(依赖 LLM)\n const reasoning = createReasoningOperations(config, llm)\n\n // Rerank\n const rerank = createRerankOperations(config)\n\n const retrieval = createRetrievalOperations(embedding, storeProvider, sourceStore, rerank)\n\n // 预注册配置中的检索源(幂等写入,就算其他实例已有相同数据也安全)\n if (config.retrieval?.sources?.length) {\n const configSources = RetrievalConfigSchema.parse(config.retrieval).sources ?? []\n sourceStore\n .saveMany(configSources.map(s => ({ id: s.id, data: s })))\n .catch((e: unknown) => logger.warn('Failed to pre-register retrieval sources', { error: e }))\n }\n\n // RAG(依赖 LLM + Retrieval)\n const rag = createRagOperations(llm, retrieval)\n\n // Knowledge(依赖 KnowledgeStore + LLM + Embedding + datapipe)\n const knowledgeParsed = KnowledgeConfigSchema.parse(config.knowledge ?? {})\n const knowledgeStore = storeProvider.createKnowledgeStore?.()\n const knowledge = createKnowledgeOperations(knowledgeParsed, llm, embedding, datapipeDep, knowledgeStore)\n\n const memoryCore = memoryStore && memoryVectorStore\n ? createNativeMemoryOperations(memoryParsed, llm, embedding, memoryStore, memoryVectorStore)\n : await createMem0OssMemoryOperations({\n config: memoryParsed,\n aiConfig: config,\n llm,\n collectionName: 'hai_ai_memory',\n embeddingDims: config.embedding?.dimensions,\n vectorBackend: storeProvider.getVectorBackend?.(),\n })\n // 封装出对外的公共记忆接口(作用域绑定 scoped + 管理接口 admin + clear 空过滤保护)\n const memory: MemoryOperations = createMemoryOperations(memoryCore)\n\n // Token / Summary / Compress\n const tokenParsed = TokenConfigSchema.parse(config.token ?? {})\n const summaryParsed = SummaryConfigSchema.parse(config.summary ?? {})\n const compressParsed = CompressConfigSchema.parse(config.compress ?? {})\n\n const token = createTokenOperations(tokenParsed)\n const summary = createSummaryOperations(config.llm, llm, token, summaryParsed)\n const compress = createCompressOperations(compressParsed, token, summary, config.llm.maxTokens ?? 4096)\n\n const context = createContextOperations(compressParsed, token, compress, contextStore, sessionStore, {\n llm,\n memory: memory ?? undefined,\n rag: rag ?? undefined,\n reasoning: reasoning ?? undefined,\n summary,\n })\n\n // Persona(全局共享的 AI 角色档案)\n const persona = createPersonaOperations(personaStore)\n\n // File(依赖 LLM)\n const file = createFileOperations(config, llm)\n\n // Audio(语音识别 / 语音合成,独立平台 Provider)\n const audio = createAudioOperations(config)\n\n return { llm, mcp, embedding, reasoning, rerank, retrieval, rag, knowledge, memory, persona, token, summary, compress, context, file, audio }\n}\n","/**\n * @h-ai/ai — 默认 DB 存储 Provider(reldb + vecdb)\n *\n * 基于 @h-ai/reldb 和 @h-ai/vecdb 的 AIStoreProvider 默认实现。\n * AI 默认初始化路径直接使用该实现,因此 @h-ai/reldb 与 @h-ai/vecdb 是运行时依赖。\n * @module ai-store-provider-db\n */\n\nimport type { DbType, DmlOperations, ReldbJsonOps } from '@h-ai/reldb'\nimport type { VecdbFunctions } from '@h-ai/vecdb'\nimport type { AIRelStore, AIRelStoreOptions, AIStoreProvider, AIVectorBackend, AIVectorStore, KnowledgeStore, StoreFilter, StorePage, StoreScope, WhereClause, WhereOperator } from '../ai-store-types.js'\n\nimport { core } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { vecdb } from '@h-ai/vecdb'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'store-provider-db' })\n\n/** 单条批量 SQL 的参数上限,保守低于 SQLite 默认 999 变量限制。 */\nconst MAX_BATCH_SQL_PARAMS = 900\n\n// ─── ReldbAIRelStore 实现 ───\n\n/**\n * 基于 reldb 的持久化 AIRelStore 实现\n *\n * 将记录以 JSON 格式存储在 reldb 表中,支持 SQLite / PostgreSQL / MySQL。\n * 表结构:id PK, object_id?, session_id?, status?, ref_id?, data JSON, created_at, updated_at\n */\nclass ReldbAIRelStore<T> implements AIRelStore<T> {\n private readonly sql: DmlOperations\n private readonly table: string\n private readonly jsonOps: ReldbJsonOps\n private readonly dbType: DbType\n private readonly hasObjectId: boolean\n private readonly hasSessionId: boolean\n private readonly hasStatus: boolean\n private readonly hasRefId: boolean\n private readonly hasScopeIndex: boolean\n\n constructor(sql: DmlOperations, table: string, jsonOps: ReldbJsonOps, dbType: DbType, options?: AIRelStoreOptions) {\n this.sql = sql\n this.table = table\n this.jsonOps = jsonOps\n this.dbType = dbType\n this.hasObjectId = options?.hasObjectId ?? false\n this.hasSessionId = options?.hasSessionId ?? false\n this.hasStatus = options?.hasStatus ?? false\n this.hasRefId = options?.hasRefId ?? false\n this.hasScopeIndex = options?.hasScopeIndex ?? false\n }\n\n /** 创建表及索引(幂等) */\n async createTable(): Promise<void> {\n const t = this.table\n const db = this.dbType\n const idType = db === 'mysql' ? 'VARCHAR(512)' : 'TEXT'\n const scopeType = db === 'mysql' ? 'VARCHAR(255)' : 'TEXT'\n const dataType = db === 'postgresql' ? 'JSONB' : db === 'mysql' ? 'JSON' : 'TEXT'\n\n const cols: string[] = [`id ${idType} PRIMARY KEY`]\n if (this.hasObjectId)\n cols.push(`object_id ${scopeType}`)\n if (this.hasSessionId)\n cols.push(`session_id ${scopeType}`)\n if (this.hasStatus)\n cols.push(`status ${scopeType}`)\n if (this.hasRefId)\n cols.push(`ref_id ${scopeType}`)\n cols.push(`data ${dataType} NOT NULL`, `created_at BIGINT NOT NULL`, `updated_at BIGINT NOT NULL`)\n\n await this.sql.execute(`CREATE TABLE IF NOT EXISTS ${t} (${cols.join(', ')})`)\n\n if (this.hasObjectId)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_object_id ON ${t}(object_id)`)\n if (this.hasSessionId)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_session_id ON ${t}(session_id)`)\n if (this.hasObjectId && this.hasSessionId)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_object_session ON ${t}(object_id, session_id)`)\n if (this.hasStatus)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_status ON ${t}(status)`)\n if (this.hasRefId)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_ref_id ON ${t}(ref_id)`)\n // 业务作用域索引:仅 PostgreSQL 支持 JSONB GIN,用于加速 data @> '{\"scope\":...}' 包含查询。\n if (this.hasScopeIndex && db === 'postgresql')\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_data_gin ON ${t} USING GIN (data jsonb_path_ops)`)\n }\n\n async save(id: string, data: T, scope?: StoreScope): Promise<void> {\n const now = Date.now()\n const json = JSON.stringify(data)\n\n const colNames = ['id']\n const values: unknown[] = [id]\n const placeholders: string[] = ['?']\n\n if (this.hasObjectId) {\n colNames.push('object_id')\n values.push(scope?.objectId ?? null)\n placeholders.push('?')\n }\n if (this.hasSessionId) {\n colNames.push('session_id')\n values.push(scope?.sessionId ?? null)\n placeholders.push('?')\n }\n if (this.hasStatus) {\n colNames.push('status')\n values.push(scope?.status ?? null)\n placeholders.push('?')\n }\n if (this.hasRefId) {\n colNames.push('ref_id')\n values.push(scope?.refId ?? null)\n placeholders.push('?')\n }\n\n colNames.push('data', 'created_at', 'updated_at')\n values.push(json, now, now)\n placeholders.push('?', '?', '?')\n\n if (this.dbType === 'mysql') {\n const updateParts: string[] = ['data = VALUES(data)', 'updated_at = VALUES(updated_at)']\n if (this.hasObjectId)\n updateParts.push('object_id = VALUES(object_id)')\n if (this.hasSessionId)\n updateParts.push('session_id = VALUES(session_id)')\n if (this.hasStatus)\n updateParts.push('status = VALUES(status)')\n if (this.hasRefId)\n updateParts.push('ref_id = VALUES(ref_id)')\n await this.sql.execute(\n `INSERT INTO ${this.table} (${colNames.join(', ')}) VALUES (${placeholders.join(', ')}) ON DUPLICATE KEY UPDATE ${updateParts.join(', ')}`,\n values,\n )\n }\n else {\n const updateParts: string[] = ['data = excluded.data', 'updated_at = excluded.updated_at']\n if (this.hasObjectId)\n updateParts.push('object_id = excluded.object_id')\n if (this.hasSessionId)\n updateParts.push('session_id = excluded.session_id')\n if (this.hasStatus)\n updateParts.push('status = excluded.status')\n if (this.hasRefId)\n updateParts.push('ref_id = excluded.ref_id')\n await this.sql.execute(\n `INSERT INTO ${this.table} (${colNames.join(', ')}) VALUES (${placeholders.join(', ')}) ON CONFLICT(id) DO UPDATE SET ${updateParts.join(', ')}`,\n values,\n )\n }\n }\n\n async saveMany(items: Array<{ id: string, data: T, scope?: StoreScope }>): Promise<void> {\n if (items.length === 0)\n return\n\n const colNames = this.buildSaveColumnNames()\n const rowsPerBatch = Math.max(1, Math.floor(MAX_BATCH_SQL_PARAMS / colNames.length))\n\n // 大批量入库时使用多行 INSERT,减少 SQL 往返;按参数数分批避免 SQLite / MySQL 参数上限。\n for (let start = 0; start < items.length; start += rowsPerBatch) {\n // 每批都是参数化批量 SQL;顺序执行避免同一连接上并发写入争抢。\n await this.saveManyBatch(items.slice(start, start + rowsPerBatch), colNames)\n }\n }\n\n async get(id: string): Promise<T | undefined> {\n const result = await this.sql.get<{ data: string }>(`SELECT data FROM ${this.table} WHERE id = ?`, [id])\n if (!result.success || !result.data)\n return undefined\n return JSON.parse(result.data.data) as T\n }\n\n async query(filter: StoreFilter<T>): Promise<T[]> {\n const { sql, params } = this.buildQuery(filter)\n const result = await this.sql.query<{ data: string }>(sql, params)\n if (!result.success)\n return []\n return result.data.map(row => JSON.parse(row.data) as T)\n }\n\n async queryPage(filter: StoreFilter<T>, page: { offset: number, limit: number }): Promise<StorePage<T>> {\n const countParams: unknown[] = []\n const countConditions = this.buildAllConditions(filter, countParams)\n let countSql = `SELECT COUNT(*) as cnt FROM ${this.table}`\n if (countConditions.length > 0)\n countSql += ` WHERE ${countConditions.join(' AND ')}`\n const countResult = await this.sql.get<{ cnt: number }>(countSql, countParams)\n const total = countResult.success && countResult.data != null ? countResult.data.cnt : 0\n\n const { sql, params } = this.buildQuery({ ...filter, limit: undefined })\n const pagedSql = `${sql} LIMIT ? OFFSET ?`\n const result = await this.sql.query<{ data: string }>(pagedSql, [...params, page.limit, page.offset])\n const items = result.success ? result.data.map(row => JSON.parse(row.data) as T) : []\n\n return { items, total }\n }\n\n async remove(id: string): Promise<boolean> {\n await this.sql.execute(`DELETE FROM ${this.table} WHERE id = ?`, [id])\n return true\n }\n\n async removeBy(filter: StoreFilter<T>): Promise<number> {\n const params: unknown[] = []\n const conditions = this.buildAllConditions(filter, params)\n\n let countSql = `SELECT COUNT(*) as cnt FROM ${this.table}`\n if (conditions.length > 0) {\n const whereClause = ` WHERE ${conditions.join(' AND ')}`\n countSql += whereClause\n const countResult = await this.sql.get<{ cnt: number }>(countSql, [...params])\n const count = countResult.success && countResult.data != null ? countResult.data.cnt : 0\n await this.sql.execute(`DELETE FROM ${this.table}${whereClause}`, params)\n return count\n }\n\n const countResult = await this.sql.get<{ cnt: number }>(countSql)\n const count = countResult.success && countResult.data != null ? countResult.data.cnt : 0\n await this.sql.execute(`DELETE FROM ${this.table}`)\n return count\n }\n\n async count(filter?: StoreFilter<T>): Promise<number> {\n if (!filter?.where && !filter?.objectId && !filter?.sessionId && !filter?.status && !filter?.refId) {\n const result = await this.sql.get<{ cnt: number }>(`SELECT COUNT(*) as cnt FROM ${this.table}`)\n return result.success && result.data != null ? result.data.cnt : 0\n }\n const params: unknown[] = []\n const conditions = this.buildAllConditions(filter!, params)\n let sql = `SELECT COUNT(*) as cnt FROM ${this.table}`\n if (conditions.length > 0)\n sql += ` WHERE ${conditions.join(' AND ')}`\n const result = await this.sql.get<{ cnt: number }>(sql, params)\n return result.success && result.data != null ? result.data.cnt : 0\n }\n\n async clear(filter?: StoreFilter<T>): Promise<void> {\n if (!filter?.where && !filter?.objectId && !filter?.sessionId && !filter?.status && !filter?.refId) {\n await this.sql.execute(`DELETE FROM ${this.table}`)\n return\n }\n await this.removeBy(filter!)\n }\n\n /** 构造 save/saveMany 共用的列名,确保批量写入与单条写入索引列一致。 */\n private buildSaveColumnNames(): string[] {\n const colNames = ['id']\n if (this.hasObjectId)\n colNames.push('object_id')\n if (this.hasSessionId)\n colNames.push('session_id')\n if (this.hasStatus)\n colNames.push('status')\n if (this.hasRefId)\n colNames.push('ref_id')\n colNames.push('data', 'created_at', 'updated_at')\n return colNames\n }\n\n /** 构造单行 upsert 参数;动态值全部通过 params 传入,SQL 中不拼接用户输入。 */\n private buildSaveValues(id: string, data: T, scope: StoreScope | undefined, now: number): unknown[] {\n const values: unknown[] = [id]\n if (this.hasObjectId)\n values.push(scope?.objectId ?? null)\n if (this.hasSessionId)\n values.push(scope?.sessionId ?? null)\n if (this.hasStatus)\n values.push(scope?.status ?? null)\n if (this.hasRefId)\n values.push(scope?.refId ?? null)\n values.push(JSON.stringify(data), now, now)\n return values\n }\n\n /** 构造跨数据库 upsert 更新片段;列名来自内部白名单,不接受外部输入。 */\n private buildSaveUpdateParts(): string[] {\n const valueRef = (column: string) => this.dbType === 'mysql' ? `VALUES(${column})` : `excluded.${column}`\n const updateParts: string[] = [`data = ${valueRef('data')}`, `updated_at = ${valueRef('updated_at')}`]\n if (this.hasObjectId)\n updateParts.push(`object_id = ${valueRef('object_id')}`)\n if (this.hasSessionId)\n updateParts.push(`session_id = ${valueRef('session_id')}`)\n if (this.hasStatus)\n updateParts.push(`status = ${valueRef('status')}`)\n if (this.hasRefId)\n updateParts.push(`ref_id = ${valueRef('ref_id')}`)\n return updateParts\n }\n\n /** 执行一批参数化 upsert;调用方已按数据库参数上限切好 batch。 */\n private async saveManyBatch(items: Array<{ id: string, data: T, scope?: StoreScope }>, colNames: string[]): Promise<void> {\n const now = Date.now()\n const values: unknown[] = []\n const placeholders = items.map(({ id, data, scope }) => {\n const rowValues = this.buildSaveValues(id, data, scope, now)\n values.push(...rowValues)\n return `(${rowValues.map(() => '?').join(', ')})`\n })\n\n const updateParts = this.buildSaveUpdateParts()\n const conflictSql = this.dbType === 'mysql'\n ? `ON DUPLICATE KEY UPDATE ${updateParts.join(', ')}`\n : `ON CONFLICT(id) DO UPDATE SET ${updateParts.join(', ')}`\n\n await this.sql.execute(\n `INSERT INTO ${this.table} (${colNames.join(', ')}) VALUES ${placeholders.join(', ')} ${conflictSql}`,\n values,\n )\n }\n\n private buildQuery(filter: StoreFilter<T>): { sql: string, params: unknown[] } {\n let sql = `SELECT data FROM ${this.table}`\n const params: unknown[] = []\n const conditions = this.buildAllConditions(filter, params)\n if (conditions.length > 0)\n sql += ` WHERE ${conditions.join(' AND ')}`\n\n if (filter.orderBy) {\n const dir = filter.orderBy.direction === 'asc' ? 'ASC' : 'DESC'\n const field = String(filter.orderBy.field)\n if (field === 'createdAt') {\n sql += ` ORDER BY created_at ${dir}`\n }\n else if (field === 'updatedAt') {\n sql += ` ORDER BY updated_at ${dir}`\n }\n else {\n const { sql: jsonSql, params: jsonParams } = this.jsonOps.extract('data', `$.${field}`)\n params.push(...jsonParams)\n sql += ` ORDER BY ${jsonSql} ${dir}`\n }\n }\n else {\n sql += ` ORDER BY created_at DESC`\n }\n\n if (filter.limit) {\n sql += ` LIMIT ?`\n params.push(filter.limit)\n }\n return { sql, params }\n }\n\n private buildAllConditions(filter: StoreFilter<T>, params: unknown[]): string[] {\n const conditions: string[] = []\n if (filter.objectId && this.hasObjectId) {\n conditions.push('object_id = ?')\n params.push(filter.objectId)\n }\n if (filter.sessionId && this.hasSessionId) {\n conditions.push('session_id = ?')\n params.push(filter.sessionId)\n }\n if (filter.status && this.hasStatus) {\n if (Array.isArray(filter.status)) {\n conditions.push(`status IN (${filter.status.map(() => '?').join(', ')})`)\n params.push(...filter.status)\n }\n else {\n conditions.push('status = ?')\n params.push(filter.status)\n }\n }\n if (filter.refId && this.hasRefId) {\n conditions.push('ref_id = ?')\n params.push(filter.refId)\n }\n // 业务作用域下推:仅 PostgreSQL 用 JSONB 包含查询(可命中 GIN 索引)。\n // 其它后端为 no-op —— 结果不受影响,由调用方在内存中完成 scope 匹配。\n if (filter.scope && Object.keys(filter.scope).length > 0 && this.dbType === 'postgresql') {\n conditions.push('data @> ?::jsonb')\n params.push(JSON.stringify({ scope: filter.scope }))\n }\n if (filter.where)\n conditions.push(...this.buildWhereConditions(filter.where, params))\n return conditions\n }\n\n private buildWhereConditions(where: WhereClause<T>, params: unknown[]): string[] {\n const conditions: string[] = []\n for (const key of Object.keys(where)) {\n const value = (where as Record<string, unknown>)[key]\n const path = `$.${key}`\n if (this.isWhereOperator(value)) {\n const op = value as WhereOperator<unknown>\n if (op.$in !== undefined && Array.isArray(op.$in)) {\n const { sql: jsonSql, params: jsonParams } = this.jsonOps.extract('data', path)\n params.push(...jsonParams)\n conditions.push(`${jsonSql} IN (${op.$in.map(() => '?').join(', ')})`)\n params.push(...op.$in)\n }\n if (op.$gte !== undefined) {\n const { sql: j, params: p } = this.jsonOps.extract('data', path)\n params.push(...p)\n conditions.push(`${j} >= ?`)\n params.push(op.$gte)\n }\n if (op.$gt !== undefined) {\n const { sql: j, params: p } = this.jsonOps.extract('data', path)\n params.push(...p)\n conditions.push(`${j} > ?`)\n params.push(op.$gt)\n }\n if (op.$lte !== undefined) {\n const { sql: j, params: p } = this.jsonOps.extract('data', path)\n params.push(...p)\n conditions.push(`${j} <= ?`)\n params.push(op.$lte)\n }\n if (op.$lt !== undefined) {\n const { sql: j, params: p } = this.jsonOps.extract('data', path)\n params.push(...p)\n conditions.push(`${j} < ?`)\n params.push(op.$lt)\n }\n }\n else {\n const { sql: jsonSql, params: jsonParams } = this.jsonOps.extract('data', path)\n params.push(...jsonParams)\n conditions.push(`${jsonSql} = ?`)\n params.push(value)\n }\n }\n return conditions\n }\n\n private isWhereOperator<V>(value: unknown): value is WhereOperator<V> {\n if (typeof value !== 'object' || value === null || Array.isArray(value))\n return false\n const keys = Object.keys(value)\n return keys.length > 0 && keys.every(k => ['$in', '$gte', '$gt', '$lte', '$lt'].includes(k))\n }\n}\n\n// ─── VecdbAIVectorStore 实现 ───\n\n/**\n * 基于 vecdb 的持久化向量存储实现\n *\n * 使用 vecdb.vector / vecdb.collection 子对象操作向量数据。\n * 集合在首次 upsert 时按需创建(lazy),clear 时 drop 集合。\n */\nclass VecdbAIVectorStore implements AIVectorStore {\n private readonly vecdb: VecdbFunctions\n private readonly collection: string\n private collectionDimension: number | null = null\n\n constructor(vecdb: VecdbFunctions, collection: string) {\n this.vecdb = vecdb\n this.collection = collection\n }\n\n private async ensureCollection(dimension: number): Promise<void> {\n if (this.collectionDimension === dimension)\n return\n const exists = await this.vecdb.collection.exists(this.collection)\n if (exists.success && !exists.data)\n await this.vecdb.collection.create(this.collection, { dimension })\n this.collectionDimension = dimension\n }\n\n async upsert(id: string, vector: number[], metadata?: Record<string, unknown>): Promise<void> {\n await this.ensureCollection(vector.length)\n await this.vecdb.vector.upsert(this.collection, [{ id, vector, metadata }])\n }\n\n async search(vector: number[], options?: { topK?: number, minScore?: number, filter?: Record<string, unknown> }): Promise<Array<{ id: string, score: number, content?: string, metadata?: Record<string, unknown> }>> {\n const result = await this.vecdb.vector.search(this.collection, vector, options)\n return result.success ? result.data : []\n }\n\n async remove(id: string): Promise<void> {\n await this.vecdb.vector.delete(this.collection, [id])\n }\n\n async clear(_filter?: Record<string, unknown>): Promise<void> {\n const exists = await this.vecdb.collection.exists(this.collection)\n if (exists.success && exists.data) {\n await this.vecdb.collection.drop(this.collection)\n this.collectionDimension = null\n }\n }\n}\n\n// ─── DB KnowledgeStore 实现 ───\n\n/** 根据数据库类型生成 DDL 语句 */\nfunction buildKnowledgeSchemaStatements(dbType: DbType): string[] {\n const pk = dbType === 'mysql' ? 'VARCHAR(512)' : 'TEXT'\n const textCol = dbType === 'mysql' ? 'VARCHAR(255)' : 'TEXT'\n const longText = 'TEXT'\n\n return [\n `CREATE TABLE IF NOT EXISTS hai_ai_knowledge_entity (\n id ${pk} PRIMARY KEY,\n name ${textCol} NOT NULL,\n type ${textCol} NOT NULL,\n collection ${textCol} NOT NULL,\n aliases ${longText},\n description ${longText},\n created_at BIGINT DEFAULT 0,\n updated_at BIGINT DEFAULT 0\n)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_entity_name ON hai_ai_knowledge_entity(name)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_entity_type ON hai_ai_knowledge_entity(type)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_entity_collection ON hai_ai_knowledge_entity(collection)`,\n `CREATE TABLE IF NOT EXISTS hai_ai_knowledge_entity_document (\n entity_id ${pk} NOT NULL,\n document_id ${pk} NOT NULL,\n chunk_id ${pk} DEFAULT '',\n collection ${textCol} NOT NULL,\n relevance REAL DEFAULT 1.0,\n context ${longText},\n created_at BIGINT DEFAULT 0,\n PRIMARY KEY (entity_id, document_id, chunk_id)\n)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_ed_document ON hai_ai_knowledge_entity_document(document_id)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_ed_collection ON hai_ai_knowledge_entity_document(collection)`,\n `CREATE TABLE IF NOT EXISTS hai_ai_knowledge_document (\n document_id ${pk} NOT NULL,\n collection ${textCol} NOT NULL,\n title ${longText},\n url ${longText},\n chunk_count INTEGER DEFAULT 0,\n created_at BIGINT DEFAULT 0,\n PRIMARY KEY (document_id, collection)\n)`,\n `CREATE TABLE IF NOT EXISTS hai_ai_knowledge_collections (\n collection ${textCol} PRIMARY KEY,\n dimension INTEGER NOT NULL,\n created_at BIGINT NOT NULL\n)`,\n ]\n}\n\n/**\n * 基于 reldb + vecdb 的 KnowledgeStore 实现\n *\n * reldb 用于实体/文档/关联的归一化存储,vecdb 用于向量存储。\n * 表结构由 buildKnowledgeSchemaStatements() 生成。\n */\nclass DbKnowledgeStore implements KnowledgeStore {\n private readonly sql: DmlOperations\n private readonly dbType: DbType\n private readonly vecdb: VecdbFunctions\n\n constructor(sql: DmlOperations, dbType: DbType, vecdb: VecdbFunctions) {\n this.sql = sql\n this.dbType = dbType\n this.vecdb = vecdb\n }\n\n async initialize(collection: string, dimension: number): Promise<void> {\n // 创建 vecdb 集合\n const exists = await this.vecdb.collection.exists(collection)\n if (exists.success && !exists.data)\n await this.vecdb.collection.create(collection, { dimension })\n\n // 创建 reldb 表\n const statements = buildKnowledgeSchemaStatements(this.dbType)\n for (const stmt of statements) {\n const result = await this.sql.execute(stmt)\n if (!result.success) {\n logger.error('Knowledge schema creation failed', { sql: stmt.trim().slice(0, 60), error: result.error })\n throw new Error(`Knowledge schema creation failed: ${String(result.error)}`)\n }\n }\n }\n\n async upsertEntity(entity: { id: string, name: string, type: string, collection: string, aliases?: string[], description?: string }): Promise<void> {\n const now = Date.now()\n const params = [entity.id, entity.name, entity.type, entity.collection, entity.aliases ? JSON.stringify(entity.aliases) : null, entity.description ?? null, now, now]\n const stmt = this.dbType === 'mysql'\n ? `INSERT INTO hai_ai_knowledge_entity (id, name, type, collection, aliases, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name), type = VALUES(type), collection = VALUES(collection), aliases = VALUES(aliases), description = VALUES(description), updated_at = VALUES(updated_at)`\n : `INSERT INTO hai_ai_knowledge_entity (id, name, type, collection, aliases, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET name = excluded.name, type = excluded.type, collection = excluded.collection, aliases = excluded.aliases, description = excluded.description, updated_at = excluded.updated_at`\n const result = await this.sql.execute(stmt, params)\n if (!result.success)\n throw new Error(`upsertEntity failed: ${String(result.error)}`)\n }\n\n async findEntitiesByName(keyword: string, collection?: string): Promise<Array<{ id: string, name: string, type: string, aliases: string[] }>> {\n const pattern = `%${keyword}%`\n let stmt = `SELECT id, name, type, aliases FROM hai_ai_knowledge_entity WHERE (name LIKE ? OR aliases LIKE ?)`\n const params: unknown[] = [pattern, pattern]\n if (collection) {\n stmt += ' AND collection = ?'\n params.push(collection)\n }\n const result = await this.sql.query<Record<string, unknown>>(stmt, params)\n if (!result.success)\n return []\n return result.data.map(row => ({\n id: row.id as string,\n name: row.name as string,\n type: row.type as string,\n aliases: row.aliases ? JSON.parse(row.aliases as string) as string[] : [],\n }))\n }\n\n async listEntities(options?: { collection?: string, type?: string, keyword?: string, limit?: number }): Promise<Array<{ id: string, name: string, type: string, aliases: string[], description: string | null, createdAt: string | null, updatedAt: string | null }>> {\n let stmt = 'SELECT id, name, type, aliases, description, created_at, updated_at FROM hai_ai_knowledge_entity WHERE 1=1'\n const params: unknown[] = []\n if (options?.collection) {\n stmt += ' AND collection = ?'\n params.push(options.collection)\n }\n if (options?.type) {\n stmt += ' AND type = ?'\n params.push(options.type)\n }\n if (options?.keyword) {\n stmt += ' AND (name LIKE ? OR aliases LIKE ?)'\n const p = `%${options.keyword}%`\n params.push(p, p)\n }\n stmt += ' ORDER BY name'\n if (options?.limit) {\n stmt += ' LIMIT ?'\n params.push(options.limit)\n }\n const result = await this.sql.query<Record<string, unknown>>(stmt, params)\n if (!result.success)\n return []\n return result.data.map(row => ({\n id: row.id as string,\n name: row.name as string,\n type: row.type as string,\n aliases: row.aliases ? JSON.parse(row.aliases as string) as string[] : [],\n description: row.description as string | null,\n createdAt: row.created_at as string | null,\n updatedAt: row.updated_at as string | null,\n }))\n }\n\n async deleteEntities(entityIds: string[]): Promise<void> {\n if (entityIds.length === 0)\n return\n const placeholders = entityIds.map(() => '?').join(', ')\n await this.sql.execute(\n `DELETE FROM hai_ai_knowledge_entity WHERE id IN (${placeholders})`,\n entityIds,\n )\n }\n\n async insertEntityDocument(relation: { entityId: string, documentId: string, chunkId?: string, collection: string, relevance?: number, context?: string }): Promise<void> {\n const now = Date.now()\n const params = [relation.entityId, relation.documentId, relation.chunkId ?? '', relation.collection, relation.relevance ?? 1.0, relation.context ?? null, now]\n const stmt = this.dbType === 'mysql'\n ? `INSERT INTO hai_ai_knowledge_entity_document (entity_id, document_id, chunk_id, collection, relevance, context, created_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE relevance = VALUES(relevance), context = VALUES(context)`\n : `INSERT INTO hai_ai_knowledge_entity_document (entity_id, document_id, chunk_id, collection, relevance, context, created_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT(entity_id, document_id, chunk_id) DO UPDATE SET relevance = excluded.relevance, context = excluded.context`\n const result = await this.sql.execute(stmt, params)\n if (!result.success)\n throw new Error(`insertEntityDocument failed: ${String(result.error)}`)\n }\n\n async findDocumentsByEntityIds(entityIds: string[], collection?: string): Promise<Array<{ entityId: string, documentId: string, chunkId: string, collection: string, relevance: number, context: string | null }>> {\n if (entityIds.length === 0)\n return []\n const placeholders = entityIds.map(() => '?').join(', ')\n let stmt = `SELECT entity_id, document_id, chunk_id, collection, relevance, context FROM hai_ai_knowledge_entity_document WHERE entity_id IN (${placeholders})`\n const params: unknown[] = [...entityIds]\n if (collection) {\n stmt += ' AND collection = ?'\n params.push(collection)\n }\n const result = await this.sql.query<Record<string, unknown>>(stmt, params)\n if (!result.success)\n return []\n return result.data.map(row => ({\n entityId: row.entity_id as string,\n documentId: row.document_id as string,\n chunkId: row.chunk_id as string,\n collection: row.collection as string,\n relevance: row.relevance as number,\n context: row.context as string | null,\n }))\n }\n\n async findByEntityName(entityName: string, options?: { collection?: string, type?: string }): Promise<Array<{ entity: { id: string, name: string, type: string, aliases: string[], description: string | null }, documents: Array<{ documentId: string, chunkId: string, collection: string, relevance: number, context: string | null }> }>> {\n const entities = await this.findEntitiesByName(entityName, options?.collection)\n let filtered = entities\n if (options?.type)\n filtered = filtered.filter(e => e.type === options.type)\n if (filtered.length === 0)\n return []\n\n const entityIds = filtered.map(e => e.id)\n const docs = await this.findDocumentsByEntityIds(entityIds, options?.collection)\n\n const docsByEntity = new Map<string, Array<{ documentId: string, chunkId: string, collection: string, relevance: number, context: string | null }>>()\n for (const doc of docs) {\n const list = docsByEntity.get(doc.entityId) ?? []\n const { entityId: _entityId, ...rest } = doc\n list.push(rest)\n docsByEntity.set(doc.entityId, list)\n }\n\n return filtered.map(entity => ({\n entity: { ...entity, description: null as string | null },\n documents: docsByEntity.get(entity.id) ?? [],\n }))\n }\n\n async deleteDocumentEntities(documentId: string, collection: string): Promise<void> {\n // 必须在 removeDocumentEntityRelations 之前调用,子查询依赖关联行尚未删除\n await this.sql.execute(\n 'DELETE FROM hai_ai_knowledge_entity WHERE collection = ? AND id IN (SELECT DISTINCT entity_id FROM hai_ai_knowledge_entity_document WHERE document_id = ? AND collection = ?)',\n [collection, documentId, collection],\n )\n }\n\n async removeDocumentEntityRelations(documentId: string, collection: string): Promise<void> {\n await this.sql.execute(\n 'DELETE FROM hai_ai_knowledge_entity_document WHERE document_id = ? AND collection = ?',\n [documentId, collection],\n )\n }\n\n async upsertDocument(doc: { documentId: string, collection: string, title?: string, url?: string, chunkCount: number, createdAt: number }): Promise<void> {\n const params = [doc.documentId, doc.collection, doc.title ?? null, doc.url ?? null, doc.chunkCount, doc.createdAt]\n const stmt = this.dbType === 'mysql'\n ? `INSERT INTO hai_ai_knowledge_document (document_id, collection, title, url, chunk_count, created_at) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE title = VALUES(title), url = VALUES(url), chunk_count = VALUES(chunk_count)`\n : `INSERT INTO hai_ai_knowledge_document (document_id, collection, title, url, chunk_count, created_at) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT(document_id, collection) DO UPDATE SET title = excluded.title, url = excluded.url, chunk_count = excluded.chunk_count`\n await this.sql.execute(stmt, params)\n }\n\n async getDocument(documentId: string, collection: string): Promise<{ documentId: string, collection: string, title: string | null, url: string | null, chunkCount: number, createdAt: number } | undefined> {\n const result = await this.sql.query<Record<string, unknown>>(\n 'SELECT document_id, collection, title, url, chunk_count, created_at FROM hai_ai_knowledge_document WHERE document_id = ? AND collection = ?',\n [documentId, collection],\n )\n if (!result.success || result.data.length === 0)\n return undefined\n const row = result.data[0]\n return {\n documentId: row.document_id as string,\n collection: row.collection as string,\n title: row.title as string | null,\n url: row.url as string | null,\n chunkCount: row.chunk_count as number,\n createdAt: row.created_at as number,\n }\n }\n\n async listDocuments(collection: string, options?: { offset?: number, limit?: number }): Promise<Array<{ documentId: string, collection: string, title: string | null, url: string | null, chunkCount: number, createdAt: number }>> {\n let stmt = 'SELECT document_id, collection, title, url, chunk_count, created_at FROM hai_ai_knowledge_document WHERE collection = ?'\n const params: unknown[] = [collection]\n stmt += ' ORDER BY created_at DESC'\n if (options?.limit) {\n stmt += ' LIMIT ?'\n params.push(options.limit)\n }\n if (options?.offset) {\n stmt += ' OFFSET ?'\n params.push(options.offset)\n }\n const result = await this.sql.query<Record<string, unknown>>(stmt, params)\n if (!result.success)\n return []\n return result.data.map(row => ({\n documentId: row.document_id as string,\n collection: row.collection as string,\n title: row.title as string | null,\n url: row.url as string | null,\n chunkCount: row.chunk_count as number,\n createdAt: row.created_at as number,\n }))\n }\n\n async listDocumentEntityCounts(documentIds: string[], collection: string): Promise<Map<string, number>> {\n if (documentIds.length === 0)\n return new Map()\n const placeholders = documentIds.map(() => '?').join(', ')\n const result = await this.sql.query<Record<string, unknown>>(\n `SELECT document_id, COUNT(DISTINCT entity_id) as cnt FROM hai_ai_knowledge_entity_document WHERE document_id IN (${placeholders}) AND collection = ? GROUP BY document_id`,\n [...documentIds, collection],\n )\n const map = new Map<string, number>()\n if (result.success) {\n for (const row of result.data) map.set(row.document_id as string, row.cnt as number)\n }\n return map\n }\n\n async removeDocument(documentId: string, collection: string): Promise<void> {\n await this.sql.execute('DELETE FROM hai_ai_knowledge_document WHERE document_id = ? AND collection = ?', [documentId, collection])\n }\n\n async upsertVectors(collection: string, vectors: Array<{ id: string, vector: number[], content?: string, metadata?: Record<string, unknown> }>): Promise<void> {\n // 确保集合存在\n if (vectors.length > 0) {\n const exists = await this.vecdb.collection.exists(collection)\n if (exists.success && !exists.data)\n await this.vecdb.collection.create(collection, { dimension: vectors[0].vector.length })\n }\n await this.vecdb.vector.upsert(collection, vectors)\n }\n\n async searchVectors(collection: string, vector: number[], options?: { topK?: number, minScore?: number, filter?: Record<string, unknown> }): Promise<Array<{ id: string, score: number, content?: string, metadata?: Record<string, unknown> }>> {\n const result = await this.vecdb.vector.search(collection, vector, options)\n return result.success ? result.data : []\n }\n\n async removeVectors(collection: string, ids: string[]): Promise<void> {\n await this.vecdb.vector.delete(collection, ids)\n }\n\n async ensureCollection(collection: string, dimension: number): Promise<void> {\n const exists = await this.vecdb.collection.exists(collection)\n if (exists.success && !exists.data)\n await this.vecdb.collection.create(collection, { dimension })\n }\n\n async registerCollection(collection: string, dimension: number): Promise<void> {\n const now = Date.now()\n const stmt = this.dbType === 'mysql'\n ? `INSERT INTO hai_ai_knowledge_collections (collection, dimension, created_at) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE dimension = VALUES(dimension)`\n : `INSERT INTO hai_ai_knowledge_collections (collection, dimension, created_at) VALUES (?, ?, ?) ON CONFLICT(collection) DO UPDATE SET dimension = excluded.dimension`\n const result = await this.sql.execute(stmt, [collection, dimension, now])\n if (!result.success)\n throw new Error(`registerCollection failed: ${String(result.error)}`)\n }\n\n async collectionExists(collection: string): Promise<boolean> {\n const result = await this.sql.get<{ cnt: number }>(\n `SELECT 1 as cnt FROM hai_ai_knowledge_collections WHERE collection = ?`,\n [collection],\n )\n return result.success && result.data != null\n }\n\n async deleteCollection(collection: string): Promise<void> {\n // ① 删除 vecdb 集合(向量数据)\n const exists = await this.vecdb.collection.exists(collection)\n if (exists.success && exists.data)\n await this.vecdb.collection.drop(collection)\n\n // ② 删除 reldb 中所有与该 collection 相关的数据(顺序:关联表先、主表后)\n await this.sql.execute('DELETE FROM hai_ai_knowledge_entity_document WHERE collection = ?', [collection])\n await this.sql.execute('DELETE FROM hai_ai_knowledge_document WHERE collection = ?', [collection])\n await this.sql.execute('DELETE FROM hai_ai_knowledge_entity WHERE collection = ?', [collection])\n await this.sql.execute('DELETE FROM hai_ai_knowledge_collections WHERE collection = ?', [collection])\n }\n}\n\n// ─── Provider 工厂 ───\n\n/** DB Provider 依赖 */\nexport interface DbStoreProviderDeps {\n sql: DmlOperations\n jsonOps: ReldbJsonOps\n dbType?: DbType\n vecdb: VecdbFunctions\n}\n\n/**\n * 创建默认 DB 存储 Provider\n *\n * 基于 reldb + vecdb 的 AIStoreProvider 实现。\n * reldb 用于关系数据存储,vecdb 用于向量存储。\n */\nexport function createDbStoreProvider(deps: DbStoreProviderDeps): AIStoreProvider {\n const { sql, jsonOps, vecdb: vecdbDep } = deps\n const dbType = deps.dbType ?? 'sqlite'\n\n /** 已创建的 RelStore 实例(用于批量建表) */\n const relStores: ReldbAIRelStore<unknown>[] = []\n\n return {\n name: 'db',\n\n createRelStore<T>(name: string, options?: AIRelStoreOptions): AIRelStore<T> {\n const store = new ReldbAIRelStore<T>(sql, name, jsonOps, dbType, options)\n relStores.push(store as ReldbAIRelStore<unknown>)\n return store\n },\n\n createVectorStore(name: string): AIVectorStore {\n return new VecdbAIVectorStore(vecdbDep, name)\n },\n\n getVectorBackend(): AIVectorBackend | undefined {\n const connection = vecdbDep.rawConnection\n return connection ? { ...connection } : undefined\n },\n\n createKnowledgeStore(): KnowledgeStore {\n return new DbKnowledgeStore(sql, dbType, vecdbDep)\n },\n\n async initialize(): Promise<void> {\n if (relStores.length > 0) {\n await Promise.all(relStores.map(s => s.createTable()))\n logger.debug('DB store provider initialized', { tableCount: relStores.length })\n }\n },\n\n async close(): Promise<void> {\n relStores.length = 0\n },\n }\n}\n\n// ─── Singleton 便捷工厂 ───\n\n/**\n * 检查 reldb + vecdb 是否已初始化\n *\n * 由 ai-main.ts 在创建默认 DB Provider 前调用。\n */\nexport function isDbStoreAvailable(): boolean {\n return reldb.isInitialized && vecdb.isInitialized\n}\n\n/**\n * 获取未初始化的依赖名称列表\n */\nexport function getUnavailableDbDeps(): string[] {\n const missing: string[] = []\n if (!reldb.isInitialized)\n missing.push('reldb')\n if (!vecdb.isInitialized)\n missing.push('vecdb')\n return missing\n}\n\n/**\n * 从已初始化的 reldb/vecdb 单例创建 DB Provider\n *\n * 用于默认 `store.type: 'db'` 场景。调用前应先用 `isDbStoreAvailable()` 检查。\n */\nexport function createDbStoreProviderFromModules(): AIStoreProvider {\n return createDbStoreProvider({\n sql: reldb.sql,\n jsonOps: reldb.json,\n dbType: reldb.config?.type,\n vecdb,\n })\n}\n","/**\n * @h-ai/ai — 进程内临时 Store Provider\n *\n * 为 LLM-only、工具和本地原型提供零外部依赖的默认体验。数据只存在于当前进程,\n * 不提供 KnowledgeStore,也不应作为多实例或需要持久化的生产存储使用。\n * @module ai-store-provider-memory\n */\n\nimport type {\n AIRelStore,\n AIStoreProvider,\n AIVectorStore,\n StoreFilter,\n StoreScope,\n WhereOperator,\n} from '../ai-store-types.js'\n\ninterface StoredValue {\n data: unknown\n scope?: StoreScope\n}\n\ninterface StoredVector {\n vector: number[]\n metadata?: Record<string, unknown>\n}\n\nfunction isWhereOperator(value: unknown): value is WhereOperator<unknown> {\n return typeof value === 'object'\n && value !== null\n && ['$in', '$gte', '$gt', '$lte', '$lt'].some(key => key in value)\n}\n\nfunction compare(left: unknown, right: unknown): number {\n if (typeof left === 'number' && typeof right === 'number')\n return left - right\n return String(left ?? '').localeCompare(String(right ?? ''))\n}\n\nfunction matchesOperator(value: unknown, operator: WhereOperator<unknown>): boolean {\n if (operator.$in && !operator.$in.some(candidate => Object.is(candidate, value)))\n return false\n if (operator.$gte !== undefined && compare(value, operator.$gte) < 0)\n return false\n if (operator.$gt !== undefined && compare(value, operator.$gt) <= 0)\n return false\n if (operator.$lte !== undefined && compare(value, operator.$lte) > 0)\n return false\n if (operator.$lt !== undefined && compare(value, operator.$lt) >= 0)\n return false\n return true\n}\n\nfunction matchesRecord<T>(record: StoredValue, filter: StoreFilter<T>): boolean {\n if (filter.objectId !== undefined && record.scope?.objectId !== filter.objectId)\n return false\n if (filter.sessionId !== undefined && record.scope?.sessionId !== filter.sessionId)\n return false\n if (filter.refId !== undefined && record.scope?.refId !== filter.refId)\n return false\n if (filter.status !== undefined) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status]\n if (!record.scope?.status || !statuses.includes(record.scope.status))\n return false\n }\n\n const data = record.data as Record<string, unknown>\n if (filter.where) {\n for (const [key, expected] of Object.entries(filter.where)) {\n const actual = data[key]\n if (isWhereOperator(expected)) {\n if (!matchesOperator(actual, expected))\n return false\n }\n else if (!Object.is(actual, expected)) {\n return false\n }\n }\n }\n\n if (filter.scope) {\n const dataScope = data.scope\n if (typeof dataScope !== 'object' || dataScope === null)\n return false\n for (const [key, expected] of Object.entries(filter.scope)) {\n if (!Object.is((dataScope as Record<string, unknown>)[key], expected))\n return false\n }\n }\n\n return true\n}\n\nfunction createRelStore<T>(records: Map<string, StoredValue>): AIRelStore<T> {\n function select(filter: StoreFilter<T>): T[] {\n let values = Array.from(records.values())\n .filter(record => matchesRecord(record, filter))\n .map(record => record.data as T)\n\n if (filter.orderBy) {\n const { field, direction } = filter.orderBy\n const multiplier = direction === 'asc' ? 1 : -1\n values = values.sort((left, right) => compare(left[field], right[field]) * multiplier)\n }\n if (filter.limit !== undefined)\n values = values.slice(0, Math.max(0, filter.limit))\n return values\n }\n\n return {\n async save(id, data, scope) {\n records.set(id, { data, scope })\n },\n async saveMany(items) {\n for (const item of items)\n records.set(item.id, { data: item.data, scope: item.scope })\n },\n async get(id) {\n return records.get(id)?.data as T | undefined\n },\n async query(filter) {\n return select(filter)\n },\n async queryPage(filter, page) {\n const values = select({ ...filter, limit: undefined })\n return {\n items: values.slice(page.offset, page.offset + page.limit),\n total: values.length,\n }\n },\n async remove(id) {\n return records.delete(id)\n },\n async removeBy(filter) {\n const ids = Array.from(records.entries())\n .filter(([, record]) => matchesRecord(record, filter))\n .map(([id]) => id)\n for (const id of ids)\n records.delete(id)\n return ids.length\n },\n async count(filter = {}) {\n return select({ ...filter, limit: undefined }).length\n },\n async clear(filter) {\n if (!filter) {\n records.clear()\n return\n }\n const ids = Array.from(records.entries())\n .filter(([, record]) => matchesRecord(record, filter))\n .map(([id]) => id)\n for (const id of ids)\n records.delete(id)\n },\n }\n}\n\nfunction cosineSimilarity(left: number[], right: number[]): number {\n if (left.length !== right.length || left.length === 0)\n return 0\n let dot = 0\n let leftNorm = 0\n let rightNorm = 0\n for (let index = 0; index < left.length; index += 1) {\n dot += left[index] * right[index]\n leftNorm += left[index] ** 2\n rightNorm += right[index] ** 2\n }\n if (leftNorm === 0 || rightNorm === 0)\n return 0\n return dot / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm))\n}\n\nfunction createVectorStore(vectors: Map<string, StoredVector>): AIVectorStore {\n return {\n async upsert(id, vector, metadata) {\n vectors.set(id, { vector: [...vector], metadata })\n },\n async search(vector, options = {}) {\n const matches = Array.from(vectors.entries())\n .filter(([, item]) => !options.filter || Object.entries(options.filter).every(\n ([key, expected]) => Object.is(item.metadata?.[key], expected),\n ))\n .map(([id, item]) => ({\n id,\n score: cosineSimilarity(vector, item.vector),\n content: typeof item.metadata?.content === 'string' ? item.metadata.content : undefined,\n metadata: item.metadata,\n }))\n .filter(item => item.score >= (options.minScore ?? 0))\n .sort((left, right) => right.score - left.score)\n return matches.slice(0, options.topK ?? 10)\n },\n async remove(id) {\n vectors.delete(id)\n },\n async clear(filter) {\n if (!filter) {\n vectors.clear()\n return\n }\n for (const [id, item] of vectors) {\n if (Object.entries(filter).every(([key, expected]) => Object.is(item.metadata?.[key], expected)))\n vectors.delete(id)\n }\n },\n }\n}\n\n/** 创建进程内临时 Store Provider;`close()` 会释放全部记录 */\nexport function createMemoryStoreProvider(): AIStoreProvider {\n const relStores = new Map<string, Map<string, StoredValue>>()\n const vectorStores = new Map<string, Map<string, StoredVector>>()\n\n return {\n name: 'memory',\n createRelStore<T>(name: string): AIRelStore<T> {\n let records = relStores.get(name)\n if (!records) {\n records = new Map()\n relStores.set(name, records)\n }\n return createRelStore<T>(records)\n },\n createVectorStore(name: string): AIVectorStore {\n let vectors = vectorStores.get(name)\n if (!vectors) {\n vectors = new Map()\n vectorStores.set(name, vectors)\n }\n return createVectorStore(vectors)\n },\n initialize: () => Promise.resolve(),\n async close() {\n for (const records of relStores.values())\n records.clear()\n for (const vectors of vectorStores.values())\n vectors.clear()\n relStores.clear()\n vectorStores.clear()\n },\n }\n}\n","/**\n * @h-ai/ai — AI 服务主入口\n *\n * 提供统一的 `ai` 对象,聚合所有 AI 操作功能。\n * @module ai-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { A2AOperations } from './a2a/ai-a2a-types.js'\nimport type { AIConfig, AIConfigInput } from './ai-config.js'\nimport type { AIFunctions, AIInitOptions } from './ai-types.js'\nimport type { AudioOperations } from './audio/ai-audio-types.js'\nimport type { CompressOperations } from './compress/ai-compress-types.js'\nimport type { ContextOperations } from './context/ai-context-types.js'\nimport type { EmbeddingOperations } from './embedding/ai-embedding-types.js'\nimport type { FileOperations } from './file/ai-file-types.js'\nimport type { KnowledgeOperations } from './knowledge/ai-knowledge-types.js'\nimport type { LLMOperations, StreamOperations, ToolsOperations } from './llm/ai-llm-types.js'\nimport type { MCPOperations } from './mcp/ai-mcp-types.js'\nimport type { MemoryOperations } from './memory/ai-memory-types.js'\nimport type { PersonaOperations } from './persona/ai-persona-types.js'\nimport type { RagOperations } from './rag/ai-rag-types.js'\nimport type { ReasoningOperations } from './reasoning/ai-reasoning-types.js'\nimport type { RerankOperations } from './rerank/ai-rerank-types.js'\nimport type { RetrievalOperations } from './retrieval/ai-retrieval-types.js'\nimport type { AIStoreProvider } from './store/ai-store-types.js'\nimport type { SummaryOperations } from './summary/ai-summary-types.js'\nimport type { TokenOperations } from './token/ai-token-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { datapipe } from '@h-ai/datapipe'\n\nimport { createA2ALazyProxy } from './a2a/ai-a2a-functions.js'\nimport { AIConfigSchema } from './ai-config.js'\nimport { createAISubsystems } from './ai-functions.js'\nimport { aiM } from './ai-i18n.js'\nimport { HaiAIError } from './ai-types.js'\nimport { collectStream, createSSEDecoder, createStreamProcessor, encodeSSE } from './llm/ai-llm-stream.js'\nimport { createToolRegistry, defineTool } from './llm/ai-llm-tool.js'\nimport { createDbStoreProviderFromModules, isDbStoreAvailable } from './store/providers/ai-store-provider-db.js'\nimport { createMemoryStoreProvider } from './store/providers/ai-store-provider-memory.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'main' })\n\n// ─── 内部状态 ───\n\n/** 并发初始化防护 */\nlet initInProgress = false\n/** 当前配置(`null` 表示未初始化) */\nlet currentConfig: AIConfig | null = null\n/** 当前 LLM 操作实例 */\nlet currentLLM: LLMOperations | null = null\n/** 当前 MCP 操作实例 */\nlet currentMCP: MCPOperations | null = null\n/** 当前 Embedding 操作实例 */\nlet currentEmbedding: EmbeddingOperations | null = null\n/** 当前 Reasoning 操作实例 */\nlet currentReasoning: ReasoningOperations | null = null\n/** 当前 Retrieval 操作实例 */\nlet currentRetrieval: RetrievalOperations | null = null\n/** 当前 RAG 操作实例 */\nlet currentRag: RagOperations | null = null\n/** 当前 Knowledge 操作实例 */\nlet currentKnowledge: KnowledgeOperations | null = null\n/** 当前 Memory 操作实例 */\nlet currentMemory: MemoryOperations | null = null\n/** 当前 Persona 操作实例 */\nlet currentPersona: PersonaOperations | null = null\n/** 当前 Context 操作实例 */\nlet currentContext: ContextOperations | null = null\n/** 当前 Token 操作实例 */\nlet currentToken: TokenOperations | null = null\n/** 当前 Summary 操作实例 */\nlet currentSummary: SummaryOperations | null = null\n/** 当前 Compress 操作实例 */\nlet currentCompress: CompressOperations | null = null\n/** 当前 Rerank 操作实例 */\nlet currentRerank: RerankOperations | null = null\n/** 当前 File 操作实例 */\nlet currentFile: FileOperations | null = null\n/** 当前 Audio 操作实例 */\nlet currentAudio: AudioOperations | null = null\n/** A2A 配置(从 config.a2a 存储,供延迟初始化使用) */\nlet currentA2AConfig: AIConfig['a2a']\n/** A2A 内部实现(registerExecutor 成功后才有值) */\nlet currentA2AImpl: A2AOperations | null = null\n/** 当前存储 Provider(用于 A2A 延迟初始化) */\nlet currentStoreProvider: AIStoreProvider | null = null\n\n// ─── 未初始化占位 ───\n\n/** 创建未初始化错误工具(统一的 NOT_INITIALIZED 响应) */\nconst notInitialized = core.module.createNotInitializedKit(\n HaiAIError.NOT_INITIALIZED,\n () => aiM('ai_notInitialized'),\n)\n\n/**\n * LLM 未初始化占位\n *\n * 异步方法返回 NOT_INITIALIZED HaiResult。\n * chatStream 是 async generator,无法返回 HaiResult,\n * 只能在迭代时抛出异常通知调用方。\n */\nconst notInitializedLLM: LLMOperations = {\n chat: () => Promise.resolve(notInitialized.result()),\n async* chatStream() {\n throw notInitialized.error()\n },\n listModels: () => Promise.resolve(notInitialized.result()),\n getHistory: () => Promise.resolve(notInitialized.result()),\n listSessions: () => Promise.resolve(notInitialized.result()),\n ask: () => Promise.resolve(notInitialized.result()),\n async* askStream() {\n throw notInitialized.error()\n },\n generateObject: () => Promise.resolve(notInitialized.result()),\n}\n\n/** MCP 未初始化占位:所有方法返回 NOT_INITIALIZED 错误 */\nconst notInitializedMCP: MCPOperations = {\n registerTool: () => notInitialized.result(),\n registerResource: () => notInitialized.result(),\n registerPrompt: () => notInitialized.result(),\n callTool: () => Promise.resolve(notInitialized.result()),\n readResource: () => Promise.resolve(notInitialized.result()),\n getPrompt: () => Promise.resolve(notInitialized.result()),\n}\n\n/** Embedding 未初始化占位 */\nconst notInitializedEmbedding = notInitialized.proxy<EmbeddingOperations>()\n\n/** Reasoning 未初始化占位 */\nconst notInitializedReasoning: ReasoningOperations = {\n run: () => Promise.resolve(notInitialized.result()),\n async* runStream() { throw notInitialized.error() },\n}\n\n/** Retrieval 未初始化占位 */\nconst notInitializedRetrieval: RetrievalOperations = {\n addSource: () => Promise.resolve(notInitialized.result()),\n removeSource: () => Promise.resolve(notInitialized.result()),\n listSources: () => Promise.resolve([]),\n retrieve: () => Promise.resolve(notInitialized.result()),\n}\n\n/** RAG 未初始化占位 */\nconst notInitializedRag: RagOperations = {\n query: () => Promise.resolve(notInitialized.result()),\n async* queryStream() { throw notInitialized.error() },\n}\n\n/** Knowledge 未初始化占位 */\nconst notInitializedKnowledge = notInitialized.proxy<KnowledgeOperations>()\n\n/** Memory 未初始化占位 */\nconst notInitializedMemory = notInitialized.proxy<MemoryOperations>()\n\n/** Persona 未初始化占位 */\nconst notInitializedPersona = notInitialized.proxy<PersonaOperations>()\n\n/**\n * Token 未初始化占位\n *\n * Token 方法返回原始 number 而非 HaiResult,无法通过 proxy 安全拦截。\n * 未初始化时直接抛出异常,避免静默返回 0 导致下游 Token 计算错误。\n */\nconst notInitializedToken: TokenOperations = {\n estimateText: () => { throw notInitialized.error() },\n estimateMessages: () => { throw notInitialized.error() },\n}\n\n/** Summary 未初始化占位 */\nconst notInitializedSummary = notInitialized.proxy<SummaryOperations>()\n\n/** Compress 未初始化占位 */\nconst notInitializedCompress = notInitialized.proxy<CompressOperations>()\n\n/** Context 未初始化占位 */\nconst notInitializedContext: ContextOperations = {\n createManager: () => notInitialized.result(),\n restoreManager: () => Promise.resolve(notInitialized.result()),\n listSessions: () => Promise.resolve(notInitialized.result()),\n renameSession: () => Promise.resolve(notInitialized.result()),\n removeSession: () => Promise.resolve(notInitialized.result()),\n}\n\n/** Rerank 未初始化占位 */\nconst notInitializedRerank = notInitialized.proxy<RerankOperations>()\n\n/** File 未初始化占位 */\nconst notInitializedFile = notInitialized.proxy<FileOperations>()\n\n/**\n * Audio 未初始化占位\n *\n * transcribe / synthesize 返回 NOT_INITIALIZED HaiResult;\n * 流式方法是 async generator,无法返回 HaiResult,只能在迭代时抛出异常。\n */\nconst notInitializedAudio: AudioOperations = {\n transcribe: () => Promise.resolve(notInitialized.result()),\n async* transcribeStream() { throw notInitialized.error() },\n synthesize: () => Promise.resolve(notInitialized.result()),\n async* synthesizeStream() { throw notInitialized.error() },\n getCapabilities: () => notInitialized.result(),\n}\n\n/** A2A 延迟初始化代理(委托给 a2a 模块的 createA2ALazyProxy) */\nconst a2aLazyOperations: A2AOperations = createA2ALazyProxy({\n isInitialized: () => currentConfig !== null,\n getA2AConfig: () => currentA2AConfig ?? null,\n getA2AImpl: () => currentA2AImpl,\n setA2AImpl: (impl) => { currentA2AImpl = impl },\n getStoreProvider: () => currentStoreProvider,\n notInitializedResult: () => notInitialized.result(),\n})\n\n// ─── 内部辅助 ───\n\n/** 重置所有子功能引用并释放 StoreProvider(用于 close 和 init 失败清理) */\nasync function resetAllState(): Promise<void> {\n const storeProvider = currentStoreProvider\n\n currentLLM = null\n currentMCP = null\n currentEmbedding = null\n currentReasoning = null\n currentRetrieval = null\n currentRag = null\n currentKnowledge = null\n currentMemory = null\n currentPersona = null\n currentToken = null\n currentSummary = null\n currentCompress = null\n currentContext = null\n currentRerank = null\n currentFile = null\n currentAudio = null\n currentA2AConfig = undefined\n currentA2AImpl = null\n currentStoreProvider = null\n currentConfig = null\n\n if (storeProvider?.close) {\n try {\n await storeProvider.close()\n }\n catch (error) {\n logger.error('AI store provider close failed', { error })\n }\n }\n}\n\n// ─── 纯函数操作(不依赖初始化) ───\n\nconst toolsOperations: ToolsOperations = {\n define: defineTool,\n createRegistry: createToolRegistry,\n}\n\nconst streamOperations: StreamOperations = {\n createProcessor: createStreamProcessor,\n collect: collectStream,\n createSSEDecoder,\n encodeSSE,\n}\n\n// ─── 服务对象 ───\n\n/**\n * AI 服务对象,统一的 AI 访问入口\n *\n * @example\n * ```ts\n * import { ai } from '@h-ai/ai'\n *\n * // 初始化\n * await ai.init({ llm: { model: 'gpt-4o-mini', apiKey: process.env.HAI_AI_LLM_API_KEY } })\n *\n * // LLM 调用\n * const result = await ai.llm.chat({\n * messages: [{ role: 'user', content: '你好' }],\n * })\n *\n * // 关闭\n * await ai.close()\n * ```\n */\nexport const ai: AIFunctions = {\n async init(config?: AIConfigInput, options?: AIInitOptions): Promise<HaiResult<void>> {\n // 并发初始化防护:避免多次 init 同时执行导致资源泄漏\n if (initInProgress) {\n logger.warn('AI init already in progress, skipping concurrent call')\n return err(HaiAIError.INIT_IN_PROGRESS, aiM('ai_initInProgress'))\n }\n initInProgress = true\n\n try {\n // 关闭旧实例\n if (currentConfig) {\n logger.warn('AI module is already initialized, reinitializing')\n await ai.close()\n }\n\n logger.info('Initializing AI module')\n\n const parseResult = AIConfigSchema.safeParse(config ?? {})\n if (!parseResult.success) {\n logger.error('AI config validation failed', { error: parseResult.error.message })\n return err(\n HaiAIError.CONFIGURATION_ERROR,\n aiM('ai_configError', { params: { error: parseResult.error.message } }),\n parseResult.error,\n )\n }\n const parsed = parseResult.data\n\n // 注入存储 Provider:外部 Provider > 已初始化的 DB Provider > 进程内临时 Provider。\n // 临时 Provider 让 LLM-only 场景零依赖启动;生产持久化仍应显式初始化 reldb + vecdb。\n let storeProvider: AIStoreProvider\n if (options?.storeProvider) {\n storeProvider = options.storeProvider\n }\n else if (isDbStoreAvailable()) {\n storeProvider = createDbStoreProviderFromModules()\n }\n else {\n storeProvider = createMemoryStoreProvider()\n logger.warn('AI is using the ephemeral in-memory store; initialize reldb and vecdb before ai.init() for persistent data')\n }\n currentStoreProvider = storeProvider\n\n // 委托 ai-functions 组装所有子功能(含建表)\n const subs = await createAISubsystems(parsed, {\n storeProvider,\n datapipe,\n })\n\n currentLLM = subs.llm\n currentMCP = subs.mcp\n currentEmbedding = subs.embedding\n currentReasoning = subs.reasoning\n currentRerank = subs.rerank\n currentRetrieval = subs.retrieval\n currentRag = subs.rag\n currentKnowledge = subs.knowledge\n currentMemory = subs.memory\n currentPersona = subs.persona\n currentToken = subs.token\n currentSummary = subs.summary\n currentCompress = subs.compress\n currentContext = subs.context\n currentFile = subs.file\n currentAudio = subs.audio\n\n currentA2AConfig = parsed.a2a\n\n currentConfig = parsed\n logger.info('AI module initialized', { model: parsed.llm?.model })\n return ok(undefined)\n }\n catch (error) {\n // 清理部分赋值的子功能引用,避免 isInitialized=false 但 getter 返回无效实例\n await resetAllState()\n logger.error('AI module initialization failed', { error })\n return err(\n HaiAIError.CONFIGURATION_ERROR,\n aiM('ai_initFailed', {\n params: { error: String(error) },\n }),\n error,\n )\n }\n finally {\n initInProgress = false\n }\n },\n\n get llm(): LLMOperations { return currentLLM ?? notInitializedLLM },\n get mcp(): MCPOperations { return currentMCP ?? notInitializedMCP },\n get tools(): ToolsOperations { return toolsOperations },\n get stream(): StreamOperations { return streamOperations },\n get embedding(): EmbeddingOperations { return currentEmbedding ?? notInitializedEmbedding },\n get reasoning(): ReasoningOperations { return currentReasoning ?? notInitializedReasoning },\n get retrieval(): RetrievalOperations { return currentRetrieval ?? notInitializedRetrieval },\n get rag(): RagOperations { return currentRag ?? notInitializedRag },\n get knowledge(): KnowledgeOperations { return currentKnowledge ?? notInitializedKnowledge },\n get memory(): MemoryOperations { return currentMemory ?? notInitializedMemory },\n get persona(): PersonaOperations { return currentPersona ?? notInitializedPersona },\n get token(): TokenOperations { return currentToken ?? notInitializedToken },\n get summary(): SummaryOperations { return currentSummary ?? notInitializedSummary },\n get compress(): CompressOperations { return currentCompress ?? notInitializedCompress },\n get context(): ContextOperations { return currentContext ?? notInitializedContext },\n get rerank(): RerankOperations { return currentRerank ?? notInitializedRerank },\n get file(): FileOperations { return currentFile ?? notInitializedFile },\n get audio(): AudioOperations { return currentAudio ?? notInitializedAudio },\n get a2a(): A2AOperations { return a2aLazyOperations },\n get config() { return currentConfig ? core.sanitize.sanitizeSensitiveFields(currentConfig) : null },\n get isInitialized() { return currentConfig !== null },\n\n async close(): Promise<void> {\n if (!currentConfig) {\n logger.info('AI module already closed, skipping')\n return\n }\n\n logger.info('Closing AI module')\n await resetAllState()\n logger.info('AI module closed')\n },\n}\n","/**\n * @h-ai/ai — MCP Server 创建与传输层\n *\n * 基于 `@modelcontextprotocol/sdk` 封装,提供便捷的 MCP 服务器创建。\n * @module ai-mcp-server\n */\n\nimport type { McpServerOptions } from './ai-mcp-types.js'\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\n\n// ─── 核心类导出 ───\n\nexport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\n\n// ─── 传输层导出 ───\n\n/** SSE 传输层 */\nexport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js'\n\n/** Stdio 传输层 */\nexport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\n\n/** Streamable HTTP 传输层(推荐) */\nexport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\n\n// ─── 便捷工厂 ───\n\n/**\n * 创建 MCP 服务器\n *\n * @param options - 服务器选项(名称、版本)\n * @returns McpServer 实例\n *\n * @example\n * ```ts\n * import { createMcpServer, StdioServerTransport } from '@h-ai/ai'\n *\n * const server = createMcpServer({ name: 'my-server', version: '1.0.0' })\n * // 注册工具 / 资源 ...\n * const transport = new StdioServerTransport()\n * await server.connect(transport)\n * ```\n */\nexport function createMcpServer(options: McpServerOptions): McpServer {\n return new McpServer(\n { name: options.name, version: options.version ?? '1.0.0' },\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/a2a/ai-a2a-server.ts","../src/a2a/ai-a2a-functions.ts","../src/audio/providers/ai-audio-provider.ts","../src/audio/providers/ai-audio-provider-doubao.ts","../src/llm/ai-llm-stream.ts","../src/audio/providers/ai-audio-provider-mimo.ts","../src/audio/providers/ai-audio-provider-openai.ts","../src/audio/providers/ai-audio-provider-qwen.ts","../src/audio/ai-audio-functions.ts","../src/compress/ai-compress-functions.ts","../src/store/ai-store-key.ts","../src/context/ai-context-functions.ts","../src/embedding/ai-embedding-functions.ts","../src/file/ai-file-functions.ts","../src/knowledge/ai-knowledge-entity.ts","../src/knowledge/ai-knowledge-functions.ts","../src/llm/ai-llm-tool.ts","../src/llm/providers/ai-llm-provider-anthropic.ts","../src/llm/providers/ai-llm-provider-openai-responses.ts","../src/llm/providers/ai-llm-provider-openai.ts","../src/llm/providers/ai-llm-provider-router.ts","../src/llm/ai-llm-functions.ts","../src/mcp/ai-mcp-functions.ts","../src/memory/ai-memory-facade.ts","../src/memory/ai-memory-extractor.ts","../src/memory/ai-memory-injection.ts","../src/memory/providers/ai-memory-provider-mem0-oss.ts","../src/memory/ai-memory-consolidation.ts","../src/memory/providers/ai-memory-provider-native.ts","../src/persona/ai-persona-functions.ts","../src/rag/ai-rag-functions.ts","../src/reasoning/ai-reasoning-functions.ts","../src/rerank/ai-rerank-functions.ts","../src/retrieval/ai-retrieval-functions.ts","../src/summary/ai-summary-functions.ts","../src/token/ai-token-functions.ts","../src/ai-functions.ts","../src/store/providers/ai-store-provider-db.ts","../src/store/providers/ai-store-provider-memory.ts","../src/ai-main.ts","../src/mcp/ai-mcp-server.ts"],"names":["ServerCallContextImpl","options","core","logger","Buffer","size","ok","err","resolveSynthesisOutput","OpenAI","systemMessages","nonSystem","toSummarize","combineSignal","fullReply","model","usage","result","datapipe","nanoid","zod","contentToText","isRecord","process","response","LEADING_MARKDOWN_FENCE_REGEX","TRAILING_MARKDOWN_FENCE_REGEX","extractMemories","DEFAULT_IMPORTANCE","MEMORY_TYPES","normalizeType","normalizeImportance","matchScope","DEFAULT_OBJECT_ID","topK","countResult","count","vecdb","cosineSimilarity"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/ai — A2A Server 创建与传输层\n *\n * 基于 `@a2a-js/sdk/server` 封装,提供便捷的 A2A 服务器创建和 SDK 再导出。\n * @module ai-a2a-server\n */\n\nimport type { AgentCard } from '@a2a-js/sdk'\n\nimport type { A2AAgentCardConfig } from './ai-a2a-types.js'\n\n// ─── SDK Server 类型导出 ───\n\n// 仅重导出应用层实现 executor 所需的类型;运行时 SDK 类由 ai.a2a 内部封装,避免暴露额外装配细节。\n\nexport type {\n AgentExecutionEvent,\n AgentExecutor,\n ExecutionEventBus,\n ExecutionEventBusManager,\n PushNotificationSender,\n PushNotificationStore,\n ServerCallContext,\n TaskStore,\n} from '@a2a-js/sdk/server'\n\n// ─── 便捷工厂 ───\n\n/**\n * 从简化配置构建符合 SDK 规范的 AgentCard 对象\n *\n * @param config - 应用层提供的 Agent Card 配置\n * @returns 完整的 AgentCard 对象(可传给 DefaultRequestHandler)\n *\n * @example\n * ```ts\n * import { buildAgentCard } from '@h-ai/ai'\n *\n * const card = buildAgentCard({\n * name: 'my-agent',\n * description: 'An example agent',\n * url: 'https://example.com',\n * skills: [{ id: 'chat', name: 'Chat', description: 'General chat' }],\n * })\n * ```\n */\nexport function buildAgentCard(config: A2AAgentCardConfig): AgentCard {\n const card: AgentCard = {\n name: config.name,\n description: config.description ?? '',\n url: config.url,\n version: config.version ?? '1.0.0',\n protocolVersion: '0.3.0',\n defaultInputModes: ['text'],\n defaultOutputModes: ['text'],\n capabilities: {},\n skills: (config.skills ?? []).map(s => ({\n id: s.id,\n name: s.name,\n description: s.description ?? '',\n tags: s.tags ?? [],\n })),\n }\n\n // 声明安全认证方案到 Agent Card\n if (config.security?.apiKey) {\n const { in: location, name } = config.security.apiKey\n card.securitySchemes = {\n apiKey: { type: 'apiKey', in: location, name },\n }\n card.security = [{ apiKey: [] }]\n }\n\n return card\n}\n","/**\n * @h-ai/ai — A2A 子功能组装\n *\n * 实现 A2A 操作接口:RelDB 持久化 TaskStore、消息日志、远端调用。\n * 包含延迟初始化代理工厂(`createA2ALazyProxy`)和完整操作实例工厂(`createA2AOperations`)。\n * @module ai-a2a-functions\n */\n\nimport type { Message, Task } from '@a2a-js/sdk'\nimport type { AgentExecutor, ExecutionEventBus, ServerCallContext, TaskStore } from '@a2a-js/sdk/server'\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { A2AConfig } from '../ai-config.js'\n\nimport type { AIRelStore, AIStoreProvider } from '../store/ai-store-types.js'\nimport type {\n A2AAgentCardConfig,\n A2ACallOptions,\n A2ACallResult,\n A2AHandleResult,\n A2AMessageRecord,\n A2AOperations,\n A2ATaskFilter,\n} from './ai-a2a-types.js'\n\nimport { A2AClient } from '@a2a-js/sdk/client'\nimport { DefaultExecutionEventBusManager, DefaultRequestHandler, JsonRpcTransportHandler, ServerCallContext as ServerCallContextImpl } from '@a2a-js/sdk/server'\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { buildAgentCard } from './ai-a2a-server.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'a2a' })\nconst DEFAULT_A2A_CALL_TIMEOUT_MS = 60_000\n\ninterface ValidatedRemoteUrl {\n requestUrl: string\n safeLabel: string\n}\n\n/**\n * 校验远端 Agent URL 的基础边界。\n *\n * A2A 目标通常来自服务端配置;这里拒绝非 HTTP(S) 协议和 URL 内嵌凭据,\n * 并生成不含 query/hash 的安全标签用于错误与持久化记录。部署侧仍应对可访问 origin\n * 使用白名单,因为 DNS 解析与重定向策略属于应用网络边界。\n */\nfunction validateRemoteUrl(remoteUrl: string): ValidatedRemoteUrl {\n const parsed = new URL(remoteUrl)\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')\n throw new Error('A2A remote URL must use HTTP or HTTPS')\n if (parsed.username || parsed.password)\n throw new Error('A2A remote URL must not contain credentials')\n\n return {\n requestUrl: parsed.toString(),\n safeLabel: `${parsed.origin}${parsed.pathname}`,\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' ? value as Record<string, unknown> : undefined\n}\n\nfunction isAgentMessageEvent(event: unknown): event is { role: 'agent', parts?: unknown[] } {\n const record = asRecord(event)\n return record?.role === 'agent' && (record.parts === undefined || Array.isArray(record.parts))\n}\n\nfunction isTaskResult(value: unknown): value is Task {\n return asRecord(value)?.status !== undefined\n}\n\nfunction isMessageResult(value: unknown): value is Message {\n return Array.isArray(asRecord(value)?.parts)\n}\n\nfunction getPartText(part: unknown): string | undefined {\n const record = asRecord(part)\n return typeof record?.text === 'string' ? record.text : undefined\n}\n\nfunction getTextParts(parts: readonly unknown[] | undefined): string[] {\n return parts?.map(getPartText).filter((text): text is string => text != null) ?? []\n}\n\nasync function executeRemoteAgentCall(\n remoteUrl: string,\n message: string,\n options?: A2ACallOptions,\n): Promise<HaiResult<A2ACallResult>> {\n let safeLabel = '(invalid or unavailable URL)'\n try {\n const validatedUrl = validateRemoteUrl(remoteUrl)\n const requestUrl = validatedUrl.requestUrl\n safeLabel = validatedUrl.safeLabel\n const customHeaders = options?.headers\n const timeoutMs = Math.max(1, options?.timeout ?? DEFAULT_A2A_CALL_TIMEOUT_MS)\n const client = new A2AClient(requestUrl, {\n fetchImpl: ((input: RequestInfo | URL, init?: RequestInit) => {\n const existingHeaders = init?.headers\n ? Object.fromEntries(new Headers(init.headers as HeadersInit).entries())\n : {}\n const signals = [init?.signal, AbortSignal.timeout(timeoutMs)].filter((signal): signal is AbortSignal => Boolean(signal))\n const fetchInit: RequestInit = {\n ...init,\n headers: { ...existingHeaders, ...customHeaders },\n signal: signals.length > 1 ? AbortSignal.any(signals) : signals[0],\n }\n return globalThis.fetch(input, fetchInit)\n }) as typeof fetch,\n })\n const params: { message: Message } = {\n message: {\n kind: 'message',\n messageId: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,\n role: 'user',\n parts: [{ kind: 'text', text: message }],\n },\n }\n\n const response = await client.sendMessage(params)\n if ('error' in response) {\n return err(HaiAIError.A2A_REMOTE_CALL_FAILED, aiM('ai_a2aRemoteCallFailed', { params: { url: safeLabel, error: 'Remote agent returned an error' } }))\n }\n\n const responseData = response.result\n let result: A2ACallResult\n if (isTaskResult(responseData)) {\n const textParts = responseData.artifacts?.flatMap(artifact => getTextParts(artifact.parts)) ?? []\n result = {\n taskId: responseData.id,\n taskState: responseData.status?.state,\n responseText: textParts.join('\\n') || undefined,\n responseParts: responseData.artifacts?.flatMap(artifact => artifact.parts ?? []),\n }\n }\n else if (isMessageResult(responseData)) {\n const textParts = getTextParts(responseData.parts)\n result = {\n responseText: textParts.join('\\n') || undefined,\n responseParts: responseData.parts,\n }\n }\n else {\n result = {}\n }\n\n return ok(result)\n }\n catch (error) {\n const errorName = error instanceof Error ? error.name : 'UnknownError'\n return err(HaiAIError.A2A_REMOTE_CALL_FAILED, aiM('ai_a2aRemoteCallFailed', { params: { url: safeLabel, error: errorName } }))\n }\n}\n\n// ─── RelDB 持久化 TaskStore ───\n\n/**\n * 基于 ReldbAIStore 的 A2A TaskStore 实现\n *\n * 将 SDK 的 Task 对象桥接到 RelDB 存储,利用 status 和 refId 索引列\n * 实现按状态和上下文查询。\n */\nexport class ReldbA2ATaskStore implements TaskStore {\n constructor(private readonly store: AIRelStore<Task>) {}\n\n async save(task: Task, _context?: ServerCallContext): Promise<void> {\n await this.store.save(task.id, task, {\n objectId: task.contextId,\n status: task.status?.state,\n refId: task.contextId,\n })\n }\n\n async load(taskId: string, _context?: ServerCallContext): Promise<Task | undefined> {\n return this.store.get(taskId)\n }\n}\n\n// ─── A2A 消息日志拦截器 ───\n\n/**\n * 创建带消息日志的 AgentExecutor 包装器\n *\n * 在真实 AgentExecutor.execute 前后记录入站消息和出站响应到 messageStore。\n */\nfunction wrapExecutorWithLogging(\n executor: AgentExecutor,\n messageStore: AIRelStore<A2AMessageRecord>,\n): AgentExecutor {\n return {\n async execute(requestContext, eventBus) {\n // 记录入站消息\n const inboundRecord: A2AMessageRecord = {\n id: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,\n taskId: requestContext.taskId,\n role: 'user',\n parts: requestContext.userMessage.parts ?? [],\n createdAt: Date.now(),\n }\n messageStore.save(inboundRecord.id, inboundRecord, { objectId: requestContext.taskId, status: 'user' })\n .catch(e => logger.warn('Failed to save inbound A2A message', { error: e }))\n\n // 监听出站事件并记录\n const originalPublish = eventBus.publish.bind(eventBus)\n const wrappedBus: ExecutionEventBus = Object.create(eventBus)\n wrappedBus.publish = (event) => {\n // SDK 未提供 ExecutionEvent 的类型守卫;先做最小运行时判别,再记录 agent 消息。\n if (isAgentMessageEvent(event)) {\n const outboundRecord: A2AMessageRecord = {\n id: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,\n taskId: requestContext.taskId,\n role: 'agent',\n parts: event.parts ?? [],\n createdAt: Date.now(),\n }\n messageStore.save(outboundRecord.id, outboundRecord, { objectId: requestContext.taskId, status: 'agent' })\n .catch(e => logger.warn('Failed to save outbound A2A message', { error: e }))\n }\n originalPublish(event)\n }\n\n await executor.execute(requestContext, wrappedBus)\n },\n async cancelTask(taskId, eventBus) {\n await executor.cancelTask(taskId, eventBus)\n },\n }\n}\n\n// ─── 工厂函数 ───\n\n/** A2A 子功能组装依赖 */\nexport interface A2ADeps {\n storeProvider: AIStoreProvider\n}\n\n/** A2A 子功能配置 */\nexport interface A2ACreateOptions {\n /** Agent Card 配置 */\n agentCard: A2AAgentCardConfig\n /** Agent 执行器(由应用层实现) */\n executor: AgentExecutor\n}\n\n/**\n * 创建 A2A 操作接口实例\n *\n * 组装 TaskStore、RequestHandler、消息日志、远端调用等能力。\n */\nexport function createA2AOperations(\n options: A2ACreateOptions,\n deps: A2ADeps,\n): A2AOperations {\n const { storeProvider } = deps\n const agentCardConfig = options.agentCard\n\n // 创建持久化存储\n const taskStore = storeProvider.createRelStore<Task>('hai_ai_a2a_tasks', {\n hasObjectId: true,\n hasStatus: true,\n hasRefId: true,\n })\n const messageStore = storeProvider.createRelStore<A2AMessageRecord>('hai_ai_a2a_messages', {\n hasObjectId: true,\n hasStatus: true,\n })\n\n // 构建 SDK 层\n const agentCard = buildAgentCard(agentCardConfig)\n const a2aTaskStore = new ReldbA2ATaskStore(taskStore)\n const wrappedExecutor = wrapExecutorWithLogging(options.executor, messageStore)\n const eventBusManager = new DefaultExecutionEventBusManager()\n const requestHandler = new DefaultRequestHandler(agentCard, a2aTaskStore, wrappedExecutor, eventBusManager)\n const transportHandler = new JsonRpcTransportHandler(requestHandler)\n\n return {\n registerExecutor() {\n logger.warn('A2A executor already registered, ignoring duplicate registerExecutor call')\n return ok(undefined)\n },\n\n getAgentCard() {\n return ok(agentCardConfig)\n },\n\n async handleRequest(requestBody: unknown, _context?: Record<string, unknown>): Promise<A2AHandleResult> {\n const serverContext = new ServerCallContextImpl()\n\n const result = await transportHandler.handle(requestBody, serverContext)\n\n // 判断是否为 AsyncGenerator(流式响应)\n if (result && typeof result === 'object' && Symbol.asyncIterator in result) {\n return {\n streaming: true,\n stream: result as AsyncGenerator<unknown, void, undefined>,\n }\n }\n\n return {\n streaming: false,\n body: result,\n }\n },\n\n async listMessages(filter: A2ATaskFilter) {\n try {\n const page = await messageStore.queryPage(\n {\n objectId: filter.contextId ?? filter.callerId,\n status: filter.status,\n orderBy: { field: 'createdAt' as keyof A2AMessageRecord, direction: 'desc' },\n },\n { offset: filter.offset ?? 0, limit: filter.limit ?? 50 },\n )\n return ok(page)\n }\n catch (error) {\n return err(HaiAIError.STORE_FAILED, aiM('ai_a2aListMessagesFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async callRemoteAgent(remoteUrl: string, message: string, options?: A2ACallOptions) {\n return executeRemoteAgentCall(remoteUrl, message, options)\n },\n }\n}\n\n// ─── 延迟初始化代理 ───\n\n/** 延迟代理的外部依赖(由 ai-main 注入状态访问器) */\nexport interface A2ALazyProxyDeps {\n /** 是否已初始化(即 currentConfig !== null) */\n isInitialized: () => boolean\n /** 获取 A2A 配置(config.a2a) */\n getA2AConfig: () => A2AConfig | null\n /** 获取当前 A2A 实现(registerExecutor 后才有值) */\n getA2AImpl: () => A2AOperations | null\n /** 保存 A2A 实现引用 */\n setA2AImpl: (impl: A2AOperations) => void\n /** 获取 StoreProvider(用于 createA2AOperations) */\n getStoreProvider: () => AIStoreProvider | null\n /** 未初始化错误工厂 */\n notInitializedResult: <T>() => HaiResult<T>\n}\n\n/**\n * 创建 A2A 延迟初始化代理\n *\n * `callRemoteAgent()` 是独立客户端能力,只需 `ai.init()`;`getAgentCard()` 可直接读取配置。\n * 只有服务端请求处理与消息查询依赖 `registerExecutor()`。\n *\n * @param deps - 由 ai-main 注入的状态访问器\n * @returns A2AOperations 代理对象\n */\nexport function createA2ALazyProxy(deps: A2ALazyProxyDeps): A2AOperations {\n return {\n registerExecutor(executor: AgentExecutor): HaiResult<void> {\n if (!deps.isInitialized()) {\n return deps.notInitializedResult()\n }\n const a2aConfig = deps.getA2AConfig()\n if (!a2aConfig) {\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured'))\n }\n if (deps.getA2AImpl()) {\n logger.warn('A2A executor already registered, re-registering')\n }\n const storeProvider = deps.getStoreProvider()\n if (!storeProvider) {\n return err(HaiAIError.STORE_FAILED, aiM('ai_internalError', { params: { error: 'StoreProvider not available' } }))\n }\n const agentCardWithSecurity = { ...a2aConfig.agentCard, security: a2aConfig.security }\n const impl = createA2AOperations(\n { agentCard: agentCardWithSecurity, executor },\n { storeProvider },\n )\n deps.setA2AImpl(impl)\n logger.info('A2A executor registered', { agentName: a2aConfig.agentCard.name })\n return ok(undefined)\n },\n\n getAgentCard() {\n const impl = deps.getA2AImpl()\n if (impl)\n return impl.getAgentCard()\n const a2aConfig = deps.getA2AConfig()\n if (a2aConfig)\n return ok({ ...a2aConfig.agentCard, security: a2aConfig.security } as A2AAgentCardConfig)\n if (!deps.isInitialized())\n return deps.notInitializedResult()\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured'))\n },\n\n async handleRequest(requestBody: unknown, context?: Record<string, unknown>) {\n const impl = deps.getA2AImpl()\n if (impl)\n return impl.handleRequest(requestBody, context)\n if (!deps.isInitialized())\n return deps.notInitializedResult() as never\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured')) as never\n },\n\n async listMessages(filter) {\n const impl = deps.getA2AImpl()\n if (impl)\n return impl.listMessages(filter)\n if (!deps.isInitialized())\n return deps.notInitializedResult()\n return err(HaiAIError.A2A_NOT_CONFIGURED, aiM('ai_a2aNotConfigured'))\n },\n\n async callRemoteAgent(remoteUrl, message, options) {\n const impl = deps.getA2AImpl()\n if (impl)\n return impl.callRemoteAgent(remoteUrl, message, options)\n if (!deps.isInitialized())\n return deps.notInitializedResult()\n return executeRemoteAgentCall(remoteUrl, message, options)\n },\n }\n}\n","/**\n * @h-ai/ai — Audio Provider 内部接口与共享传输辅助\n *\n * 定义 audio 子系统内部的协议适配接口 `AudioProvider`,以及各 Provider 复用的\n * Node WebSocket 连接、Base64、取消等底层辅助。这些类型与函数是 audio 子系统内部实现,\n * 不从 `@h-ai/ai` 根入口导出,也不作为模块消费者需要了解的概念。\n * @internal\n * @module audio/providers/ai-audio-provider\n */\n\nimport type { HaiError, HaiErrorDef, HaiResult } from '@h-ai/core'\n\nimport type { ResolvedAudioModel } from '../../ai-config.js'\nimport type {\n AudioContent,\n AudioFormat,\n AudioInputStream,\n AudioModelCapabilities,\n SynthesisResult,\n TranscriptionEvent,\n TranscriptionResult,\n} from '../ai-audio-types.js'\n\nimport { Buffer } from 'node:buffer'\nimport { core } from '@h-ai/core'\nimport WebSocket from 'ws'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\n\n// ─── Provider 请求类型(已解析模型 + 公共请求字段) ───\n\n/** Provider 层完整识别请求 */\nexport interface ProviderTranscriptionRequest {\n /** 已解析模型配置 */\n model: ResolvedAudioModel\n /** 完整音频 */\n audio: AudioContent\n /** 语言提示 */\n language?: string\n /** 领域提示词 / 热词 */\n contextHints?: string[]\n /** 取消信号 */\n signal?: AbortSignal\n}\n\n/** Provider 层流式识别请求 */\nexport interface ProviderTranscriptionStreamRequest {\n /** 已解析模型配置 */\n model: ResolvedAudioModel\n /** 完整音频或持续音频输入流 */\n audio: AudioContent | AudioInputStream\n /** 语言提示 */\n language?: string\n /** 领域提示词 / 热词 */\n contextHints?: string[]\n /** 取消信号 */\n signal?: AbortSignal\n}\n\n/** Provider 层完整合成请求 */\nexport interface ProviderSynthesisRequest {\n /** 已解析模型配置 */\n model: ResolvedAudioModel\n /** 待合成文本 */\n text: string\n /** 音色 */\n voice?: string\n /** 自然语言风格指令 */\n instruction?: string\n /** 输出格式 */\n format?: AudioFormat\n /** 输出采样率 */\n sampleRate?: number\n /** 取消信号 */\n signal?: AbortSignal\n}\n\n/** Provider 层流式合成请求 */\nexport interface ProviderSynthesisStreamRequest {\n /** 已解析模型配置 */\n model: ResolvedAudioModel\n /** 完整文本或持续文本流 */\n text: string | AsyncIterable<string>\n /** 音色 */\n voice?: string\n /** 自然语言风格指令 */\n instruction?: string\n /** 输出格式 */\n format?: AudioFormat\n /** 输出采样率 */\n sampleRate?: number\n /** 取消信号 */\n signal?: AbortSignal\n}\n\n/**\n * Provider 解析后的最终输出音频元数据\n *\n * 不同平台对未指定格式时的默认值不同(如 OpenAI 默认 mp3、Qwen/Doubao/MiMo 默认 pcm16),\n * 由各 Provider 依据自身规则解析,供流式合成在 `segment_started` 标注真实格式,\n * 避免调用方根据请求参数猜测导致解码 / 播放参数错误。\n */\nexport interface SynthesisOutputMeta {\n /** 最终输出音频格式 */\n format: AudioFormat\n /** 采样率(Hz);pcm16 等裸音频必填,wav / mp3 等自描述格式为 undefined */\n sampleRate?: number\n /** 声道数 */\n channels: 1 | 2\n}\n\n/**\n * Audio Provider 内部接口\n *\n * 每个平台一个实现,负责厂商协议转换、连接、响应解析与错误映射。\n * 使用工厂函数 + 闭包实现,不使用抽象基类。\n */\nexport interface AudioProvider {\n /** 完整语音识别 */\n transcribe: (request: ProviderTranscriptionRequest) => Promise<HaiResult<TranscriptionResult>>\n /** 流式语音识别 */\n transcribeStream: (request: ProviderTranscriptionStreamRequest) => AsyncIterable<TranscriptionEvent>\n /** 完整语音合成 */\n synthesize: (request: ProviderSynthesisRequest) => Promise<HaiResult<SynthesisResult>>\n /** 流式语音合成 */\n synthesizeStream: (request: ProviderSynthesisStreamRequest) => AsyncIterable<Uint8Array>\n /**\n * 解析该次合成请求的最终输出音频元数据(格式 / 采样率 / 声道)\n *\n * 与 `synthesizeStream` 采用一致的默认规则,供上层在 `segment_started` 标注真实格式。\n */\n resolveSynthesisOutput: (request: { format?: AudioFormat, sampleRate?: number }) => SynthesisOutputMeta\n /** 平台实时能力声明 */\n readonly capabilities: AudioModelCapabilities\n}\n\n/** 句子结束边界(中英标点 + 换行) */\nconst SENTENCE_BOUNDARY_REGEX = /[。!?;!?;\\n]|\\.(?=\\s|$)/\n\n/**\n * 将持续到达的文本流按句子边界切分,边到达边产出完整短句。\n *\n * 供不原生支持增量文本输入的 TTS 平台(OpenAI / MiMo)使用:以句子级分段逐句发起合成,\n * 实现近似实时的首音低延迟,而非等待整段文本生成完毕(消除“虚假增量”语义)。\n */\nexport async function* streamSentences(stream: AsyncIterable<string>): AsyncIterable<string> {\n let buffer = ''\n for await (const part of stream) {\n buffer += part\n let match = SENTENCE_BOUNDARY_REGEX.exec(buffer)\n while (match !== null) {\n const end = match.index + match[0].length\n const sentence = buffer.slice(0, end).trim()\n buffer = buffer.slice(end)\n if (sentence)\n yield sentence\n match = SENTENCE_BOUNDARY_REGEX.exec(buffer)\n }\n }\n const rest = buffer.trim()\n if (rest)\n yield rest\n}\n\n// ─── Base64 辅助 ───\n\n/** 将二进制数据编码为 Base64 字符串 */\nexport function toBase64(data: Uint8Array): string {\n return Buffer.from(data).toString('base64')\n}\n\n/** 将 Base64 字符串解码为二进制数据 */\nexport function fromBase64(base64: string): Uint8Array {\n return new Uint8Array(Buffer.from(base64, 'base64'))\n}\n\n/** 顺序拼接多个二进制分片 */\nexport function concatChunks(chunks: Uint8Array[]): Uint8Array {\n return new Uint8Array(Buffer.concat(chunks.map(c => Buffer.from(c))))\n}\n\n/** 提取错误对象的简要消息(不含敏感请求体 / 凭据) */\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\n/**\n * 构造可抛出的 HaiError(供流式 async generator 在迭代期间抛出)\n *\n * @internal\n */\nexport function audioError(def: HaiErrorDef, message: string, cause?: unknown): HaiError {\n return core.error.buildHaiErrorInst(def, message, cause)\n}\n\n/**\n * 依据取消原因返回统一取消/超时错误(区分主动取消与超时)\n *\n * `AbortSignal.timeout()` 触发时 `signal.reason` 是 `TimeoutError`,映射为 `AUDIO_TIMEOUT`;\n * 其余主动取消映射为 `AUDIO_CANCELLED`。\n *\n * @internal\n */\nexport function audioAbortError(signal?: AbortSignal): HaiError {\n const reason = signal?.reason as { name?: string } | undefined\n if (reason?.name === 'TimeoutError')\n return audioError(HaiAIError.AUDIO_TIMEOUT, aiM('ai_audioTimeout'))\n return audioError(HaiAIError.AUDIO_CANCELLED, aiM('ai_audioCancelled'))\n}\n\n/**\n * 将流式迭代 / 请求抛出的错误映射为统一 HaiError\n *\n * - 已是领域 HaiError(取消/超时/连接/协议等)→ 原样返回,保留错误码\n * - fetch / SDK 的 `AbortError` / `TimeoutError` → 按取消原因映射 `AUDIO_CANCELLED` / `AUDIO_TIMEOUT`\n * - 其余 → `AUDIO_UPSTREAM_ERROR`\n *\n * @internal\n */\nexport function mapStreamError(error: unknown, signal?: AbortSignal): HaiError {\n const maybe = error as { code?: unknown, name?: unknown }\n if (typeof maybe.code === 'string' && maybe.code.startsWith('hai:ai:'))\n return error as HaiError\n if (maybe.name === 'AbortError' || maybe.name === 'TimeoutError')\n return audioAbortError(signal)\n return audioError(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: errorMessage(error) } }), error)\n}\n\n/**\n * 将流式迭代抛出的错误转换为 HaiResult(供非流式 transcribe/synthesize 复用底层流)\n *\n * @internal\n */\nexport function toAudioErrorResult<T>(error: unknown, signal?: AbortSignal): HaiResult<T> {\n return { success: false, error: mapStreamError(error, signal) }\n}\n\n// ─── Node WebSocket 连接辅助 ───\n\n/** WebSocket 收到的单条消息 */\nexport interface AudioWsMessage {\n /** 文本帧的字符串内容(`isBinary=false` 时有效) */\n text?: string\n /** 二进制帧内容(`isBinary=true` 时有效) */\n binary?: Uint8Array\n /** 是否为二进制帧 */\n isBinary: boolean\n}\n\n/** WebSocket 连接封装(隐藏 ws 事件模型,向 Provider 暴露异步迭代) */\nexport interface AudioWsConnection {\n /** 发送文本或二进制帧 */\n send: (data: string | Uint8Array) => void\n /** 按到达顺序异步迭代服务端消息,连接关闭时正常结束,出错时抛出 */\n messages: () => AsyncIterableIterator<AudioWsMessage>\n /** 主动关闭连接并释放资源 */\n close: () => void\n}\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-ws' })\n\n/**\n * 建立 Node WebSocket 连接\n *\n * 内部维护消息队列,将 ws 的事件模型转换为背压友好的异步迭代。连接失败或超时返回 rejected Promise。\n * 传入的 `signal` 触发时立即关闭连接并终止迭代。\n *\n * @internal\n */\nexport function openAudioWebSocket(\n url: string,\n headers: Record<string, string>,\n options?: { signal?: AbortSignal, timeout?: number },\n): Promise<AudioWsConnection> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(url, { headers, handshakeTimeout: options?.timeout ?? 15000 })\n ws.binaryType = 'arraybuffer'\n\n // 消息队列 + 等待者:经典异步队列,实现背压友好的 for await\n const queue: AudioWsMessage[] = []\n let waiting: ((result: IteratorResult<AudioWsMessage>) => void) | null = null\n let closed = false\n let opened = false\n let aborted = false\n let failure: Error | null = null\n\n const onSignalAbort = (): void => {\n aborted = true\n try {\n ws.close()\n }\n catch { /* 忽略 */ }\n }\n\n function settleClosed(): void {\n if (closed)\n return\n closed = true\n if (options?.signal)\n options.signal.removeEventListener('abort', onSignalAbort)\n if (waiting) {\n const w = waiting\n waiting = null\n w({ value: undefined, done: true })\n }\n }\n\n function pushMessage(msg: AudioWsMessage): void {\n if (waiting) {\n const w = waiting\n waiting = null\n w({ value: msg, done: false })\n }\n else {\n queue.push(msg)\n }\n }\n\n ws.on('message', (data: ArrayBuffer | Buffer, isBinary: boolean) => {\n if (isBinary) {\n const buf = Buffer.isBuffer(data) ? data : Buffer.from(data as ArrayBuffer)\n pushMessage({ isBinary: true, binary: new Uint8Array(buf) })\n }\n else {\n const text = Buffer.isBuffer(data) ? data.toString('utf8') : Buffer.from(data as ArrayBuffer).toString('utf8')\n pushMessage({ isBinary: false, text })\n }\n })\n\n ws.on('error', (error: Error) => {\n // open 之前出错视为连接建立失败,映射为 AUDIO_CONNECTION_FAILED\n if (!opened) {\n settleClosed()\n reject(audioError(HaiAIError.AUDIO_CONNECTION_FAILED, aiM('ai_audioConnectionFailed', { params: { error: error.message } }), error))\n return\n }\n failure = error\n logger.debug('Audio WebSocket error', { error: error.message })\n settleClosed()\n })\n\n ws.on('close', () => {\n settleClosed()\n })\n\n if (options?.signal) {\n if (options.signal.aborted)\n onSignalAbort()\n else\n options.signal.addEventListener('abort', onSignalAbort, { once: true })\n }\n\n ws.on('open', () => {\n opened = true\n const connection: AudioWsConnection = {\n send(data) {\n ws.send(data)\n },\n async* messages() {\n while (true) {\n if (queue.length > 0) {\n yield queue.shift() as AudioWsMessage\n continue\n }\n if (closed) {\n if (aborted)\n throw audioAbortError(options?.signal)\n if (failure)\n throw audioError(HaiAIError.AUDIO_CONNECTION_FAILED, aiM('ai_audioConnectionFailed', { params: { error: failure.message } }), failure)\n return\n }\n const next = await new Promise<IteratorResult<AudioWsMessage>>((res) => {\n waiting = res\n })\n if (next.done) {\n if (aborted)\n throw audioAbortError(options?.signal)\n if (failure)\n throw audioError(HaiAIError.AUDIO_CONNECTION_FAILED, aiM('ai_audioConnectionFailed', { params: { error: failure.message } }), failure)\n return\n }\n yield next.value\n }\n },\n close() {\n try {\n ws.close()\n }\n catch { /* 忽略 */ }\n },\n }\n resolve(connection)\n })\n })\n}\n","/**\n * @h-ai/ai — Audio Provider: 豆包 / 火山引擎实现\n *\n * 基于火山引擎二进制 WebSocket 协议实现语音识别与语音合成。协议编解码保留在本 Provider 内部:\n * - ASR(`/api/v3/sauc/bigmodel`):4 字节头 + payload_size + payload 的序列号协议。\n * - TTS(`/api/v3/tts/bidirection`):4 字节头 + event + [session_id] + payload_size + payload 的事件协议。\n *\n * 二进制协议整数字段均为大端。公共 API 不暴露协议版本、消息类型、序列号、事件号等细节。\n * @internal\n * @module audio/providers/ai-audio-provider-doubao\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ResolvedAudioModel } from '../../ai-config.js'\n\nimport type { AudioFormat, AudioModelCapabilities, SynthesisResult, TranscriptionEvent, TranscriptionResult } from '../ai-audio-types.js'\nimport type {\n AudioProvider,\n AudioWsMessage,\n ProviderSynthesisRequest,\n ProviderSynthesisStreamRequest,\n ProviderTranscriptionRequest,\n ProviderTranscriptionStreamRequest,\n SynthesisOutputMeta,\n} from './ai-audio-provider.js'\n\nimport { Buffer } from 'node:buffer'\nimport { gunzipSync } from 'node:zlib'\nimport { core, ok } from '@h-ai/core'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { audioError, concatChunks, errorMessage, openAudioWebSocket, toAudioErrorResult } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-doubao' })\n\n/** 豆包实时平台能力:WebSocket 实时识别(不产出服务端 VAD 起止事件)+ 实时合成(支持增量文本输入) */\nconst DOUBAO_CAPABILITIES: AudioModelCapabilities = {\n transcribe: { supported: true, realtimeAudioInput: true, speechBoundaryEvents: false, streamingTranscriptOutput: true },\n synthesize: { supported: true, incrementalTextInput: true, streamingAudioOutput: true },\n}\n\n// ─── 二进制协议常量 ───\n\nconst PROTOCOL_VERSION = 0b0001\nconst HEADER_SIZE = 0b0001\n\n/** 消息类型 */\nconst MSG_FULL_CLIENT = 0b0001\nconst MSG_AUDIO_ONLY_CLIENT = 0b0010\nconst MSG_FULL_SERVER = 0b1001\nconst MSG_AUDIO_ONLY_SERVER = 0b1011\nconst MSG_SERVER_ERROR = 0b1111\n\n/** 消息类型补充标志 */\nconst FLAG_NO_SEQ = 0b0000\nconst FLAG_LAST_NO_SEQ = 0b0010\nconst FLAG_WITH_EVENT = 0b0100\n\n/** 序列化方式 */\nconst SERIAL_NONE = 0b0000\nconst SERIAL_JSON = 0b0001\n\n/** 压缩方式 */\nconst COMPRESS_NONE = 0b0000\nconst COMPRESS_GZIP = 0b0001\n\n/** TTS 事件号(火山引擎双向流式 TTS v3 协议) */\nconst EVENT_START_CONNECTION = 1\nconst EVENT_FINISH_CONNECTION = 2\nconst EVENT_CONNECTION_STARTED = 50\nconst EVENT_CONNECTION_FAILED = 51\nconst EVENT_START_SESSION = 100\nconst EVENT_FINISH_SESSION = 102\nconst EVENT_SESSION_FINISHED = 152\nconst EVENT_SESSION_FAILED = 153\nconst EVENT_TASK_REQUEST = 200\nconst EVENT_TTS_RESPONSE = 352\n\n/** 连接级事件(不携带 session_id) */\nconst CONNECTION_EVENTS = new Set<number>([\n EVENT_START_CONNECTION,\n EVENT_FINISH_CONNECTION,\n EVENT_CONNECTION_STARTED,\n EVENT_CONNECTION_FAILED,\n])\n\n/** 我方音频格式 → 火山引擎 ASR / TTS 容器格式 */\nconst DOUBAO_FORMAT: Record<AudioFormat, string> = {\n pcm16: 'pcm',\n wav: 'wav',\n mp3: 'mp3',\n opus: 'ogg_opus',\n}\n\n// ─── 二进制编解码 ───\n\n/** 构造 4 字节协议头 */\nfunction buildHeader(messageType: number, flags: number, serialization: number, compression: number): Buffer {\n return Buffer.from([\n (PROTOCOL_VERSION << 4) | HEADER_SIZE,\n (messageType << 4) | flags,\n (serialization << 4) | compression,\n 0x00,\n ])\n}\n\n/** 大端 uint32 */\nfunction uint32BE(value: number): Buffer {\n const b = Buffer.alloc(4)\n b.writeUInt32BE(value >>> 0, 0)\n return b\n}\n\n/** 大端 int32 */\nfunction int32BE(value: number): Buffer {\n const b = Buffer.alloc(4)\n b.writeInt32BE(value, 0)\n return b\n}\n\n/** 编码 ASR full client request(4B 头 + payload_size + JSON payload) */\nfunction encodeAsrConfig(config: object): Uint8Array {\n const payload = Buffer.from(JSON.stringify(config), 'utf8')\n return new Uint8Array(Buffer.concat([\n buildHeader(MSG_FULL_CLIENT, FLAG_NO_SEQ, SERIAL_JSON, COMPRESS_NONE),\n uint32BE(payload.length),\n payload,\n ]))\n}\n\n/** 编码 ASR audio only request(4B 头 + payload_size + 原始音频;`last` 标记最后一包) */\nfunction encodeAsrAudio(audio: Uint8Array, last: boolean): Uint8Array {\n return new Uint8Array(Buffer.concat([\n buildHeader(MSG_AUDIO_ONLY_CLIENT, last ? FLAG_LAST_NO_SEQ : FLAG_NO_SEQ, SERIAL_NONE, COMPRESS_NONE),\n uint32BE(audio.length),\n Buffer.from(audio),\n ]))\n}\n\n/** 编码 TTS 事件帧(4B 头 + event + [session_id] + payload_size + JSON payload) */\nfunction encodeTtsEvent(event: number, payload: object, sessionId?: string): Uint8Array {\n const parts: Buffer[] = [\n buildHeader(MSG_FULL_CLIENT, FLAG_WITH_EVENT, SERIAL_JSON, COMPRESS_NONE),\n int32BE(event),\n ]\n if (!CONNECTION_EVENTS.has(event) && sessionId !== undefined) {\n const sid = Buffer.from(sessionId, 'utf8')\n parts.push(uint32BE(sid.length), sid)\n }\n const body = Buffer.from(JSON.stringify(payload), 'utf8')\n parts.push(uint32BE(body.length), body)\n return new Uint8Array(Buffer.concat(parts))\n}\n\n/** 解析后的服务端帧 */\ninterface DecodedFrame {\n messageType: number\n /** 事件号(TTS 协议有效) */\n event?: number\n /** 序列号(ASR 协议有效,负值表示最后一包) */\n sequence?: number\n /** JSON 负载(消息为 JSON 序列化时) */\n json?: Record<string, unknown>\n /** 原始二进制负载(音频帧) */\n audio?: Uint8Array\n /** 错误码(错误帧有效) */\n errorCode?: number\n /** 错误消息(错误帧有效) */\n errorMessage?: string\n}\n\n/** 解压 payload(依据 compression 位) */\nfunction maybeGunzip(payload: Buffer, compression: number): Buffer {\n return compression === COMPRESS_GZIP ? gunzipSync(payload) : payload\n}\n\n/** 解析服务端二进制帧 */\nfunction decodeFrame(data: Uint8Array): DecodedFrame {\n const buf = Buffer.from(data)\n const messageType = (buf[1] >> 4) & 0x0F\n const flags = buf[1] & 0x0F\n const serialization = (buf[2] >> 4) & 0x0F\n const compression = buf[2] & 0x0F\n let offset = 4\n\n if (messageType === MSG_SERVER_ERROR) {\n const errorCode = buf.readUInt32BE(offset)\n offset += 4\n const size = buf.readUInt32BE(offset)\n offset += 4\n const msg = maybeGunzip(buf.subarray(offset, offset + size), compression).toString('utf8')\n return { messageType, errorCode, errorMessage: msg }\n }\n\n let event: number | undefined\n if (flags & FLAG_WITH_EVENT) {\n event = buf.readInt32BE(offset)\n offset += 4\n // 会话级事件携带 session_id\n if (event !== undefined && !CONNECTION_EVENTS.has(event)) {\n const sidSize = buf.readUInt32BE(offset)\n offset += 4 + sidSize\n }\n }\n\n let sequence: number | undefined\n if (!(flags & FLAG_WITH_EVENT) && messageType === MSG_FULL_SERVER) {\n // ASR 服务端响应携带 sequence(4B 有符号,负值表示最后一包)\n sequence = buf.readInt32BE(offset)\n offset += 4\n }\n\n const size = buf.readUInt32BE(offset)\n offset += 4\n const payload = buf.subarray(offset, offset + size)\n\n if (messageType === MSG_AUDIO_ONLY_SERVER)\n return { messageType, event, audio: new Uint8Array(payload) }\n\n const decompressed = maybeGunzip(payload, compression)\n if (serialization === SERIAL_JSON) {\n try {\n return { messageType, event, sequence, json: JSON.parse(decompressed.toString('utf8')) as Record<string, unknown> }\n }\n catch {\n return { messageType, event, sequence }\n }\n }\n return { messageType, event, sequence, audio: new Uint8Array(decompressed) }\n}\n\n// ─── Provider 实现 ───\n\n/**\n * 创建豆包 / 火山引擎 Audio Provider\n *\n * @internal\n */\nexport function createDoubaoAudioProvider(): AudioProvider {\n function buildAuthHeaders(model: ResolvedAudioModel, isTts: boolean): Record<string, string> {\n const headers: Record<string, string> = {\n 'X-Api-Resource-Id': model.resourceId,\n 'X-Api-Connect-Id': globalThis.crypto.randomUUID(),\n }\n if (model.apiKey)\n headers['X-Api-Key'] = model.apiKey\n // 旧版控制台 ASR 使用 App-Key + Access-Key\n if (!isTts && model.appKey && model.accessKey) {\n headers['X-Api-App-Key'] = model.appKey\n headers['X-Api-Access-Key'] = model.accessKey\n }\n headers['X-Api-Request-Id'] = globalThis.crypto.randomUUID()\n return headers\n }\n\n // ─── ASR ───\n\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n try {\n let finalText = ''\n for await (const event of transcribeStream({ model: request.model, audio: request.audio, language: request.language, contextHints: request.contextHints, signal: request.signal })) {\n if (event.type === 'transcript' && event.final)\n finalText = event.text\n }\n return ok({ text: finalText })\n }\n catch (error) {\n logger.debug('Doubao transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error)\n }\n }\n\n async function* transcribeStream(request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const { model, audio, language, contextHints, signal } = request\n const url = `${model.baseUrl}/api/v3/sauc/bigmodel`\n const conn = await openAudioWebSocket(url, buildAuthHeaders(model, false), { signal, timeout: model.timeout })\n try {\n const sampleRate = audio.sampleRate ?? 16000\n const channels = audio.channels ?? 1\n conn.send(encodeAsrConfig({\n user: { uid: 'hai' },\n audio: {\n format: DOUBAO_FORMAT[audio.format],\n rate: sampleRate,\n bits: 16,\n channel: channels,\n ...(language ? { language } : {}),\n },\n request: {\n model_name: 'bigmodel',\n enable_itn: true,\n enable_punc: true,\n result_type: 'full',\n // 领域提示词 → 热词(直传 context)\n ...(contextHints?.length ? { context: JSON.stringify({ hotwords: contextHints.map(word => ({ word })) }) } : {}),\n },\n }))\n\n const sendAudio = (async () => {\n if ('chunks' in audio) {\n // 持续输入:一包前瞻,末包打 last 标记\n let prev: Uint8Array | undefined\n for await (const part of audio.chunks) {\n if (prev !== undefined)\n conn.send(encodeAsrAudio(prev, false))\n prev = part\n }\n conn.send(encodeAsrAudio(prev ?? new Uint8Array(0), true))\n }\n else {\n conn.send(encodeAsrAudio(audio.data, true))\n }\n })()\n let sendError: unknown\n sendAudio.catch((e: unknown) => {\n sendError = e\n })\n\n for await (const message of conn.messages()) {\n if (!message.isBinary || !message.binary)\n continue\n const frame = decodeFrame(message.binary)\n if (frame.messageType === MSG_SERVER_ERROR)\n throw audioError(HaiAIError.AUDIO_PROTOCOL_ERROR, aiM('ai_audioProtocolError', { params: { error: `${frame.errorCode} ${frame.errorMessage ?? ''}`.trim() } }))\n\n const text = extractAsrText(frame.json)\n const isLast = frame.sequence !== undefined && frame.sequence < 0\n if (text !== undefined)\n yield { type: 'transcript', text, final: isLast }\n if (isLast) {\n if (sendError)\n throw sendError\n return\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n // ─── TTS ───\n\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const out = resolveSynthesisOutput({ format: request.format, sampleRate: request.sampleRate })\n try {\n const chunks: Uint8Array[] = []\n for await (const audio of synthesizeStream({ model: request.model, text: request.text, voice: request.voice, format: out.format, sampleRate: request.sampleRate, signal: request.signal }))\n chunks.push(audio)\n return ok({ data: concatChunks(chunks), format: out.format, sampleRate: out.sampleRate, channels: out.channels })\n }\n catch (error) {\n logger.debug('Doubao synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error)\n }\n }\n\n async function* synthesizeStream(request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n const { model, text, voice, format, sampleRate, signal } = request\n const outFormat = resolveSynthesisOutput({ format }).format\n const url = `${model.baseUrl}/api/v3/tts/bidirection`\n const conn = await openAudioWebSocket(url, buildAuthHeaders(model, true), { signal, timeout: model.timeout })\n const sessionId = globalThis.crypto.randomUUID()\n\n const reqParams = {\n speaker: voice ?? '',\n audio_params: { format: DOUBAO_FORMAT[outFormat], sample_rate: sampleRate ?? 24000 },\n }\n\n try {\n conn.send(encodeTtsEvent(EVENT_START_CONNECTION, {}))\n conn.send(encodeTtsEvent(EVENT_START_SESSION, { event: EVENT_START_SESSION, req_params: reqParams }, sessionId))\n\n const sendText = (async () => {\n if (typeof text === 'string') {\n conn.send(encodeTtsEvent(EVENT_TASK_REQUEST, { event: EVENT_TASK_REQUEST, req_params: { ...reqParams, text } }, sessionId))\n }\n else {\n for await (const part of text)\n conn.send(encodeTtsEvent(EVENT_TASK_REQUEST, { event: EVENT_TASK_REQUEST, req_params: { ...reqParams, text: part } }, sessionId))\n }\n conn.send(encodeTtsEvent(EVENT_FINISH_SESSION, { event: EVENT_FINISH_SESSION }, sessionId))\n conn.send(encodeTtsEvent(EVENT_FINISH_CONNECTION, { event: EVENT_FINISH_CONNECTION }))\n })()\n let sendError: unknown\n sendText.catch((e: unknown) => {\n sendError = e\n })\n\n for await (const message of conn.messages()) {\n const frame = decodeBinaryMessage(message)\n if (!frame)\n continue\n if (frame.messageType === MSG_SERVER_ERROR || frame.event === EVENT_SESSION_FAILED || frame.event === EVENT_CONNECTION_FAILED)\n throw audioError(HaiAIError.AUDIO_PROTOCOL_ERROR, aiM('ai_audioProtocolError', { params: { error: `${frame.errorCode ?? frame.event} ${frame.errorMessage ?? ''}`.trim() } }))\n\n if (frame.event === EVENT_TTS_RESPONSE && frame.audio) {\n yield frame.audio\n }\n else if (frame.event === EVENT_SESSION_FINISHED) {\n if (sendError)\n throw sendError\n return\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream, resolveSynthesisOutput, capabilities: DOUBAO_CAPABILITIES }\n}\n\n/** 豆包未指定格式时默认 pcm16;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format: AudioFormat = request.format ?? 'pcm16'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n// ─── 内部辅助 ───\n\n/** 从 ASR 响应 JSON 提取识别文本(`result.text`) */\nfunction extractAsrText(json: Record<string, unknown> | undefined): string | undefined {\n if (!json)\n return undefined\n const result = json.result as { text?: string } | undefined\n return result?.text\n}\n\n/** 将 WebSocket 消息解析为二进制帧(非二进制返回 undefined) */\nfunction decodeBinaryMessage(message: AudioWsMessage): DecodedFrame | undefined {\n if (!message.isBinary || !message.binary)\n return undefined\n return decodeFrame(message.binary)\n}\n","/**\n * @h-ai/ai — LLM 流式响应处理\n *\n * 提供流处理器、SSE 编解码等纯函数工具。\n * @module ai-llm-stream\n */\n\nimport type {\n AssistantMessage,\n ChatCompletionChunk,\n ChatCompletionDelta,\n SSEDecoder,\n SSEEvent,\n StreamProcessor,\n StreamResult,\n} from './ai-llm-types.js'\n\n// ─── 流处理器 ───\n\n/**\n * 创建流处理器,逐块累积流式响应的文本内容和工具调用\n *\n * @returns 流处理器实例\n *\n * @example\n * ```ts\n * const processor = createStreamProcessor()\n * for await (const chunk of stream) {\n * processor.process(chunk)\n * }\n * const result = processor.getResult() // { content, toolCalls, finishReason }\n * ```\n */\nexport function createStreamProcessor(): StreamProcessor {\n /** 累积文本内容 */\n let content = ''\n /** 累积 reasoning 内容 */\n let reasoningContent = ''\n /** 按索引累积工具调用片段(流式中可能跨多个 chunk) */\n let toolCalls: Map<number, { id: string, name: string, arguments: string }> = new Map()\n /** 完成原因(`'stop'` | `'tool_calls'` 等) */\n let finishReason: string | null = null\n\n return {\n /** 处理单个 chunk,累积内容/工具调用/完成原因 */\n process(chunk: ChatCompletionChunk): ChatCompletionDelta | null {\n const choice = chunk.choices[0]\n if (!choice)\n return null\n\n const delta = choice.delta\n\n if (delta.content) {\n content += delta.content\n }\n\n const reasoningDelta = 'reasoning_content' in delta && typeof delta.reasoning_content === 'string'\n ? delta.reasoning_content\n : ''\n if (reasoningDelta) {\n reasoningContent += reasoningDelta\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const existing = toolCalls.get(tc.index)\n if (existing) {\n if (tc.function?.name) {\n existing.name += tc.function.name\n }\n if (tc.function?.arguments) {\n existing.arguments += tc.function.arguments\n }\n }\n else if (tc.id) {\n toolCalls.set(tc.index, {\n id: tc.id,\n name: tc.function?.name || '',\n arguments: tc.function?.arguments || '',\n })\n }\n }\n }\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason\n }\n\n return delta\n },\n\n /** 获取当前累积结果快照 */\n getResult(): StreamResult {\n return {\n content,\n reasoningContent,\n toolCalls: Array.from(toolCalls.values()).map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.name,\n arguments: tc.arguments,\n },\n })),\n finishReason,\n }\n },\n\n /** 将累积结果转为 AssistantMessage(含工具调用时 content 为 `null`) */\n toAssistantMessage(): AssistantMessage {\n const result = this.getResult()\n const message: AssistantMessage = {\n role: 'assistant',\n content: result.toolCalls.length > 0 ? null : result.content,\n }\n if (result.reasoningContent) {\n message.reasoning_content = result.reasoningContent\n }\n if (result.toolCalls.length > 0) {\n message.tool_calls = result.toolCalls\n }\n return message\n },\n\n /** 重置所有状态,可复用处理器处理下一次流 */\n reset(): void {\n content = ''\n reasoningContent = ''\n toolCalls = new Map()\n finishReason = null\n },\n }\n}\n\n// ─── 收集完整流 ───\n\n/**\n * 完整消费流式响应并返回累积结果\n *\n * @param stream - 流式响应迭代器\n * @returns 完整的流处理结果\n *\n * @example\n * ```ts\n * const result = await collectStream(ai.llm.chatStream({ messages }))\n * core.logger.info({ content: result.content, finishReason: result.finishReason })\n * ```\n */\nexport async function collectStream(\n stream: AsyncIterable<ChatCompletionChunk>,\n): Promise<StreamResult> {\n const processor = createStreamProcessor()\n for await (const chunk of stream) {\n processor.process(chunk)\n }\n return processor.getResult()\n}\n\n// ─── SSE 编解码 ───\n\n/**\n * 创建 SSE 解码器,内部维护缓冲区,支持跨分片拼接\n *\n * 按 SSE 规范解析 `event:`、`data:`、`id:`、`retry:` 字段,\n * 多行 `data:` 自动用换行符拼接。\n *\n * @returns SSE 解码器实例\n *\n * @example\n * ```ts\n * const decoder = createSSEDecoder()\n * for (const event of decoder.decode(rawText)) {\n * core.logger.info({ data: event.data }) // SSE data 内容\n * }\n * ```\n */\nexport function createSSEDecoder(): SSEDecoder {\n let buffer = ''\n\n return {\n * decode(text: string): Iterable<SSEEvent> {\n buffer += text\n\n const parts = buffer.split('\\n\\n')\n buffer = parts.pop() || ''\n\n for (const part of parts) {\n if (!part.trim())\n continue\n\n const event: SSEEvent = {}\n const lines = part.split('\\n')\n const dataLines: string[] = []\n\n for (const line of lines) {\n if (line.startsWith('event:')) {\n event.event = line.slice(6).trim()\n }\n else if (line.startsWith('id:')) {\n event.id = line.slice(3).trim()\n }\n else if (line.startsWith('retry:')) {\n event.retry = Number.parseInt(line.slice(6).trim(), 10)\n }\n else if (line.startsWith('data:')) {\n dataLines.push(line.slice(5).trim())\n }\n else if (line.startsWith('data ')) {\n dataLines.push(line.slice(5))\n }\n }\n\n if (dataLines.length > 0) {\n event.data = dataLines.join('\\n')\n }\n\n yield event\n }\n },\n\n reset(): void {\n buffer = ''\n },\n }\n}\n\n/**\n * 将 SSE 事件编码为符合规范的文本格式\n *\n * 输出以双换行 `\\n\\n` 结尾,可直接写入 HTTP 响应流。\n *\n * @param event - SSE 事件\n * @returns 编码后的文本(以 `\\n\\n` 结尾)\n *\n * @example\n * ```ts\n * const text = encodeSSE({ event: 'message', data: '{\"content\":\"hi\"}' })\n * // => 'event: message\\ndata: {\"content\":\"hi\"}\\n\\n'\n * ```\n */\nexport function encodeSSE(event: SSEEvent): string {\n const lines: string[] = []\n if (event.event) {\n lines.push(`event: ${event.event}`)\n }\n if (event.id) {\n lines.push(`id: ${event.id}`)\n }\n if (event.retry !== undefined) {\n lines.push(`retry: ${event.retry}`)\n }\n if (event.data !== undefined) {\n const dataLines = event.data.split('\\n')\n for (const line of dataLines) {\n lines.push(`data: ${line}`)\n }\n }\n return `${lines.join('\\n')}\\n\\n`\n}\n","/**\n * @h-ai/ai — Audio Provider: MiMo(小米)实现\n *\n * 基于 MiMo 兼容 Chat Completions 的 HTTP 接口实现语音识别与语音合成:\n * - ASR(`mimo-v2.5-asr`):完整音频以 `input_audio` 传入,`stream` 时增量返回识别文本。\n * MiMo ASR 不支持持续上传音频,故 `transcribeStream` 传入 `AudioInputStream` 时明确返回不支持。\n * - TTS(`mimo-v2.5-tts`):合成文本放入 `assistant` 消息,`stream` 时以 Base64 分片返回 PCM 音频。\n * @internal\n * @module audio/providers/ai-audio-provider-mimo\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AudioContent, AudioFormat, AudioModelCapabilities, SynthesisResult, TranscriptionEvent, TranscriptionResult } from '../ai-audio-types.js'\nimport type {\n AudioProvider,\n ProviderSynthesisRequest,\n ProviderSynthesisStreamRequest,\n ProviderTranscriptionRequest,\n ProviderTranscriptionStreamRequest,\n SynthesisOutputMeta,\n} from './ai-audio-provider.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { createSSEDecoder } from '../../llm/ai-llm-stream.js'\nimport { audioError, errorMessage, fromBase64, streamSentences, toAudioErrorResult, toBase64 } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-mimo' })\n\n/** MiMo 平台能力:HTTP 识别(非持续音频输入,流式返回文本)+ HTTP 流式合成(不接收增量文本,框架内句子分段) */\nconst MIMO_CAPABILITIES: AudioModelCapabilities = {\n transcribe: { supported: true, realtimeAudioInput: false, speechBoundaryEvents: false, streamingTranscriptOutput: true },\n synthesize: { supported: true, incrementalTextInput: false, streamingAudioOutput: true },\n}\n\n/** MiMo ASR 支持的音频容器 → MIME 类型 */\nconst MIMO_ASR_MIME: Partial<Record<AudioFormat, string>> = {\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n}\n\n/** MiMo 流式响应中的增量结构 */\ninterface MimoDelta {\n content?: string\n audio?: { data?: string }\n}\n\n/** MiMo Chat Completions 响应/流块结构(仅取本模块关心的字段) */\ninterface MimoChunk {\n choices?: Array<{\n delta?: MimoDelta\n message?: { content?: string, audio?: { data?: string } }\n }>\n}\n\n/**\n * 创建 MiMo Audio Provider\n *\n * @internal\n */\nexport function createMimoAudioProvider(): AudioProvider {\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n const { model, audio, language, signal } = request\n const mime = MIMO_ASR_MIME[audio.format]\n if (!mime)\n return err(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: 'mimo', reason: `format ${audio.format} (only wav/mp3)` } }))\n\n try {\n const response = await postChat(model.baseUrl, model.apiKey, {\n model: model.model,\n messages: [{ role: 'user', content: [{ type: 'input_audio', input_audio: { data: `data:${mime};base64,${toBase64(audio.data)}` } }] }],\n asr_options: { language: language ?? 'auto' },\n }, model.timeout, signal)\n if (!response.ok)\n return err(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n const body = await response.json() as MimoChunk\n const text = body.choices?.[0]?.message?.content ?? ''\n return ok({ text })\n }\n catch (error) {\n logger.debug('MiMo transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, signal)\n }\n }\n\n async function* transcribeStream(request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const { model, audio, language, signal } = request\n if ('chunks' in audio) {\n throw audioError(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: 'mimo', reason: 'streaming audio input' } }))\n }\n const content = audio as AudioContent\n const mime = MIMO_ASR_MIME[content.format]\n if (!mime)\n throw audioError(HaiAIError.AUDIO_UNSUPPORTED_INPUT, aiM('ai_audioUnsupportedInput', { params: { provider: 'mimo', reason: `format ${content.format} (only wav/mp3)` } }))\n\n const response = await postChat(model.baseUrl, model.apiKey, {\n model: model.model,\n messages: [{ role: 'user', content: [{ type: 'input_audio', input_audio: { data: `data:${mime};base64,${toBase64(content.data)}` } }] }],\n asr_options: { language: language ?? 'auto' },\n stream: true,\n }, model.timeout, signal)\n if (!response.ok)\n throw audioError(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n let text = ''\n for await (const chunk of readChunks(response)) {\n const delta = chunk.choices?.[0]?.delta?.content\n if (delta) {\n text += delta\n yield { type: 'transcript', text, final: false }\n }\n }\n yield { type: 'transcript', text, final: true }\n }\n\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const { model, text, voice, instruction, format, sampleRate, signal } = request\n // 与 synthesizeStream 共用同一解析函数,确保完整与流式合成对同一 format 得到一致编码\n const out = resolveSynthesisOutput({ format, sampleRate })\n try {\n const response = await postChat(model.baseUrl, model.apiKey, {\n model: model.model,\n messages: buildTtsMessages(text, instruction),\n audio: { format: out.format, ...(voice ? { voice } : {}) },\n }, model.timeout, signal)\n if (!response.ok)\n return err(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n const body = await response.json() as MimoChunk\n const base64 = body.choices?.[0]?.message?.audio?.data\n if (!base64)\n return err(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: 'missing audio data' } }))\n\n return ok({ data: fromBase64(base64), format: out.format, sampleRate: out.sampleRate, channels: out.channels })\n }\n catch (error) {\n logger.debug('MiMo synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, signal)\n }\n }\n\n async function* synthesizeStream(request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n const { model, text, voice, instruction, format, signal } = request\n const outFormat = resolveSynthesisOutput({ format }).format\n\n // MiMo TTS 不原生接收增量文本:字符串一次合成;持续文本流按句子分段逐句合成,降低首音延迟\n const segments = typeof text === 'string' ? [text] : streamSentences(text)\n for await (const segment of segments) {\n if (!segment)\n continue\n const response = await postChat(model.baseUrl, model.apiKey, {\n model: model.model,\n messages: buildTtsMessages(segment, instruction),\n audio: { format: outFormat, ...(voice ? { voice } : {}) },\n stream: true,\n }, model.timeout, signal)\n if (!response.ok)\n throw audioError(HaiAIError.AUDIO_UPSTREAM_ERROR, aiM('ai_audioUpstreamError', { params: { error: await describeHttpError(response) } }))\n\n for await (const chunk of readChunks(response)) {\n const base64 = chunk.choices?.[0]?.delta?.audio?.data\n if (base64)\n yield fromBase64(base64)\n }\n }\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream, resolveSynthesisOutput, capabilities: MIMO_CAPABILITIES }\n}\n\n/** MiMo 流式合成除 wav 外均输出 pcm16;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format: AudioFormat = request.format === 'wav' ? 'wav' : 'pcm16'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n// ─── 内部辅助 ───\n\n/** 构造 MiMo TTS 消息:风格指令放入 user 消息,待合成文本放入 assistant 消息 */\nfunction buildTtsMessages(text: string, instruction?: string): Array<{ role: string, content: string }> {\n const messages: Array<{ role: string, content: string }> = []\n if (instruction)\n messages.push({ role: 'user', content: instruction })\n messages.push({ role: 'assistant', content: text })\n return messages\n}\n\n/** 发送 Chat Completions 请求(Authorization Bearer) */\nfunction postChat(baseUrl: string, apiKey: string | undefined, body: Record<string, unknown>, timeout: number, signal?: AbortSignal): Promise<Response> {\n const url = `${baseUrl.replace(/\\/$/, '')}/chat/completions`\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (apiKey)\n headers.Authorization = `Bearer ${apiKey}`\n return fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: combineSignal(signal, timeout),\n })\n}\n\n/** 迭代 SSE 响应,逐个产出解析后的 MiMo 数据块(`[DONE]` 结束) */\nasync function* readChunks(response: Response): AsyncIterable<MimoChunk> {\n const body = response.body\n if (!body)\n return\n const reader = body.getReader()\n const decoder = new TextDecoder()\n const sse = createSSEDecoder()\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n const text = decoder.decode(value, { stream: true })\n for (const event of sse.decode(text)) {\n if (!event.data || event.data === '[DONE]')\n continue\n try {\n yield JSON.parse(event.data) as MimoChunk\n }\n catch {\n // 忽略无法解析的心跳/空行\n }\n }\n }\n }\n finally {\n reader.releaseLock()\n }\n}\n\n/** 组合取消信号与超时(不泄露原信号) */\nfunction combineSignal(signal: AbortSignal | undefined, timeout: number): AbortSignal {\n const timeoutSignal = AbortSignal.timeout(timeout)\n return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal\n}\n\n/** 读取 HTTP 错误响应摘要(截断,避免泄露过长响应体) */\nasync function describeHttpError(response: Response): Promise<string> {\n const text = await response.text().catch(() => '')\n return `HTTP ${response.status} ${text.slice(0, 200)}`.trim()\n}\n","/**\n * @h-ai/ai — Audio Provider: OpenAI 实现\n *\n * 基于 OpenAI Audio API(transcriptions / speech)实现完整与流式的语音识别、语音合成。\n * OpenAI 标准 Audio API 不支持持续音频输入的实时识别,故 `transcribeStream` 传入\n * `AudioInputStream` 时明确返回不支持,不将整段音频缓冲后伪装为实时识别。\n * @internal\n * @module audio/providers/ai-audio-provider-openai\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AudioContent, AudioFormat, AudioModelCapabilities, SynthesisResult, TranscriptionEvent, TranscriptionResult } from '../ai-audio-types.js'\nimport type {\n AudioProvider,\n ProviderSynthesisRequest,\n ProviderSynthesisStreamRequest,\n ProviderTranscriptionRequest,\n ProviderTranscriptionStreamRequest,\n SynthesisOutputMeta,\n} from './ai-audio-provider.js'\n\nimport { Buffer } from 'node:buffer'\nimport { core, err, ok } from '@h-ai/core'\nimport OpenAI, { toFile } from 'openai'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { audioError, errorMessage, streamSentences, toAudioErrorResult } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-openai' })\n\n/** OpenAI 平台能力:HTTP 文件识别(非实时)+ HTTP 流式合成(不原生接收增量文本,框架内句子分段) */\nconst OPENAI_CAPABILITIES: AudioModelCapabilities = {\n transcribe: { supported: true, realtimeAudioInput: false, speechBoundaryEvents: false, streamingTranscriptOutput: false },\n synthesize: { supported: true, incrementalTextInput: false, streamingAudioOutput: true },\n}\n\n/** 我方音频格式 → OpenAI speech response_format */\nconst OPENAI_SPEECH_FORMAT: Record<AudioFormat, 'pcm' | 'wav' | 'mp3' | 'opus'> = {\n pcm16: 'pcm',\n wav: 'wav',\n mp3: 'mp3',\n opus: 'opus',\n}\n\n/** 我方音频格式 → 上传文件名(transcriptions 依据扩展名识别容器) */\nconst OPENAI_UPLOAD_FILENAME: Record<AudioFormat, string> = {\n pcm16: 'audio.wav',\n wav: 'audio.wav',\n mp3: 'audio.mp3',\n opus: 'audio.ogg',\n}\n\n/**\n * 创建 OpenAI Audio Provider\n *\n * @internal\n */\nexport function createOpenAIAudioProvider(): AudioProvider {\n function createClient(apiKey: string, baseUrl: string, timeout: number): OpenAI {\n return new OpenAI({ apiKey, baseURL: baseUrl, timeout })\n }\n\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n const { model, audio, language, contextHints, signal } = request\n if (!model.apiKey)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_audioMissingApiKey', { params: { provider: 'openai' } }))\n\n try {\n const client = createClient(model.apiKey, model.baseUrl, model.timeout)\n const file = await toUploadFile(audio)\n const result = await client.audio.transcriptions.create({\n file,\n model: model.model,\n language,\n ...(contextHints?.length ? { prompt: contextHints.join(', ') } : {}),\n }, { signal })\n return ok({ text: result.text })\n }\n catch (error) {\n logger.debug('OpenAI transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, signal)\n }\n }\n\n async function* transcribeStream(request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const { model, audio, language, contextHints, signal } = request\n if (!model.apiKey)\n throw audioError(HaiAIError.CONFIGURATION_ERROR, aiM('ai_audioMissingApiKey', { params: { provider: 'openai' } }))\n\n // OpenAI 标准 Audio API 仅支持完整音频文件,不支持持续音频输入的实时识别\n if ('chunks' in audio) {\n throw audioError(\n HaiAIError.AUDIO_UNSUPPORTED_INPUT,\n aiM('ai_audioUnsupportedInput', { params: { provider: 'openai', reason: 'streaming audio input' } }),\n )\n }\n\n const client = createClient(model.apiKey, model.baseUrl, model.timeout)\n const file = await toUploadFile(audio)\n const stream = await client.audio.transcriptions.create({\n file,\n model: model.model,\n language,\n stream: true,\n ...(contextHints?.length ? { prompt: contextHints.join(', ') } : {}),\n }, { signal })\n\n let text = ''\n for await (const event of stream) {\n if (event.type === 'transcript.text.delta') {\n text += event.delta\n yield { type: 'transcript', text, final: false }\n }\n else if (event.type === 'transcript.text.done') {\n yield { type: 'transcript', text: event.text, final: true }\n }\n }\n }\n\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const { model, text, voice, instruction, format, sampleRate, signal } = request\n if (!model.apiKey)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_audioMissingApiKey', { params: { provider: 'openai' } }))\n\n const out = resolveSynthesisOutput({ format, sampleRate })\n try {\n const client = createClient(model.apiKey, model.baseUrl, model.timeout)\n const response = await client.audio.speech.create({\n model: model.model,\n voice: voice ?? 'alloy',\n input: text,\n response_format: OPENAI_SPEECH_FORMAT[out.format],\n ...(instruction ? { instructions: instruction } : {}),\n }, { signal })\n const data = new Uint8Array(await response.arrayBuffer())\n return ok({ data, format: out.format, sampleRate: out.sampleRate, channels: out.channels })\n }\n catch (error) {\n logger.debug('OpenAI synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error, signal)\n }\n }\n\n async function* synthesizeStream(request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n const { model, text, voice, instruction, format, signal } = request\n if (!model.apiKey)\n throw audioError(HaiAIError.CONFIGURATION_ERROR, aiM('ai_audioMissingApiKey', { params: { provider: 'openai' } }))\n\n const outFormat = resolveSynthesisOutput({ format }).format\n const client = createClient(model.apiKey, model.baseUrl, model.timeout)\n\n // OpenAI TTS 不原生接收增量文本:字符串一次合成;持续文本流按句子分段逐句合成,降低首音延迟\n const segments = typeof text === 'string' ? [text] : streamSentences(text)\n for await (const segment of segments) {\n if (!segment)\n continue\n const response = await client.audio.speech.create({\n model: model.model,\n voice: voice ?? 'alloy',\n input: segment,\n response_format: OPENAI_SPEECH_FORMAT[outFormat],\n ...(instruction ? { instructions: instruction } : {}),\n }, { signal })\n\n const body = response.body\n if (!body) {\n yield new Uint8Array(await response.arrayBuffer())\n continue\n }\n const reader = body.getReader()\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n if (value)\n yield value\n }\n }\n finally {\n reader.releaseLock()\n }\n }\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream, resolveSynthesisOutput, capabilities: OPENAI_CAPABILITIES }\n}\n\n/** OpenAI 未指定格式时默认 mp3;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format = request.format ?? 'mp3'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n/** 构造上传文件:裸 pcm16 先封装为 WAV 容器(OpenAI 文件接口需要容器格式) */\nasync function toUploadFile(audio: AudioContent): Promise<Awaited<ReturnType<typeof toFile>>> {\n if (audio.format === 'pcm16') {\n const wav = wrapPcmToWav(audio.data, audio.sampleRate ?? 16000, audio.channels ?? 1)\n return toFile(Buffer.from(wav), 'audio.wav')\n }\n return toFile(Buffer.from(audio.data), OPENAI_UPLOAD_FILENAME[audio.format])\n}\n\n/** 将 16bit 小端裸 PCM 封装为 WAV 容器(44 字节头 + 数据) */\nfunction wrapPcmToWav(pcm: Uint8Array, sampleRate: number, channels: number): Uint8Array {\n const bitsPerSample = 16\n const byteRate = (sampleRate * channels * bitsPerSample) / 8\n const blockAlign = (channels * bitsPerSample) / 8\n const dataSize = pcm.length\n const buffer = Buffer.alloc(44 + dataSize)\n buffer.write('RIFF', 0)\n buffer.writeUInt32LE(36 + dataSize, 4)\n buffer.write('WAVE', 8)\n buffer.write('fmt ', 12)\n buffer.writeUInt32LE(16, 16)\n buffer.writeUInt16LE(1, 20)\n buffer.writeUInt16LE(channels, 22)\n buffer.writeUInt32LE(sampleRate, 24)\n buffer.writeUInt32LE(byteRate, 28)\n buffer.writeUInt16LE(blockAlign, 32)\n buffer.writeUInt16LE(bitsPerSample, 34)\n buffer.write('data', 36)\n buffer.writeUInt32LE(dataSize, 40)\n Buffer.from(pcm).copy(buffer, 44)\n return new Uint8Array(buffer)\n}\n","/**\n * @h-ai/ai — Audio Provider: Qwen(阿里云百炼)实现\n *\n * 基于 DashScope Realtime WebSocket 协议实现实时语音识别与语音合成。\n * Provider 内部负责 Session、Buffer、Commit 等协议事件,公共 API 不暴露这些概念:\n * - ASR(`qwen3-asr-flash-realtime`):完整音频用 Manual 模式,持续音频输入用 VAD 模式。\n * - TTS(`qwen3-tts-flash-realtime`):完整文本用 Commit 模式,持续文本输入用 ServerCommit 模式。\n * @internal\n * @module audio/providers/ai-audio-provider-qwen\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ResolvedAudioModel } from '../../ai-config.js'\n\nimport type { AudioFormat, AudioModelCapabilities, SynthesisResult, TranscriptionEvent, TranscriptionResult } from '../ai-audio-types.js'\nimport type {\n AudioProvider,\n AudioWsConnection,\n ProviderSynthesisRequest,\n ProviderSynthesisStreamRequest,\n ProviderTranscriptionRequest,\n ProviderTranscriptionStreamRequest,\n SynthesisOutputMeta,\n} from './ai-audio-provider.js'\n\nimport { core, ok } from '@h-ai/core'\nimport { nanoid } from 'nanoid'\nimport { concatChunks, errorMessage, fromBase64, openAudioWebSocket, toAudioErrorResult, toBase64 } from './ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio-qwen' })\n\n/** Qwen 实时平台能力:WebSocket 实时识别(含服务端 VAD)+ 实时合成(支持增量文本输入) */\nconst QWEN_CAPABILITIES: AudioModelCapabilities = {\n transcribe: { supported: true, realtimeAudioInput: true, speechBoundaryEvents: true, streamingTranscriptOutput: true },\n synthesize: { supported: true, incrementalTextInput: true, streamingAudioOutput: true },\n}\n\n/** 我方音频格式 → Qwen input_audio_format / response_format */\nconst QWEN_FORMAT: Record<AudioFormat, string> = {\n pcm16: 'pcm',\n wav: 'wav',\n mp3: 'mp3',\n opus: 'opus',\n}\n\n/** Qwen 服务端事件(仅取本模块关心的字段,字段名做防御性兼容) */\ninterface QwenServerEvent {\n type?: string\n text?: string\n transcript?: string\n delta?: string\n audio?: string\n transcription?: { text?: string, transcript?: string }\n}\n/**\n * 创建 Qwen Audio Provider\n *\n * @internal\n */\nexport function createQwenAudioProvider(): AudioProvider {\n function connect(model: ResolvedAudioModel, signal?: AbortSignal): Promise<AudioWsConnection> {\n const url = `${model.baseUrl}?model=${encodeURIComponent(model.model)}`\n const headers: Record<string, string> = {}\n if (model.apiKey)\n headers.Authorization = `Bearer ${model.apiKey}`\n if (model.workspaceId)\n headers['X-DashScope-WorkSpace'] = model.workspaceId\n return openAudioWebSocket(url, headers, { signal, timeout: model.timeout })\n }\n\n function newEventId(): string {\n return `event_${nanoid()}`\n }\n\n async function transcribe(request: ProviderTranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n try {\n let finalText = ''\n for await (const event of transcribeStream({ model: request.model, audio: request.audio, language: request.language, contextHints: request.contextHints, signal: request.signal })) {\n if (event.type === 'transcript' && event.final)\n finalText = finalText ? `${finalText}${event.text}` : event.text\n }\n return ok({ text: finalText })\n }\n catch (error) {\n logger.debug('Qwen transcribe failed', { error: errorMessage(error) })\n return toAudioErrorResult(error)\n }\n }\n\n async function* transcribeStream(request: ProviderTranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n const { model, audio, language, signal } = request\n const isStreamInput = 'chunks' in audio\n const format = audio.format\n const sampleRate = audio.sampleRate\n\n const conn = await connect(model, signal)\n try {\n // 会话配置:持续音频输入用服务端 VAD 断句;完整音频用 Manual 模式(手动 commit)\n conn.send(JSON.stringify({\n event_id: newEventId(),\n type: 'session.update',\n session: {\n input_audio_format: QWEN_FORMAT[format],\n sample_rate: sampleRate ?? 16000,\n input_audio_transcription: language ? { language } : {},\n turn_detection: isStreamInput ? { type: 'server_vad' } : null,\n },\n }))\n\n // 音频发送:持续输入边到边送,完整音频一次送出后手动 commit\n const sendAudio = (async () => {\n if ('chunks' in audio) {\n for await (const part of audio.chunks)\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_audio_buffer.append', audio: toBase64(part) }))\n }\n else {\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_audio_buffer.append', audio: toBase64(audio.data) }))\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_audio_buffer.commit' }))\n }\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'session.finish' }))\n })()\n // 发送失败不阻塞读取循环,读取结束后再统一 surface\n let sendError: unknown\n sendAudio.catch((e: unknown) => {\n sendError = e\n })\n\n for await (const message of conn.messages()) {\n if (message.isBinary || !message.text)\n continue\n const event = parseEvent(message.text)\n switch (event.type) {\n case 'input_audio_buffer.speech_started':\n yield { type: 'speech_started' }\n break\n case 'input_audio_buffer.speech_stopped':\n yield { type: 'speech_stopped' }\n break\n case 'conversation.item.input_audio_transcription.text': {\n const text = event.text ?? event.transcript ?? event.transcription?.text ?? event.delta\n if (text)\n yield { type: 'transcript', text, final: false }\n break\n }\n case 'conversation.item.input_audio_transcription.completed': {\n const text = event.transcript ?? event.text ?? event.transcription?.transcript ?? event.transcription?.text\n if (text)\n yield { type: 'transcript', text, final: true }\n break\n }\n case 'session.finished':\n if (sendError)\n throw sendError\n return\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n async function synthesize(request: ProviderSynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n const { format, sampleRate } = request\n const out = resolveSynthesisOutput({ format, sampleRate })\n try {\n const chunks: Uint8Array[] = []\n for await (const audio of synthesizeStream({ model: request.model, text: request.text, voice: request.voice, instruction: request.instruction, format: out.format, sampleRate, signal: request.signal }))\n chunks.push(audio)\n return ok({ data: concatChunks(chunks), format: out.format, sampleRate: out.sampleRate, channels: out.channels })\n }\n catch (error) {\n logger.debug('Qwen synthesize failed', { error: errorMessage(error) })\n return toAudioErrorResult(error)\n }\n }\n\n async function* synthesizeStream(request: ProviderSynthesisStreamRequest): AsyncIterable<Uint8Array> {\n const { model, text, voice, instruction, format, sampleRate, signal } = request\n const isStreamInput = typeof text !== 'string'\n const outFormat = resolveSynthesisOutput({ format }).format\n\n const conn = await connect(model, signal)\n try {\n conn.send(JSON.stringify({\n event_id: newEventId(),\n type: 'session.update',\n session: {\n voice: voice ?? 'Cherry',\n // 持续文本输入用 ServerCommit(服务端智能分段,低时延);完整文本用 Commit\n mode: isStreamInput ? 'server_commit' : 'commit',\n response_format: QWEN_FORMAT[outFormat],\n sample_rate: sampleRate ?? 24000,\n ...(instruction ? { instructions: instruction } : {}),\n },\n }))\n\n const sendText = (async () => {\n if (typeof text === 'string') {\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_text_buffer.append', text }))\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_text_buffer.commit' }))\n }\n else {\n for await (const part of text)\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'input_text_buffer.append', text: part }))\n }\n conn.send(JSON.stringify({ event_id: newEventId(), type: 'session.finish' }))\n })()\n let sendError: unknown\n sendText.catch((e: unknown) => {\n sendError = e\n })\n\n for await (const message of conn.messages()) {\n if (message.isBinary || !message.text)\n continue\n const event = parseEvent(message.text)\n if (event.type === 'response.audio.delta') {\n const base64 = event.audio ?? event.delta\n if (base64)\n yield fromBase64(base64)\n }\n else if (event.type === 'session.finished') {\n if (sendError)\n throw sendError\n return\n }\n }\n if (sendError)\n throw sendError\n }\n finally {\n conn.close()\n }\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream, resolveSynthesisOutput, capabilities: QWEN_CAPABILITIES }\n}\n\n/** Qwen 未指定格式时默认 pcm16;pcm16 时补默认采样率 24000。 */\nfunction resolveSynthesisOutput(request: { format?: AudioFormat, sampleRate?: number }): SynthesisOutputMeta {\n const format: AudioFormat = request.format ?? 'pcm16'\n return { format, sampleRate: format === 'pcm16' ? (request.sampleRate ?? 24000) : undefined, channels: 1 }\n}\n\n/** 解析服务端 JSON 事件(解析失败返回空对象,交由调用方忽略) */\nfunction parseEvent(text: string): QwenServerEvent {\n try {\n return JSON.parse(text) as QwenServerEvent\n }\n catch {\n return {}\n }\n}\n","/**\n * @h-ai/ai — Audio 子功能工厂\n *\n * 组装 `AudioOperations`:参数校验、模型解析、Provider 路由与调用。\n * Provider 惰性创建并缓存,未使用的平台不初始化客户端与连接。\n * @module audio/ai-audio-functions\n */\n\nimport type { HaiError, HaiResult } from '@h-ai/core'\nimport type { AIConfig, AudioConfig, AudioProviderName } from '../ai-config.js'\n\nimport type {\n AudioCapabilitiesRequest,\n AudioContent,\n AudioModelCapabilities,\n AudioOperations,\n SynthesisEvent,\n SynthesisRequest,\n SynthesisResult,\n SynthesisStreamRequest,\n SynthesisTextSegment,\n TranscriptionEvent,\n TranscriptionRequest,\n TranscriptionResult,\n TranscriptionStreamRequest,\n} from './ai-audio-types.js'\nimport type { AudioProvider } from './providers/ai-audio-provider.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { AudioConfigSchema, resolveAudioModel } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { createDoubaoAudioProvider } from './providers/ai-audio-provider-doubao.js'\nimport { createMimoAudioProvider } from './providers/ai-audio-provider-mimo.js'\nimport { createOpenAIAudioProvider } from './providers/ai-audio-provider-openai.js'\nimport { createQwenAudioProvider } from './providers/ai-audio-provider-qwen.js'\nimport { audioError, mapStreamError } from './providers/ai-audio-provider.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'audio' })\n\n/**\n * 创建 Audio 操作接口\n *\n * @param config - 校验后的 AI 配置\n * @returns Audio 操作接口\n */\nexport function createAudioOperations(config: AIConfig): AudioOperations {\n const audioConfig: AudioConfig = AudioConfigSchema.parse(config.audio ?? {})\n const providerCache = new Map<AudioProviderName, AudioProvider>()\n\n /** 惰性创建并缓存 Provider(未使用的平台不初始化) */\n function getProvider(name: AudioProviderName): AudioProvider {\n const cached = providerCache.get(name)\n if (cached)\n return cached\n const provider = createProvider(name)\n providerCache.set(name, provider)\n return provider\n }\n\n /** 校验完整音频大小,超过上限返回错误 */\n function guardAudioSize(audio: AudioContent): HaiError | null {\n if (audio.data.length > audioConfig.maxAudioBytes)\n return audioError(HaiAIError.AUDIO_INPUT_TOO_LARGE, aiM('ai_audioInputTooLarge', { params: { limit: audioConfig.maxAudioBytes } }))\n return null\n }\n\n /** 组合请求取消信号与实时连接时长上限(P0-5:maxStreamDurationMs 生效) */\n function withStreamTimeout(signal: AbortSignal | undefined): AbortSignal {\n const timeout = AbortSignal.timeout(audioConfig.maxStreamDurationMs)\n return signal ? AbortSignal.any([signal, timeout]) : timeout\n }\n\n async function transcribe(request: TranscriptionRequest): Promise<HaiResult<TranscriptionResult>> {\n if (!request.audio?.data?.length)\n return err(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'empty audio' } }))\n const sizeErr = guardAudioSize(request.audio)\n if (sizeErr)\n return { success: false, error: sizeErr }\n\n const resolved = resolveAudioModel(audioConfig, 'transcribe', request.model)\n if (!resolved.success)\n return resolved\n logger.debug('audio transcribe', { provider: resolved.data.provider, model: resolved.data.model })\n return getProvider(resolved.data.provider).transcribe({ model: resolved.data, audio: request.audio, language: request.language, contextHints: request.contextHints, signal: request.signal })\n }\n\n async function* transcribeStream(request: TranscriptionStreamRequest): AsyncIterable<TranscriptionEvent> {\n if (!('chunks' in request.audio) && !request.audio.data?.length)\n throw audioError(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'empty audio' } }))\n if (!('chunks' in request.audio)) {\n const sizeErr = guardAudioSize(request.audio)\n if (sizeErr)\n throw sizeErr\n }\n\n const resolved = resolveAudioModel(audioConfig, 'transcribe', request.model)\n if (!resolved.success)\n throw resolved.error\n logger.debug('audio transcribeStream', { provider: resolved.data.provider, model: resolved.data.model })\n const signal = withStreamTimeout(request.signal)\n try {\n yield* getProvider(resolved.data.provider).transcribeStream({ model: resolved.data, audio: request.audio, language: request.language, contextHints: request.contextHints, signal })\n }\n catch (error) {\n throw mapStreamError(error, signal)\n }\n }\n\n async function synthesize(request: SynthesisRequest): Promise<HaiResult<SynthesisResult>> {\n if (!request.text)\n return err(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'empty text' } }))\n\n const resolved = resolveAudioModel(audioConfig, 'synthesize', request.model)\n if (!resolved.success)\n return resolved\n logger.debug('audio synthesize', { provider: resolved.data.provider, model: resolved.data.model })\n return getProvider(resolved.data.provider).synthesize({ model: resolved.data, text: request.text, voice: request.voice, instruction: request.instruction, format: request.format, sampleRate: request.sampleRate, signal: request.signal })\n }\n\n async function* synthesizeStream(request: SynthesisStreamRequest): AsyncIterable<SynthesisEvent> {\n const resolved = resolveAudioModel(audioConfig, 'synthesize', request.model)\n if (!resolved.success)\n throw resolved.error\n logger.debug('audio synthesizeStream', { provider: resolved.data.provider, model: resolved.data.model })\n const signal = withStreamTimeout(request.signal)\n const provider = getProvider(resolved.data.provider)\n // 由 Provider 依据自身默认规则解析真实输出格式,供 segment_started 标注(不由调用方猜测)\n const output = provider.resolveSynthesisOutput({ format: request.format, sampleRate: request.sampleRate })\n try {\n const segments = isSynthesisTextSegment(request.text) ? singleSegment(request.text) : request.text\n for await (const segment of segments) {\n if (!segment.id || !segment.text)\n throw audioError(HaiAIError.AUDIO_INVALID_REQUEST, aiM('ai_audioInvalidRequest', { params: { reason: 'empty segment id or text' } }))\n yield { type: 'segment_started', segmentId: segment.id, text: segment.text, format: output.format, sampleRate: output.sampleRate, channels: output.channels }\n for await (const data of provider.synthesizeStream({ model: resolved.data, text: segment.text, voice: request.voice, instruction: request.instruction, format: request.format, sampleRate: request.sampleRate, signal }))\n yield { type: 'audio', segmentId: segment.id, data }\n yield { type: 'segment_done', segmentId: segment.id }\n }\n }\n catch (error) {\n throw mapStreamError(error, signal)\n }\n }\n\n /**\n * 查询模型所属平台的实时能力声明(不需凭据,仅解析模型→平台)\n */\n function getCapabilities(request: AudioCapabilitiesRequest): HaiResult<AudioModelCapabilities> {\n const targetId = request.model ?? (request.operation === 'transcribe' ? audioConfig.transcribeModel : audioConfig.synthesizeModel)\n if (!targetId)\n return err(HaiAIError.AUDIO_MODEL_NOT_FOUND, aiM('ai_audioModelNotFound', { params: { model: `<${request.operation}>` } }))\n const entry = audioConfig.models?.find(model => model.id === targetId || model.model === targetId)\n if (!entry)\n return err(HaiAIError.AUDIO_MODEL_NOT_FOUND, aiM('ai_audioModelNotFound', { params: { model: targetId } }))\n const operations: readonly string[] = entry.operations\n if (!operations.includes(request.operation)) {\n return err(\n HaiAIError.AUDIO_UNSUPPORTED_INPUT,\n aiM('ai_audioUnsupportedInput', { params: { provider: entry.provider, reason: `model ${entry.id} does not support ${request.operation}` } }),\n )\n }\n const capabilities = getProvider(entry.provider).capabilities\n return ok(request.operation === 'transcribe'\n ? { transcribe: capabilities.transcribe }\n : { synthesize: capabilities.synthesize })\n }\n\n return { transcribe, transcribeStream, synthesize, synthesizeStream, getCapabilities }\n}\n\nfunction isSynthesisTextSegment(value: SynthesisStreamRequest['text']): value is SynthesisTextSegment {\n return typeof value === 'object' && value !== null && 'id' in value && 'text' in value\n}\n\nasync function* singleSegment(segment: SynthesisTextSegment): AsyncIterable<SynthesisTextSegment> {\n yield segment\n}\n\n/** 按平台创建 Provider */\nfunction createProvider(name: AudioProviderName): AudioProvider {\n switch (name) {\n case 'openai':\n return createOpenAIAudioProvider()\n case 'mimo':\n return createMimoAudioProvider()\n case 'qwen':\n return createQwenAudioProvider()\n case 'doubao':\n return createDoubaoAudioProvider()\n }\n}\n","/**\n * @h-ai/ai — Compress 子功能实现\n *\n * 提供上下文压缩能力,支持滑动窗口、摘要、混合三种策略。\n * 依赖 Token 子模块进行 Token 估算,依赖 Summary 子模块生成摘要。\n * @module ai-compress-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { CompressConfig } from '../ai-config.js'\n\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { SummaryOperations } from '../summary/ai-summary-types.js'\nimport type { TokenOperations } from '../token/ai-token-types.js'\nimport type { CompressOperations, CompressOptions, CompressResult } from './ai-compress-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'compress' })\n\n/**\n * 创建 Compress 操作接口\n *\n * @param config - Compress 配置\n * @param token - Token 操作接口(用于估算 Token 数)\n * @param summary - Summary 操作接口(用于 summary/hybrid 策略生成摘要)\n * @param modelMaxTokens - 模型最大 Token 数(用于 defaultMaxTokens 为 0 时的回退计算)\n * @returns CompressOperations 实例\n */\nexport function createCompressOperations(\n config: CompressConfig,\n token: TokenOperations,\n summary: SummaryOperations,\n modelMaxTokens: number,\n): CompressOperations {\n /**\n * 计算有效的 maxTokens\n */\n function resolveMaxTokens(optionMaxTokens?: number): number {\n const fromOption = optionMaxTokens ?? config.defaultMaxTokens\n if (fromOption > 0)\n return fromOption\n return Math.floor(modelMaxTokens * 0.8)\n }\n\n /**\n * 滑动窗口压缩\n */\n function slidingWindow(\n messages: ChatMessage[],\n maxTokens: number,\n preserveSystem: boolean,\n preserveLastN: number,\n ): { messages: ChatMessage[], removedCount: number } {\n const systemMessages: ChatMessage[] = []\n const nonSystemMessages: ChatMessage[] = []\n\n for (const msg of messages) {\n if (msg.role === 'system' && preserveSystem) {\n systemMessages.push(msg)\n }\n else {\n nonSystemMessages.push(msg)\n }\n }\n\n const preserved = nonSystemMessages.slice(-preserveLastN)\n const result = [...systemMessages, ...preserved]\n const currentTokens = token.estimateMessages(result)\n\n if (currentTokens <= maxTokens) {\n return {\n messages: result,\n removedCount: nonSystemMessages.length - preserved.length,\n }\n }\n\n // 从最新的消息开始逆向添加\n let finalMessages = [...systemMessages]\n let tokens = token.estimateMessages(finalMessages)\n const addable: ChatMessage[] = []\n\n for (let i = nonSystemMessages.length - 1; i >= 0; i--) {\n const msgTokens = token.estimateMessages([nonSystemMessages[i]])\n if (tokens + msgTokens > maxTokens)\n break\n addable.unshift(nonSystemMessages[i])\n tokens += msgTokens\n }\n\n finalMessages = [...systemMessages, ...addable]\n\n return {\n messages: finalMessages,\n removedCount: nonSystemMessages.length - addable.length,\n }\n }\n\n /**\n * 压缩消息列表\n */\n async function tryCompress(messages: ChatMessage[], options?: CompressOptions): Promise<HaiResult<CompressResult>> {\n const strategy = options?.strategy ?? config.defaultStrategy\n const maxTokens = resolveMaxTokens(options?.maxTokens)\n const preserveSystem = options?.preserveSystem ?? true\n const preserveLastN = options?.preserveLastN ?? config.preserveLastN\n\n logger.trace('Compressing context', { strategy, maxTokens, messageCount: messages.length })\n\n try {\n const originalTokens = token.estimateMessages(messages)\n\n // 不需要压缩\n if (originalTokens <= maxTokens) {\n return ok({\n messages: [...messages],\n originalTokens,\n compressedTokens: originalTokens,\n removedCount: 0,\n })\n }\n\n if (strategy === 'sliding-window') {\n const { messages: compressed, removedCount } = slidingWindow(\n messages,\n maxTokens,\n preserveSystem,\n preserveLastN,\n )\n const compressedTokens = token.estimateMessages(compressed)\n\n logger.trace('Sliding window compression completed', { originalTokens, compressedTokens, removedCount })\n return ok({\n messages: compressed,\n originalTokens,\n compressedTokens,\n removedCount,\n })\n }\n\n if (strategy === 'summary') {\n const systemMessages = preserveSystem ? messages.filter(m => m.role === 'system') : []\n const nonSystem = messages.filter(m => m.role !== 'system' || !preserveSystem)\n const preserved = nonSystem.slice(-preserveLastN)\n const toSummarize = nonSystem.slice(0, nonSystem.length - preserveLastN)\n\n if (toSummarize.length === 0) {\n return ok({\n messages: [...messages],\n originalTokens,\n compressedTokens: originalTokens,\n removedCount: 0,\n })\n }\n\n const summaryResult = await summary.generate(toSummarize, { model: options?.summaryModel })\n if (!summaryResult.success)\n return summaryResult as HaiResult<never>\n\n const summaryText = summaryResult.data\n const summaryMessage: ChatMessage = {\n role: 'system',\n content: `[Conversation Summary]\\n${summaryText}`,\n }\n\n const compressed = [...systemMessages, summaryMessage, ...preserved]\n const compressedTokens = token.estimateMessages(compressed)\n\n logger.trace('Summary compression completed', { originalTokens, compressedTokens, removedCount: toSummarize.length })\n return ok({\n messages: compressed,\n originalTokens,\n compressedTokens,\n removedCount: toSummarize.length,\n summary: summaryText,\n })\n }\n\n // hybrid:先滑动窗口,如果仍超限则摘要\n const { messages: windowResult, removedCount: windowRemoved } = slidingWindow(\n messages,\n maxTokens,\n preserveSystem,\n preserveLastN,\n )\n const windowTokens = token.estimateMessages(windowResult)\n\n if (windowTokens <= maxTokens) {\n return ok({\n messages: windowResult,\n originalTokens,\n compressedTokens: windowTokens,\n removedCount: windowRemoved,\n })\n }\n\n // 滑动窗口不够,对被移除的部分生成摘要\n const systemMessages = preserveSystem ? messages.filter(m => m.role === 'system') : []\n const nonSystem = messages.filter(m => m.role !== 'system' || !preserveSystem)\n const preservedMessages = nonSystem.slice(-preserveLastN)\n const toSummarize = nonSystem.slice(0, nonSystem.length - preserveLastN)\n\n if (toSummarize.length > 0) {\n const summaryResult = await summary.generate(toSummarize, { model: options?.summaryModel })\n if (!summaryResult.success)\n return summaryResult as HaiResult<never>\n\n const summaryText = summaryResult.data\n const summaryMessage: ChatMessage = {\n role: 'system',\n content: `[Conversation Summary]\\n${summaryText}`,\n }\n\n const compressed = [...systemMessages, summaryMessage, ...preservedMessages]\n const compressedTokens = token.estimateMessages(compressed)\n\n logger.trace('Hybrid compression completed', { originalTokens, compressedTokens, removedCount: toSummarize.length })\n return ok({\n messages: compressed,\n originalTokens,\n compressedTokens,\n removedCount: toSummarize.length,\n summary: summaryText,\n })\n }\n\n return ok({\n messages: windowResult,\n originalTokens,\n compressedTokens: windowTokens,\n removedCount: windowRemoved,\n })\n }\n catch (error) {\n logger.error('Context compression failed', { error })\n return err(HaiAIError.CONTEXT_COMPRESS_FAILED, aiM('ai_contextCompressFailed', { params: { error: String(error) } }), error)\n }\n }\n\n return {\n tryCompress,\n }\n}\n","/**\n * @h-ai/ai — 会话存储键\n *\n * 提供 LLM / Context / SessionStore 共用的复合存储键构造,确保不同交互主体\n * 使用相同 sessionId 时不会在会话目录(SessionInfo)与上下文正文上互相覆盖。\n * @module store/ai-store-key\n */\n\nimport type { InteractionScope } from './ai-store-types.js'\n\n/**\n * 构造会话存储的复合主键\n *\n * 用 JSON 数组序列化 `[objectId, sessionId]`,避免朴素拼接 `${objectId}:${sessionId}`\n * 在 id 本身含分隔符时产生碰撞(如 `a` + `b:c` 与 `a:b` + `c` 得到同一键),\n * 也避免不同主体相同 sessionId 因裸 sessionId 作主键而互相覆盖。\n *\n * LLM、Context 与 SessionStore 必须共用此实现。\n *\n * @param scope - 交互作用域(主体 ID + 会话 ID)\n * @returns 复合存储键\n */\nexport function sessionStoreKey(scope: InteractionScope): string {\n return JSON.stringify([scope.objectId, scope.sessionId])\n}\n","/**\n * @h-ai/ai — Context 子功能实现\n *\n * 聚合 Token、Summary、Compress 三个子模块,并在此基础上\n * 提供有状态的 ContextManager(多轮对话自动压缩 + 对话编排 + 持久化)。\n * @module ai-context-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { CompressConfig } from '../ai-config.js'\n\nimport type { CompressOperations } from '../compress/ai-compress-types.js'\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { AIRelStore, InteractionScope, SessionInfo } from '../store/ai-store-types.js'\nimport type { SummaryResult } from '../summary/ai-summary-types.js'\nimport type { TokenOperations } from '../token/ai-token-types.js'\nimport type {\n CommitTurnInput,\n ConsolidateOptions,\n ConsolidateResult,\n ContextChatOptions,\n ContextChatResult,\n ContextDeps,\n ContextManager,\n ContextManagerOptions,\n ContextOperations,\n ContextStreamEvent,\n ConversationTurn,\n} from './ai-context-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { createStreamProcessor } from '../llm/ai-llm-stream.js'\nimport { sessionStoreKey } from '../store/ai-store-key.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'context' })\n\n// ─── 持久化状态结构 ───\n\n/**\n * 持久化的上下文管理器状态\n */\ninterface PersistedContextState {\n messages: ChatMessage[]\n summaries: SummaryResult[]\n updatedAt: number\n}\n\n/**\n * 创建 Context 操作接口\n *\n * 聚合 Token、Summary、Compress 子模块,提供统一的上下文管理 API。\n * 若传入 deps(LLM / Memory / RAG / Reasoning),ContextManager 可提供\n * chat/chatStream 高层编排能力。\n *\n * @param compressConfig - Compress 配置(用于 ContextManager 的默认值)\n * @param tokenOps - Token 操作接口(由 token 子模块创建)\n * @param compressOps - Compress 操作接口(由 compress 子模块创建)\n * @param contextStore - 上下文状态存储(可选,用于持久化)\n * @param sessionStore - 会话信息存储(可选,用于目录管理)\n * @param deps - 可选子模块依赖(LLM / Memory / RAG / Reasoning)\n * @returns ContextOperations 实例\n */\nexport function createContextOperations(\n compressConfig: CompressConfig,\n tokenOps: TokenOperations,\n compressOps: CompressOperations,\n contextStore?: AIRelStore<PersistedContextState>,\n sessionStore?: AIRelStore<SessionInfo>,\n deps?: ContextDeps,\n): ContextOperations {\n /**\n * 计算有效的 maxTokens(用于 ContextManager 初始化)\n */\n function resolveMaxTokens(optionMaxTokens?: number): number {\n const fromOption = optionMaxTokens ?? compressConfig.defaultMaxTokens\n if (fromOption > 0)\n return fromOption\n return compressConfig.defaultMaxTokens > 0 ? compressConfig.defaultMaxTokens : 4096\n }\n\n /**\n * 创建 ContextManager 实例(共享逻辑)\n */\n function buildManager(\n options: ContextManagerOptions,\n initialMessages: ChatMessage[],\n initialSummaries: SummaryResult[],\n ): ContextManager {\n const scope = options.scope\n\n // 解析压缩参数\n const compress = options.compress\n const managerMaxTokens = resolveMaxTokens(compress?.maxTokens)\n const strategy = compress?.strategy ?? compressConfig.defaultStrategy\n const preserveSystem = compress?.preserveSystem ?? true\n const preserveLastN = compress?.preserveLastN ?? compressConfig.preserveLastN\n const autoCompress = compress?.auto ?? true\n const summaryModel = compress?.summaryModel\n\n const state = {\n messages: initialMessages,\n summaries: initialSummaries,\n }\n\n // 后台记忆提取任务集合:chat/chatStream 的自动提取是即发即忘,flush() 统一等待,\n // 避免「AI 回答结束→下一轮召回/生成总结→上一轮记忆仍未写完」的时序问题。\n const pendingMemoryTasks = new Set<Promise<unknown>>()\n\n // 记忆注入选项:将 scope / types / minImportance / 位置等完整透传给 Memory\n function memoryInjectionOptions() {\n return {\n objectId: scope?.objectId,\n scope: options.memory?.scope,\n types: options.memory?.types,\n minImportance: options.memory?.minImportance,\n topK: options.memory?.topK,\n maxTokens: options.memory?.maxTokens,\n position: options.memory?.position,\n }\n }\n\n // 触发一次后台记忆提取并纳入 pending 集合(scope / types / 模型 / systemPrompt 完整透传)\n function enqueueMemoryExtract(userMessage: string, reply: string): void {\n if (!options.memory?.enableExtract || !deps?.memory)\n return\n const recentMessages: ChatMessage[] = [\n { role: 'user', content: userMessage },\n { role: 'assistant', content: reply },\n ]\n const task = deps.memory\n .extract(recentMessages, {\n objectId: scope?.objectId,\n scope: options.memory.scope,\n types: options.memory.types,\n model: options.memory.extractionModel,\n systemPrompt: options.memory.extractionSystemPrompt,\n })\n .catch((e: unknown) => logger.warn('Memory extract failed', { error: e }))\n .finally(() => {\n pendingMemoryTasks.delete(task)\n })\n pendingMemoryTasks.add(task)\n }\n\n // ─── Conversation Commit Layer 状态 ───\n // turnCommit=auto(默认):生成即提交完整文本;manual:生成后登记待提交轮次,由 commit/interrupt 决定真实文本。\n const turnCommit = options.turnCommit ?? 'auto'\n const turns: ConversationTurn[] = []\n // 待提交轮次(manual 模式):turnId → 触发该轮的用户输入(用于提交时的记忆提取配对)\n const pendingCommits = new Map<string, string>()\n\n function generateTurnId(): string {\n return `turn_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`\n }\n\n // ─── 并发控制(单活动生成) ───\n // 默认单活动生成,防止「上一轮 AI 尚未退出,下一轮 user 消息先写入」的乱序。\n const concurrency = options.concurrency ?? 'reject'\n // 是否已有活动生成(含 manual 待提交轮次持有的屏障)\n let generationActive = false\n // queue 模式下的排队唤醒器(前一轮进入终态时按序移交所有权)\n const generationWaiters: Array<() => void> = []\n // turnId → 该生成的一次性释放句柄;manual 待提交轮次的屏障持续到 commit/interrupt。\n const generationHolders = new Map<string, () => void>()\n // 当前活动生成的内部取消控制器(reset 时可中断上游 LLM)\n let activeAbort: AbortController | null = null\n // 当前活动生成的释放句柄(reset 时强制放行下一轮,避免挂起的生成器长期占用屏障)\n let activeRelease: (() => void) | null = null\n // 生成纪元:reset 递增,使 reset 之前启动的生成不再把结果写回已重置的上下文\n let generationEpoch = 0\n\n // 系统提示词文本:用于 reset 后恢复;restore 时从首条 system 消息推导\n const systemPromptText = options.systemPrompt\n ?? (initialMessages[0]?.role === 'system' && typeof initialMessages[0].content === 'string'\n ? initialMessages[0].content\n : undefined)\n\n /**\n * 获取生成许可(单活动生成)。\n *\n * reject 模式下已有活动生成时立即返回 CONTEXT_BUSY;queue 模式下排队等待前一轮进入终态。\n * 返回本轮的内部取消信号与一次性释放句柄;调用方必须在轮次到达终态时释放。\n */\n async function acquireGeneration(): Promise<HaiResult<{ epoch: number, signal: AbortSignal, release: () => void }>> {\n if (generationActive) {\n if (concurrency === 'reject')\n return err(HaiAIError.CONTEXT_BUSY, aiM('ai_contextBusy'))\n // queue:排队等待被唤醒(唤醒即已接管所有权,generationActive 保持 true)\n await new Promise<void>((resolve) => {\n generationWaiters.push(resolve)\n })\n }\n else {\n generationActive = true\n }\n const abort = new AbortController()\n activeAbort = abort\n const epoch = generationEpoch\n let released = false\n const release = (): void => {\n if (released)\n return\n released = true\n if (activeAbort === abort)\n activeAbort = null\n if (activeRelease === release)\n activeRelease = null\n const next = generationWaiters.shift()\n if (next)\n next() // 移交所有权给下一个排队者(generationActive 保持 true)\n else\n generationActive = false\n }\n activeRelease = release\n return ok({ epoch, signal: abort.signal, release })\n }\n\n /**\n * 组合调用方信号与本轮内部取消信号(任一触发即取消上游生成)。\n */\n function combineSignal(caller: AbortSignal | undefined, internal: AbortSignal): AbortSignal {\n return caller ? AbortSignal.any([caller, internal]) : internal\n }\n\n /**\n * 释放某轮次持有的并发屏障(幂等)。\n */\n function releaseTurnHolder(turnId: string): void {\n const release = generationHolders.get(turnId)\n if (release) {\n generationHolders.delete(turnId)\n release()\n }\n }\n\n /**\n * 轮次是否已进入终态(completed / interrupted)。\n */\n function isTurnTerminal(turnId: string): boolean {\n const turn = turns.find(t => t.id === turnId)\n return !turn || turn.status === 'completed' || turn.status === 'interrupted'\n }\n\n /**\n * 生成结束后结算并发屏障:\n * - 轮次已终态:立即释放屏障;\n * - 轮次仍未终态(manual 待提交 / 取消后待提交):把释放责任移交该轮次,\n * 由后续 commitTurn / interruptTurn 释放,保证「打断→立即下一轮」的顺序屏障。\n */\n function settleGeneration(turnId: string | null, release: () => void): void {\n if (turnId && !isTurnTerminal(turnId))\n generationHolders.set(turnId, release)\n else\n release()\n }\n\n const manager: ContextManager = {\n scope,\n\n async addMessage(message: ChatMessage): Promise<HaiResult<void>> {\n state.messages.push(message)\n\n if (!autoCompress)\n return ok(undefined)\n\n const currentTokens = tokenOps.estimateMessages(state.messages)\n if (currentTokens <= managerMaxTokens)\n return ok(undefined)\n\n logger.trace('Auto-compressing context', { currentTokens, budget: managerMaxTokens })\n\n const compressResult = await compressOps.tryCompress(state.messages, {\n strategy: strategy as 'summary' | 'sliding-window' | 'hybrid',\n maxTokens: managerMaxTokens,\n preserveSystem,\n preserveLastN,\n summaryModel,\n })\n\n if (!compressResult.success) {\n logger.warn('Auto-compression failed, keeping original messages', { error: compressResult.error })\n return ok(undefined)\n }\n\n if (compressResult.data.summary) {\n state.summaries.push({\n summary: compressResult.data.summary,\n tokenCount: tokenOps.estimateText(compressResult.data.summary),\n coveredMessages: compressResult.data.removedCount,\n })\n }\n\n state.messages = compressResult.data.messages\n return ok(undefined)\n },\n\n getMessages(): HaiResult<ChatMessage[]> {\n return ok([...state.messages])\n },\n\n getTokenUsage(): HaiResult<{ current: number, budget: number }> {\n return ok({\n current: tokenOps.estimateMessages(state.messages),\n budget: managerMaxTokens,\n })\n },\n\n getSummaries(): HaiResult<SummaryResult[]> {\n return ok([...state.summaries])\n },\n\n async save(): Promise<HaiResult<void>> {\n // 持久化前先等待后台记忆提取完成,确保记忆已落库(issue #14)\n await manager.flush()\n\n if (!scope || !contextStore) {\n return ok(undefined)\n }\n try {\n const key = sessionStoreKey(scope)\n await contextStore.save(key, {\n messages: state.messages,\n summaries: state.summaries,\n updatedAt: Date.now(),\n }, { objectId: scope.objectId, sessionId: scope.sessionId })\n\n // 同步更新会话信息(与上下文正文共用同一复合键,避免不同主体相同 sessionId 互相覆盖)\n if (sessionStore) {\n const sessionKey = key\n const existing = await sessionStore.get(sessionKey)\n if (existing) {\n existing.updatedAt = Date.now()\n await sessionStore.save(sessionKey, existing, { objectId: existing.objectId })\n }\n else {\n await sessionStore.save(sessionKey, {\n sessionId: scope.sessionId,\n objectId: scope.objectId,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n }, { objectId: scope.objectId })\n }\n }\n\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async reset(resetOpts?): Promise<HaiResult<void>> {\n const preserveSystemPrompt = resetOpts?.preserveSystemPrompt ?? true\n const cancelActiveTurn = resetOpts?.cancelActiveTurn ?? true\n const waitForMemoryTasks = resetOpts?.waitForMemoryTasks ?? false\n\n // 使 reset 之前启动的生成不再把结果写回已重置的上下文\n generationEpoch++\n\n if (cancelActiveTurn) {\n // 中断内部生成信号(best-effort 停止上游 LLM),并使所有非终态轮次进入终态、释放并发屏障\n activeAbort?.abort()\n for (const turn of turns) {\n if (turn.status === 'generating' || turn.status === 'speaking') {\n turn.status = 'interrupted'\n turn.committed = ''\n turn.committedAt = Date.now()\n releaseTurnHolder(turn.id)\n }\n }\n // 强制放行当前活动生成的屏障:挂起的生成器可能不会立即执行到 finally,避免长期占用\n activeRelease?.()\n }\n\n // 取消或等待旧记忆提取任务\n if (waitForMemoryTasks)\n await manager.flush()\n\n // 清空对话状态、轮次与待提交登记\n state.messages = []\n state.summaries = []\n turns.length = 0\n pendingCommits.clear()\n generationHolders.clear()\n\n // 默认重新写入系统提示词,避免 Persona / System Prompt 丢失\n if (preserveSystemPrompt && systemPromptText)\n state.messages.push({ role: 'system', content: systemPromptText })\n\n return ok(undefined)\n },\n\n getTurns(): HaiResult<ConversationTurn[]> {\n return ok(turns.map(t => ({ ...t })))\n },\n\n markTurnSpeaking(turnId: string): HaiResult<void> {\n const turn = turns.find(t => t.id === turnId)\n if (!turn)\n return err(HaiAIError.CONTEXT_TURN_NOT_FOUND, aiM('ai_turnNotFound', { params: { turnId } }))\n if (turn.status === 'generating')\n turn.status = 'speaking'\n return ok(undefined)\n },\n\n commitTurn(turnId: string, input?: CommitTurnInput): Promise<HaiResult<void>> {\n return finalizeCommit(turnId, input?.text, 'completed')\n },\n\n interruptTurn(turnId: string, input?: CommitTurnInput): Promise<HaiResult<void>> {\n return finalizeCommit(turnId, input?.text, 'interrupted')\n },\n\n async consolidate(consolidateOpts?: ConsolidateOptions): Promise<HaiResult<ConsolidateResult>> {\n if (!deps?.summary || !deps?.memory) {\n return err(HaiAIError.MEMORY_PROMOTE_FAILED, aiM('ai_memoryPromoteFailed', { params: { error: 'summary/memory deps unavailable' } }))\n }\n\n // 先等待后台记忆提取完成,避免固化时短期记忆尚未落库\n await manager.flush()\n\n try {\n // 1) 整合会话摘要:以历史摘要为前序上下文,对当前消息做增量摘要\n const previousSummary = state.summaries.map(s => s.summary).join('\\n\\n') || undefined\n const summaryResult = await deps.summary.generate(state.messages, {\n model: consolidateOpts?.model,\n previousSummary,\n })\n if (!summaryResult.success)\n return summaryResult\n const summaryText = summaryResult.data\n\n if (!summaryText.trim()) {\n return ok({ summary: summaryText, memories: [] })\n }\n\n // 2) 从摘要中提取长期记忆,写入持久作用域(默认取管理器 memory.scope,通常不含 sessionId)\n const durableScope = consolidateOpts?.scope ?? options.memory?.scope\n const extracted = await deps.memory.extract(\n [{ role: 'user', content: summaryText }],\n {\n objectId: scope?.objectId,\n scope: durableScope,\n types: consolidateOpts?.types ?? options.memory?.types,\n model: consolidateOpts?.model ?? options.memory?.extractionModel,\n systemPrompt: consolidateOpts?.extractionSystemPrompt ?? options.memory?.extractionSystemPrompt,\n },\n )\n if (!extracted.success)\n return extracted\n\n return ok({ summary: summaryText, memories: extracted.data })\n }\n catch (error) {\n logger.error('Context consolidate failed', { error })\n return err(HaiAIError.MEMORY_PROMOTE_FAILED, aiM('ai_memoryPromoteFailed', { params: { error: String(error) } }), error)\n }\n },\n\n get pendingMemoryTasks(): number {\n return pendingMemoryTasks.size\n },\n\n async flush(): Promise<HaiResult<void>> {\n // 快照当前任务集合后等待;提取任务失败已在 enqueue 处降级为 warn,不影响 flush 成功\n while (pendingMemoryTasks.size > 0) {\n await Promise.allSettled([...pendingMemoryTasks])\n }\n return ok(undefined)\n },\n\n // ─── chat/chatStream 编排 ───\n\n async chat(message: string, chatOpts?: ContextChatOptions): Promise<HaiResult<ContextChatResult>> {\n if (!deps?.llm) {\n return err(HaiAIError.NOT_INITIALIZED, aiM('ai_notInitialized'))\n }\n\n // 单活动生成:获取许可(reject 时直接返回 CONTEXT_BUSY)\n const acq = await acquireGeneration()\n if (!acq.success)\n return acq\n const { epoch, signal: internalSignal, release } = acq.data\n const signal = combineSignal(chatOpts?.signal, internalSignal)\n let turnId: string | null = null\n\n try {\n // 追加用户消息(自动压缩)\n const addResult = await manager.addMessage({ role: 'user', content: message })\n if (!addResult.success)\n return addResult\n\n // 获取当前消息列表\n const messagesResult = manager.getMessages()\n if (!messagesResult.success)\n return messagesResult\n let messages = messagesResult.data\n\n // 可选:注入记忆(scope / types / minImportance 完整透传)\n if (options.memory?.enable && deps.memory) {\n const injected = await deps.memory.injectMemories(messages, memoryInjectionOptions())\n if (injected.success) {\n messages = injected.data\n }\n }\n\n // 可选:RAG 检索增强 — 将检索结果作为 system 消息注入\n if (options.rag?.enable && deps.rag) {\n const ragResult = await deps.rag.query(message, {\n sources: options.rag.sources,\n topK: options.rag.topK,\n minScore: options.rag.minScore,\n enableRerank: options.rag.enableRerank,\n rerankModel: options.rag.rerankModel,\n model: chatOpts?.model ?? options.model,\n messages,\n enablePersist: false,\n signal,\n })\n if (ragResult.success) {\n // RAG query 已直接返回完整结果,将 answer 作为回复\n const reply = ragResult.data.answer\n turnId = await finalizeAssistantReply(message, reply, epoch)\n\n return ok({\n reply,\n model: ragResult.data.model,\n turnId,\n usage: ragResult.data.usage,\n })\n }\n }\n\n // 可选:推理引擎\n if (options.reasoning?.enable && deps.reasoning) {\n const reasonResult = await deps.reasoning.run(message, {\n strategy: options.reasoning.strategy,\n maxRounds: options.reasoning.maxRounds,\n model: chatOpts?.model ?? options.model,\n temperature: chatOpts?.temperature ?? options.temperature,\n messages,\n tools: options.tools,\n objectId: scope?.objectId,\n sessionId: scope?.sessionId,\n enablePersist: false,\n signal,\n })\n if (reasonResult.success) {\n const reply = reasonResult.data.answer\n turnId = await finalizeAssistantReply(message, reply, epoch)\n\n return ok({ reply, model: chatOpts?.model ?? options.model ?? '', turnId, usage: undefined })\n }\n }\n\n // 普通 LLM 调用(含工具调用循环)\n const toolDefs = options.tools?.getDefinitions()\n const maxToolRounds = options.maxToolRounds ?? 10\n let lastModel = ''\n let lastUsage: { prompt_tokens: number, completion_tokens: number, total_tokens: number } | undefined\n\n for (let round = 0; round <= maxToolRounds; round++) {\n const chatResult = await deps.llm.chat({\n model: chatOpts?.model ?? options.model,\n messages,\n temperature: chatOpts?.temperature ?? options.temperature,\n objectId: scope?.objectId,\n sessionId: scope?.sessionId,\n tools: toolDefs,\n tool_choice: toolDefs ? 'auto' : undefined,\n enablePersist: chatOpts?.enablePersist ?? false,\n signal,\n })\n\n if (!chatResult.success)\n return chatResult\n\n const choice = chatResult.data.choices[0]\n lastModel = chatResult.data.model\n if (chatResult.data.usage) {\n lastUsage = {\n prompt_tokens: chatResult.data.usage.prompt_tokens,\n completion_tokens: chatResult.data.usage.completion_tokens,\n total_tokens: chatResult.data.usage.total_tokens,\n }\n }\n\n if (!choice)\n break\n\n const assistantMessage = choice.message\n\n // 有工具调用且注册表可用:执行工具并将结果回传 LLM\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0 && options.tools) {\n messages.push(assistantMessage)\n\n for (const toolCall of assistantMessage.tool_calls) {\n if (toolCall.type !== 'function')\n continue\n const toolResult = await options.tools.execute(toolCall, { signal, objectId: scope?.objectId, sessionId: scope?.sessionId })\n const rawContent = toolResult.success\n ? toolResult.data.content\n : `Tool error: ${toolResult.error.message}`\n const toolContent = typeof rawContent === 'string'\n ? rawContent\n : (rawContent as Array<{ text?: string }>).map(p => p.text ?? '').join(' ')\n\n messages.push({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: toolContent,\n })\n }\n continue\n }\n\n // 无工具调用:提取文本回复\n const reply = typeof assistantMessage.content === 'string' ? assistantMessage.content : ''\n\n // 完成本轮生成:auto 直接提交完整文本,manual 登记待提交轮次\n turnId = await finalizeAssistantReply(message, reply, epoch)\n\n return ok({ reply, model: lastModel, turnId, usage: lastUsage })\n }\n\n // 达到最大工具调用轮次,返回最后可用的回复\n const lastAssistantMsg = messages.filter(m => m.role === 'assistant').pop()\n const fallbackReply = lastAssistantMsg && 'content' in lastAssistantMsg && typeof lastAssistantMsg.content === 'string'\n ? lastAssistantMsg.content\n : ''\n turnId = await finalizeAssistantReply(message, fallbackReply, epoch)\n return ok({ reply: fallbackReply, model: lastModel, turnId, usage: lastUsage })\n }\n catch (error) {\n logger.error('Context chat failed', { error })\n return err(HaiAIError.INTERNAL_ERROR, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n finally {\n // 结算并发屏障:auto 已终态立即释放;manual 待提交轮次的屏障移交 commit/interrupt\n settleGeneration(turnId, release)\n }\n },\n\n async* chatStream(message: string, chatOpts?: ContextChatOptions): AsyncIterable<ContextStreamEvent> {\n if (!deps?.llm) {\n throw new Error('LLM not initialized: deps.llm is required for chatStream')\n }\n\n // 单活动生成:获取许可(reject 时抛出 CONTEXT_BUSY,供调用方 for-await 捕获)\n const acq = await acquireGeneration()\n if (!acq.success)\n throw core.error.buildHaiErrorInst(HaiAIError.CONTEXT_BUSY, aiM('ai_contextBusy'))\n const { signal: internalSignal, release } = acq.data\n const signal = combineSignal(chatOpts?.signal, internalSignal)\n let streamTurn: ConversationTurn | null = null\n\n try {\n // 追加用户消息\n await manager.addMessage({ role: 'user', content: message })\n\n // 获取消息列表\n const messagesResult = manager.getMessages()\n if (!messagesResult.success) {\n throw new Error(`Failed to get messages: ${String(messagesResult.error)}`)\n }\n let messages = messagesResult.data\n\n // 可选:注入记忆(scope / types / minImportance 完整透传)\n if (options.memory?.enable && deps.memory) {\n const injected = await deps.memory.injectMemories(messages, memoryInjectionOptions())\n if (injected.success) {\n messages = injected.data\n }\n }\n\n // 调用上游模型前先登记轮次(含配对用户输入)并广播 turn_started:\n // 中途取消(AbortSignal)时仍能保留 turnId 与已生成文本,供调用方用真实内容 commit/interrupt。\n const turn = beginStreamTurn(message)\n streamTurn = turn\n yield { type: 'turn_started', turnId: turn.id }\n\n try {\n // 可选:RAG 流式检索增强\n if (options.rag?.enable && deps.rag) {\n let fullReply = ''\n let model = ''\n let usage: { prompt_tokens: number, completion_tokens: number, total_tokens: number } | undefined\n\n for await (const event of deps.rag.queryStream(message, {\n sources: options.rag.sources,\n topK: options.rag.topK,\n minScore: options.rag.minScore,\n enableRerank: options.rag.enableRerank,\n rerankModel: options.rag.rerankModel,\n model: chatOpts?.model ?? options.model,\n messages,\n enablePersist: false,\n signal,\n })) {\n if (event.type === 'delta') {\n fullReply += event.text\n turn.generated = fullReply\n yield { type: 'delta', text: event.text }\n }\n else if (event.type === 'done') {\n fullReply = event.answer\n model = event.model\n usage = event.usage\n }\n }\n\n // 轮次若已被 interruptTurn 打断进入终态,则不得再产出 `done`,避免业务层误判为正常完成。\n if (await completeStreamTurn(turn, fullReply))\n yield { type: 'done', reply: fullReply, model, turnId: turn.id, usage }\n return\n }\n\n // 可选:Reasoning 流式推理\n if (options.reasoning?.enable && deps.reasoning) {\n let fullReply = ''\n\n for await (const event of deps.reasoning.runStream(message, {\n strategy: options.reasoning.strategy,\n maxRounds: options.reasoning.maxRounds,\n model: chatOpts?.model ?? options.model,\n temperature: chatOpts?.temperature ?? options.temperature,\n messages,\n tools: options.tools,\n objectId: scope?.objectId,\n sessionId: scope?.sessionId,\n enablePersist: false,\n signal,\n })) {\n if (event.type === 'delta') {\n fullReply += event.text\n turn.generated = fullReply\n yield { type: 'delta', text: event.text }\n }\n }\n\n // 轮次若已被 interruptTurn 打断进入终态,则不得再产出 `done`,避免业务层误判为正常完成。\n if (await completeStreamTurn(turn, fullReply))\n yield { type: 'done', reply: fullReply, model: chatOpts?.model ?? options.model ?? '', turnId: turn.id, usage: undefined }\n return\n }\n\n // 普通流式 LLM 调用(含工具调用循环)\n const toolDefs = options.tools?.getDefinitions()\n const maxToolRounds = options.maxToolRounds ?? 10\n\n let fullReply = ''\n let model = ''\n let usage: { prompt_tokens: number, completion_tokens: number, total_tokens: number } | undefined\n\n for (let round = 0; round <= maxToolRounds; round++) {\n const processor = createStreamProcessor()\n\n const stream = deps.llm.chatStream({\n model: chatOpts?.model ?? options.model,\n messages,\n temperature: chatOpts?.temperature ?? options.temperature,\n objectId: scope?.objectId,\n sessionId: scope?.sessionId,\n tools: toolDefs,\n tool_choice: toolDefs ? 'auto' : undefined,\n enablePersist: chatOpts?.enablePersist ?? false,\n signal,\n })\n\n for await (const chunk of stream) {\n processor.process(chunk)\n\n if (!model && chunk.model)\n model = chunk.model\n const delta = chunk.choices?.[0]?.delta?.content\n if (delta) {\n fullReply += delta\n turn.generated = fullReply\n yield { type: 'delta', text: delta }\n }\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens,\n completion_tokens: chunk.usage.completion_tokens,\n total_tokens: chunk.usage.total_tokens,\n }\n }\n }\n\n const streamResult = processor.getResult()\n\n // 有工具调用:执行工具并继续下一轮\n if (streamResult.toolCalls.length > 0 && options.tools) {\n messages.push(processor.toAssistantMessage())\n\n for (const toolCall of streamResult.toolCalls) {\n if (toolCall.type !== 'function')\n continue\n yield { type: 'tool_call', name: toolCall.function.name, arguments: toolCall.function.arguments }\n\n const toolResult = await options.tools.execute(toolCall, { signal, objectId: scope?.objectId, sessionId: scope?.sessionId })\n const rawContent = toolResult.success\n ? toolResult.data.content\n : `Tool error: ${toolResult.error.message}`\n const toolContent = typeof rawContent === 'string'\n ? rawContent\n : (rawContent as Array<{ text?: string }>).map(p => p.text ?? '').join(' ')\n\n yield { type: 'tool_result', name: toolCall.function.name, content: toolContent, success: toolResult.success }\n\n messages.push({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: toolContent,\n })\n }\n\n // 重置本轮生成文本,下一轮 LLM 会产出最终文本\n fullReply = ''\n turn.generated = ''\n continue\n }\n\n // 无工具调用:结束循环\n break\n }\n\n // 轮次若已被 interruptTurn 打断进入终态,则不得再产出 `done`,避免业务层误判为正常完成。\n if (await completeStreamTurn(turn, fullReply))\n yield { type: 'done', reply: fullReply, model, turnId: turn.id, usage }\n }\n catch (error) {\n // 上游生成被取消(AbortSignal,含 reset 触发的内部取消):保留 generating 轮次与已生成文本\n // (pendingCommits 已在 beginStreamTurn 登记),由调用方用真实内容 commit/interrupt;\n // 若已被 interrupt 进入终态则忽略。\n if (signal.aborted) {\n yield { type: 'cancelled', turnId: turn.id, generated: turn.generated }\n return\n }\n throw error\n }\n }\n finally {\n // 结算并发屏障:auto 已终态立即释放;manual / 取消后待提交轮次的屏障移交 commit/interrupt\n settleGeneration(streamTurn?.id ?? null, release)\n }\n },\n }\n\n /**\n * 登记一个流式生成的待完成轮次(`generating`)并立即记录配对用户输入。\n *\n * chatStream 在调用上游模型前调用。用户输入在此刻写入 pendingCommits,使得即便调用方在流\n * 进入 catch 前就 interruptTurn,也能触发正确的记忆提取;中途取消时也能保留已生成文本,\n * 由调用方用真实内容通过 commitTurn / interruptTurn 提交。\n */\n function beginStreamTurn(userMessage: string): ConversationTurn {\n const turn: ConversationTurn = {\n id: generateTurnId(),\n speaker: 'assistant',\n generated: '',\n committed: '',\n status: 'generating',\n createdAt: Date.now(),\n }\n turns.push(turn)\n // 立即登记配对用户输入:即便调用方在流进入 catch 前就 interruptTurn,也能触发正确的记忆提取\n pendingCommits.set(turn.id, userMessage)\n return turn\n }\n\n /**\n * 完成一次流式生成:写入最终文本。\n *\n * 已被 commitTurn / interruptTurn 打断进入终态(completed/interrupted)时**不再覆盖**,\n * 避免上游流恰好完成时把完整文本写回已打断的轮次。\n * auto 模式:把生成文本写入上下文并触发记忆提取,轮次置为 `completed`。\n * manual 模式:保持 `generating`,pendingCommits 已在 beginStreamTurn 登记,等待 commit/interrupt。\n *\n * @returns `false` 表示该轮已在别处进入终态(如被 interruptTurn 打断),调用方不得再产出 `done`;\n * `true` 表示本次正常完成,可产出 `done`。\n */\n async function completeStreamTurn(turn: ConversationTurn, finalText: string): Promise<boolean> {\n if (turn.status === 'completed' || turn.status === 'interrupted')\n return false\n turn.generated = finalText\n if (turnCommit === 'auto') {\n turn.committed = finalText\n turn.status = 'completed'\n turn.committedAt = Date.now()\n const userMessage = pendingCommits.get(turn.id) ?? ''\n pendingCommits.delete(turn.id)\n if (finalText)\n await manager.addMessage({ role: 'assistant', content: finalText })\n enqueueMemoryExtract(userMessage, finalText)\n }\n return true\n }\n\n /**\n * 完成一次 assistant 生成。\n *\n * auto 模式:把完整生成文本写入上下文并触发记忆提取,轮次直接 `completed`。\n * manual 模式:仅登记 `generating` 轮次并记录配对用户输入,等待 commit/interrupt。\n *\n * `epoch` 用于识别生成期间是否发生过 reset:若纪元已变化,说明上下文已被重置,\n * 丢弃本轮结果(不写入 turns / 上下文 / 记忆),避免旧生成污染重置后的上下文。\n *\n * @returns 该轮 turnId(供 manual 模式后续提交)\n */\n async function finalizeAssistantReply(userMessage: string, generated: string, epoch: number): Promise<string> {\n const turnId = generateTurnId()\n // reset 已发生:丢弃本轮,不写入 turns / 上下文 / 记忆\n if (epoch !== generationEpoch)\n return turnId\n\n const now = Date.now()\n const turn: ConversationTurn = {\n id: turnId,\n speaker: 'assistant',\n generated,\n committed: turnCommit === 'auto' ? generated : '',\n status: turnCommit === 'auto' ? 'completed' : 'generating',\n createdAt: now,\n committedAt: turnCommit === 'auto' ? now : undefined,\n }\n turns.push(turn)\n\n if (turnCommit === 'auto') {\n if (generated)\n await manager.addMessage({ role: 'assistant', content: generated })\n enqueueMemoryExtract(userMessage, generated)\n }\n else {\n pendingCommits.set(turnId, userMessage)\n }\n return turnId\n }\n\n /**\n * 提交 / 打断一个待提交轮次:把真实文本写入上下文并触发记忆提取。\n */\n async function finalizeCommit(\n turnId: string,\n text: string | undefined,\n status: 'completed' | 'interrupted',\n ): Promise<HaiResult<void>> {\n const turn = turns.find(t => t.id === turnId)\n if (!turn)\n return err(HaiAIError.CONTEXT_TURN_NOT_FOUND, aiM('ai_turnNotFound', { params: { turnId } }))\n if (turn.status === 'completed' || turn.status === 'interrupted')\n return err(HaiAIError.CONTEXT_TURN_INVALID_STATE, aiM('ai_turnInvalidState', { params: { turnId } }))\n\n const committed = text ?? (status === 'completed' ? turn.generated : '')\n turn.committed = committed\n turn.status = status\n turn.committedAt = Date.now()\n\n const userMessage = pendingCommits.get(turnId)\n pendingCommits.delete(turnId)\n\n // 只有真实表达出去的内容才进入对话状态与记忆\n if (committed) {\n await manager.addMessage({ role: 'assistant', content: committed })\n if (userMessage !== undefined)\n enqueueMemoryExtract(userMessage, committed)\n }\n\n // 释放该轮次持有的并发屏障(manual / 取消后待提交轮次),放行下一轮生成\n releaseTurnHolder(turnId)\n return ok(undefined)\n }\n\n return manager\n }\n\n return {\n /**\n * 创建有状态上下文管理器\n */\n createManager(options?: ContextManagerOptions): HaiResult<ContextManager> {\n const opts = options ?? {}\n\n const manager = buildManager(\n opts,\n [],\n [],\n )\n\n // 如果有系统提示词,将其作为第一条 system 消息\n if (opts.systemPrompt) {\n void manager.addMessage({ role: 'system', content: opts.systemPrompt })\n }\n\n return ok(manager)\n },\n\n /**\n * 从存储恢复管理器实例\n */\n async restoreManager(scope: InteractionScope, options?: Omit<ContextManagerOptions, 'scope'>): Promise<HaiResult<ContextManager>> {\n const opts = { ...options, scope } as ContextManagerOptions\n\n let initialMessages: ChatMessage[] = []\n let initialSummaries: SummaryResult[] = []\n\n // 从存储恢复\n if (contextStore) {\n const key = sessionStoreKey(scope)\n const persisted = await contextStore.get(key)\n if (persisted) {\n initialMessages = persisted.messages\n initialSummaries = persisted.summaries\n logger.trace('Context manager restored from store', { scope, messageCount: initialMessages.length })\n }\n }\n\n const manager = buildManager(\n // 恢复时不再追加 systemPrompt(历史中已有)\n { ...opts, systemPrompt: undefined },\n initialMessages,\n initialSummaries,\n )\n\n return ok(manager)\n },\n\n /**\n * 列出指定对象的所有会话\n */\n async listSessions(objectId: string): Promise<HaiResult<SessionInfo[]>> {\n if (!sessionStore) {\n return ok([])\n }\n\n try {\n const sessions = await sessionStore.query({\n objectId,\n orderBy: { field: 'updatedAt', direction: 'desc' },\n })\n return ok(sessions)\n }\n catch (error) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async renameSession(scope: InteractionScope, title: string): Promise<HaiResult<void>> {\n if (!sessionStore) {\n return ok(undefined)\n }\n\n try {\n const sessionKey = sessionStoreKey(scope)\n const existing = await sessionStore.get(sessionKey)\n if (!existing) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: `Session not found: ${scope.sessionId}` } }))\n }\n existing.title = title\n existing.updatedAt = Date.now()\n await sessionStore.save(sessionKey, existing, { objectId: existing.objectId })\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async removeSession(scope: InteractionScope): Promise<HaiResult<void>> {\n if (!sessionStore) {\n return ok(undefined)\n }\n\n try {\n // 上下文正文与会话元数据共用同一复合键,确保删除时正文不残留\n const sessionKey = sessionStoreKey(scope)\n if (contextStore)\n await contextStore.remove(sessionKey)\n await sessionStore.remove(sessionKey)\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.SESSION_FAILED, aiM('ai_sessionFailed', { params: { error: String(error) } }), error)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — Embedding 子功能实现\n *\n * 基于 OpenAI Embeddings API 的向量嵌入实现。\n * @module ai-embedding-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig, EmbeddingConfig, ResolvedModelConfig } from '../ai-config.js'\n\nimport type {\n EmbeddingOperations,\n EmbeddingRequest,\n EmbeddingResponse,\n} from './ai-embedding-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport OpenAI from 'openai'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'embedding' })\n\n/**\n * 创建 Embedding 操作接口\n *\n * 提供文本向量嵌入能力,支持单条、批量和原始请求三种模式。\n * 内部复用同一个 OpenAI 客户端实例,批量请求按 batchSize 自动拆分。\n *\n * @param config - 校验后的 AI 配置(apiKey / baseUrl 来自 llm 配置,dimensions / batchSize 来自 embedding 配置)\n * @returns EmbeddingOperations 实例(`embed` / `embedText` / `embedBatch`)\n */\nexport function createEmbeddingOperations(config: AIConfig): EmbeddingOperations {\n const embeddingConfig: EmbeddingConfig = config.embedding ?? { batchSize: 100 }\n\n /**\n * 缓存的 OpenAI 客户端实例(按 apiKey + baseURL + timeout 缓存,避免不同端点共用同一个客户端)\n */\n let cachedClient: OpenAI | null = null\n let cachedResolvedKey: string | undefined\n\n /**\n * 获取或创建 OpenAI 客户端(首次调用时初始化,后续复用同一实例)\n */\n function getOrCreateClient(resolved: ResolvedModelConfig) {\n const apiKey = resolved.apiKey\n const baseURL = resolved.baseUrl\n const timeout = resolved.timeout\n const cacheKey = `${apiKey}::${baseURL}::${timeout}`\n\n // 如果端点或超时配置变化,需要重建客户端\n if (cachedClient && cachedResolvedKey === cacheKey)\n return cachedClient\n\n cachedClient = new OpenAI({ apiKey, baseURL, timeout })\n cachedResolvedKey = cacheKey\n return cachedClient\n }\n\n /**\n * 调用 OpenAI Embeddings API(单次请求)\n */\n async function callEmbeddingAPI(request: EmbeddingRequest): Promise<HaiResult<EmbeddingResponse>> {\n const resolvedResult = resolveModelEntry(config.llm, 'embedding', request.model, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for embedding' } }),\n })\n if (!resolvedResult.success)\n return resolvedResult\n const resolved = resolvedResult.data\n\n const input = Array.isArray(request.input) ? request.input : [request.input]\n\n try {\n const client = getOrCreateClient(resolved)\n\n const params: Parameters<typeof client.embeddings.create>[0] = {\n model: resolved.model,\n input,\n }\n\n if (request.dimensions ?? embeddingConfig.dimensions) {\n params.dimensions = request.dimensions ?? embeddingConfig.dimensions\n }\n\n const response = await client.embeddings.create(params)\n\n return ok({\n model: response.model,\n data: response.data.map(item => ({\n index: item.index,\n embedding: item.embedding,\n })),\n usage: {\n prompt_tokens: response.usage.prompt_tokens,\n total_tokens: response.usage.total_tokens,\n },\n })\n }\n catch (error) {\n logger.error('Embedding API call failed', { error })\n return err(HaiAIError.EMBEDDING_API_ERROR, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n }\n\n /**\n * 对外统一嵌入入口:单条 / 批量都复用同一套分批逻辑\n */\n async function embedRequest(request: EmbeddingRequest): Promise<HaiResult<EmbeddingResponse>> {\n const input = Array.isArray(request.input) ? request.input : [request.input]\n const batchSize = embeddingConfig.batchSize\n\n // 如果输入不超过 batchSize,直接调用\n if (input.length <= batchSize) {\n return callEmbeddingAPI(request)\n }\n\n // 批量处理:按 batchSize 分组\n const allData: EmbeddingResponse['data'] = []\n let totalPromptTokens = 0\n let totalTokens = 0\n let resultModel = ''\n\n for (let i = 0; i < input.length; i += batchSize) {\n const batch = input.slice(i, i + batchSize)\n const result = await callEmbeddingAPI({ ...request, input: batch })\n if (!result.success)\n return result\n\n resultModel = result.data.model\n totalPromptTokens += result.data.usage.prompt_tokens\n totalTokens += result.data.usage.total_tokens\n\n // 调整 index 以反映全局位置\n for (const item of result.data.data) {\n allData.push({\n index: i + item.index,\n embedding: item.embedding,\n })\n }\n }\n\n return ok({\n model: resultModel,\n data: allData,\n usage: { prompt_tokens: totalPromptTokens, total_tokens: totalTokens },\n })\n }\n\n return {\n async embed(request: EmbeddingRequest): Promise<HaiResult<EmbeddingResponse>> {\n return embedRequest(request)\n },\n\n async embedText(text: string): Promise<HaiResult<number[]>> {\n const result = await embedRequest({ input: text })\n if (!result.success)\n return result\n const first = result.data.data.find(item => item.index === 0)\n if (!first) {\n return err(HaiAIError.EMBEDDING_API_ERROR, aiM('ai_internalError', { params: { error: 'Embedding result is empty' } }))\n }\n return ok(first.embedding)\n },\n\n async embedBatch(texts: string[]): Promise<HaiResult<number[][]>> {\n const result = await embedRequest({ input: texts })\n if (!result.success)\n return result\n const sorted = [...result.data.data].sort((a, b) => a.index - b.index)\n return ok(sorted.map(item => item.embedding))\n },\n }\n}\n","/**\n * @h-ai/ai — File 子功能实现\n *\n * 支持多格式文件内容提取:文本、HTML、PDF、DOCX 和 OCR 图片识别。\n * @module ai-file-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig } from '../ai-config.js'\n\nimport type { LLMOperations } from '../llm/ai-llm-types.js'\nimport type {\n FileOperations,\n FileParseMethod,\n FileParseRequest,\n FileParseResult,\n OutputFormat,\n} from './ai-file-types.js'\n\nimport { Buffer } from 'node:buffer'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'file' })\nconst HTML_SCRIPT_BLOCK_REGEX = /<script[^>]*>[\\s\\S]*?<\\/script[^>]*>/gi\nconst HTML_STYLE_BLOCK_REGEX = /<style[^>]*>[\\s\\S]*?<\\/style[^>]*>/gi\nconst HTML_LIST_OPEN_TAG_REGEX = /<[ou]l[^>]*>/gi\nconst HTML_LIST_CLOSE_TAG_REGEX = /<\\/[ou]l>/gi\nconst HTML_BOLD_TAG_REGEX = /<(?:strong|b)[^>]*>([\\s\\S]*?)<\\/(?:strong|b)>/gi\nconst HTML_ITALIC_TAG_REGEX = /<(?:em|i)[^>]*>([\\s\\S]*?)<\\/(?:em|i)>/gi\nconst HTML_LINK_TAG_REGEX = /<a[^>]+href=\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/a>/gi\nconst HTML_IMAGE_TAG_REGEX = /<img([^>]*)>/gi\nconst HTML_IMAGE_SRC_ATTR_REGEX = /src=\"([^\"]*)\"/\nconst HTML_IMAGE_ALT_ATTR_REGEX = /alt=\"([^\"]*)\"/\nconst HTML_INLINE_CODE_TAG_REGEX = /<code[^>]*>([\\s\\S]*?)<\\/code>/gi\nconst HTML_TABLE_ROW_REGEX = /<tr[^>]*>([\\s\\S]*?)<\\/tr>/gi\nconst HTML_TABLE_CELL_REGEX = /<t[dh][^>]*>([\\s\\S]*?)<\\/t[dh]>/gi\nconst HTML_TABLE_CONTAINER_TAG_REGEX = /<\\/?t(?:able|head|body|foot)[^>]*>/gi\nconst HTML_TABLE_ELEMENT_TAG_REGEX = /<\\/?t[rdh][^>]*>/gi\nconst HTML_LINE_BREAK_REGEX = /<br\\s*\\/?>/gi\nconst HTML_BLOCK_CLOSE_TAG_REGEX = /<\\/(?:p|div|section|article|header|footer|main|nav|aside)>/gi\nconst HTML_BLOCK_OPEN_TAG_REGEX = /<(?:p|div|section|article|header|footer|main|nav|aside)[^>]*>/gi\nconst HTML_ANY_TAG_REGEX = /<[^>]+>/g\nconst MULTI_LINE_BREAK_REGEX = /\\n{3,}/g\n\n// ─── MIME 类型与扩展名映射 ───\n\n/** 文本 MIME 类型集合(直接解码) */\nconst TEXT_MIME_TYPES = new Set([\n 'text/plain',\n 'text/markdown',\n 'text/x-markdown',\n 'text/csv',\n 'application/json',\n 'application/xml',\n 'text/xml',\n 'text/x-yaml',\n 'application/yaml',\n])\n\n/** 图片 MIME 类型集合(OCR) */\nconst IMAGE_MIME_TYPES = new Set([\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/bmp',\n 'image/tiff',\n])\n\n/** 文件扩展名 → MIME 类型映射 */\nconst EXT_TO_MIME: Record<string, string> = {\n txt: 'text/plain',\n md: 'text/markdown',\n markdown: 'text/markdown',\n csv: 'text/csv',\n json: 'application/json',\n xml: 'application/xml',\n yaml: 'text/x-yaml',\n yml: 'text/x-yaml',\n html: 'text/html',\n htm: 'text/html',\n pdf: 'application/pdf',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n doc: 'application/msword',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n tiff: 'image/tiff',\n tif: 'image/tiff',\n}\n\n/** 根据文件内容的 magic bytes 检测 MIME 类型 */\nfunction detectMimeFromMagicBytes(buffer: Buffer): string | undefined {\n if (buffer.length < 4)\n return undefined\n // PDF: %PDF\n if (buffer[0] === 0x25 && buffer[1] === 0x50 && buffer[2] === 0x44 && buffer[3] === 0x46) {\n return 'application/pdf'\n }\n // PNG: \\x89PNG\n if (buffer[0] === 0x89 && buffer[1] === 0x50 && buffer[2] === 0x4E && buffer[3] === 0x47) {\n return 'image/png'\n }\n // JPEG: \\xFF\\xD8\n if (buffer[0] === 0xFF && buffer[1] === 0xD8) {\n return 'image/jpeg'\n }\n // GIF: GIF8\n if (buffer[0] === 0x47 && buffer[1] === 0x49 && buffer[2] === 0x46 && buffer[3] === 0x38) {\n return 'image/gif'\n }\n // RIFF/WebP\n if (\n buffer[0] === 0x52 && buffer[1] === 0x49 && buffer[2] === 0x46 && buffer[3] === 0x46\n && buffer.length >= 12 && buffer[8] === 0x57 && buffer[9] === 0x45 && buffer[10] === 0x42 && buffer[11] === 0x50\n ) {\n return 'image/webp'\n }\n // ZIP (DOCX is ZIP-based): PK\\x03\\x04\n if (buffer[0] === 0x50 && buffer[1] === 0x4B && buffer[2] === 0x03 && buffer[3] === 0x04) {\n return 'application/zip'\n }\n return undefined\n}\n\n/**\n * 检测文件 MIME 类型\n *\n * 优先顺序:显式指定 > 文件名扩展名 > magic bytes > 默认 text/plain\n */\nfunction detectMimeType(content: Buffer | string, filename?: string, explicitMime?: string): string {\n if (explicitMime)\n return explicitMime.toLowerCase()\n\n if (filename) {\n const ext = filename.split('.').pop()?.toLowerCase()\n if (ext && ext in EXT_TO_MIME) {\n return EXT_TO_MIME[ext]\n }\n }\n\n if (Buffer.isBuffer(content)) {\n const detected = detectMimeFromMagicBytes(content)\n if (detected)\n return detected\n }\n\n return 'text/plain'\n}\n\n/**\n * 解析文本格式内容(UTF-8 解码)\n */\nfunction parseTextContent(content: Buffer | string): string {\n if (typeof content === 'string')\n return content\n return content.toString('utf-8')\n}\n\n/** HTML 实体名称映射表 */\nconst HTML_ENTITIES: Record<string, string> = {\n amp: '&',\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: '\\'',\n nbsp: ' ',\n mdash: '—',\n ndash: '–',\n ldquo: '\\u201C',\n rdquo: '\\u201D',\n lsquo: '\\u2018',\n rsquo: '\\u2019',\n hellip: '…',\n copy: '©',\n reg: '®',\n trade: '™',\n}\n\n/** 解码 HTML 实体(命名实体 + 十进制/十六进制数字实体) */\nfunction decodeHtmlEntities(text: string): string {\n return text.replace(/&(?:#(\\d+)|#x([\\dA-Fa-f]+)|([A-Za-z]+));/g, (match, dec, hex, named) => {\n if (dec !== undefined)\n return String.fromCharCode(Number.parseInt(dec, 10))\n if (hex !== undefined)\n return String.fromCharCode(Number.parseInt(hex, 16))\n return HTML_ENTITIES[named] ?? match\n })\n}\n\n/** 剥除 HTML 标签,仅保留文本内容 */\nfunction stripTags(html: string): string {\n return html.replace(HTML_ANY_TAG_REGEX, '')\n}\n\n/**\n * 解析 HTML,剥除标签并提取纯文本\n */\nfunction parseHtmlContent(content: Buffer | string): string {\n const html = parseTextContent(content)\n const noScript = html.replace(HTML_SCRIPT_BLOCK_REGEX, ' ')\n const noStyle = noScript.replace(HTML_STYLE_BLOCK_REGEX, ' ')\n const noTags = noStyle.replace(HTML_ANY_TAG_REGEX, ' ')\n return decodeHtmlEntities(noTags).replace(/\\s+/g, ' ').trim()\n}\n\n/**\n * 将 HTML 转换为 Markdown\n *\n * 保留常见文档结构:标题、列表、粗体/斜体、超链接、代码块、水平线。\n * 不支持的复杂结构(如嵌套表格、内联样式)将降级为纯文本。\n */\nfunction htmlToMarkdown(content: Buffer | string): string {\n let md = parseTextContent(content)\n\n // 移除 script / style 块\n md = md.replace(HTML_SCRIPT_BLOCK_REGEX, '')\n md = md.replace(HTML_STYLE_BLOCK_REGEX, '')\n\n // 代码块(pre > code,先处理避免内部标签被转换)\n md = md.replace(/<pre[^>]*>\\s*<code[^>]*>([\\s\\S]*?)<\\/code>\\s*<\\/pre>/gi, (_, code) =>\n `\\n\\`\\`\\`\\n${decodeHtmlEntities(stripTags(code)).trim()}\\n\\`\\`\\`\\n`)\n md = md.replace(/<pre[^>]*>([\\s\\S]*?)<\\/pre>/gi, (_, code) =>\n `\\n\\`\\`\\`\\n${decodeHtmlEntities(stripTags(code)).trim()}\\n\\`\\`\\`\\n`)\n\n // 标题 h1–h6\n for (let level = 1; level <= 6; level++) {\n md = md.replace(\n new RegExp(`<h${level}[^>]*>([\\\\s\\\\S]*?)<\\\\/h${level}>`, 'gi'),\n (_, c) => `\\n${'#'.repeat(level)} ${stripTags(c).trim()}\\n`,\n )\n }\n\n // 水平线\n md = md.replace(/<hr\\s*\\/?>/gi, '\\n\\n---\\n\\n')\n\n // 引用块\n md = md.replace(/<blockquote[^>]*>([\\s\\S]*?)<\\/blockquote>/gi, (_, c) =>\n stripTags(c).trim().split('\\n').map(l => `> ${l.trim()}`).filter(l => l !== '> ').join('\\n'))\n\n // 列表项\n md = md.replace(HTML_LIST_OPEN_TAG_REGEX, '\\n')\n md = md.replace(HTML_LIST_CLOSE_TAG_REGEX, '\\n')\n md = md.replace(/<li[^>]*>([\\s\\S]*?)<\\/li>/gi, (_, c) => `\\n- ${stripTags(c).trim()}`)\n\n // 粗体 / 斜体\n md = md.replace(HTML_BOLD_TAG_REGEX, (_, c) => `**${stripTags(c).trim()}**`)\n md = md.replace(HTML_ITALIC_TAG_REGEX, (_, c) => `*${stripTags(c).trim()}*`)\n\n // 超链接\n md = md.replace(HTML_LINK_TAG_REGEX, (_, href, text) =>\n `[${stripTags(text).trim()}](${href})`)\n\n // 图片(src/alt 属性顺序不定,逐属性提取)\n md = md.replace(HTML_IMAGE_TAG_REGEX, (_, attrs: string) => {\n const src = attrs.match(HTML_IMAGE_SRC_ATTR_REGEX)?.[1] ?? ''\n const alt = attrs.match(HTML_IMAGE_ALT_ATTR_REGEX)?.[1] ?? ''\n return ``\n })\n\n // 行内代码\n md = md.replace(HTML_INLINE_CODE_TAG_REGEX, (_, c) =>\n `\\`${decodeHtmlEntities(stripTags(c))}\\``)\n\n // 表格(简化:每行单元格用 | 分隔)\n md = md.replace(HTML_TABLE_ROW_REGEX, (_, row) => {\n const cells = [...row.matchAll(HTML_TABLE_CELL_REGEX)]\n return `| ${cells.map(([, c]) => stripTags(c).trim()).join(' | ')} |\\n`\n })\n md = md.replace(HTML_TABLE_CONTAINER_TAG_REGEX, '')\n md = md.replace(HTML_TABLE_ELEMENT_TAG_REGEX, '')\n\n // 换行与段落\n md = md.replace(HTML_LINE_BREAK_REGEX, '\\n')\n md = md.replace(HTML_BLOCK_CLOSE_TAG_REGEX, '\\n\\n')\n md = md.replace(HTML_BLOCK_OPEN_TAG_REGEX, '')\n\n // 移除剩余标签并解码实体\n md = md.replace(HTML_ANY_TAG_REGEX, '')\n md = decodeHtmlEntities(md)\n\n return md.replace(MULTI_LINE_BREAK_REGEX, '\\n\\n').trim()\n}\n\n/**\n * 使用 pdfjs-dist 解析 PDF 内容\n */\nasync function parsePdfContent(content: Buffer, outputFormat: OutputFormat = 'text', maxPages?: number): Promise<HaiResult<{ text: string, pageCount: number }>> {\n try {\n const pdfjs = await import(\n\n // @ts-expect-error — pdfjs-dist is an optional peer dependency\n 'pdfjs-dist/legacy/build/pdf.mjs',\n ) as { getDocument: (...args: unknown[]) => { promise: Promise<unknown> } }\n const loadingTask = pdfjs.getDocument({ data: new Uint8Array(content) })\n const pdf = await loadingTask.promise as {\n numPages: number\n getPage: (n: number) => Promise<{ getTextContent: () => Promise<{ items: Array<{ str?: string }> }> }>\n }\n const totalPages = pdf.numPages\n const pagesToProcess = maxPages ? Math.min(maxPages, totalPages) : totalPages\n const textParts: string[] = []\n\n for (let i = 1; i <= pagesToProcess; i++) {\n const page = await pdf.getPage(i)\n const textContent = await page.getTextContent()\n const pageText = textContent.items\n .map(item => item.str ?? '')\n .join(' ')\n textParts.push(pageText)\n }\n\n // markdown 模式用页分隔线区分每页\n const separator = outputFormat === 'markdown' ? '\\n\\n---\\n\\n' : '\\n\\n'\n return ok({ text: textParts.join(separator), pageCount: totalPages })\n }\n catch (error) {\n return err(HaiAIError.FILE_PARSE_FAILED, aiM('ai_fileParseFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 使用 mammoth 解析 DOCX 内容\n *\n * - `'text'`:使用 `extractRawText` 提取纯文本\n * - `'markdown'`:使用 `convertToHtml` 后转换为 Markdown\n */\nasync function parseDocxContent(content: Buffer, outputFormat: OutputFormat = 'text'): Promise<HaiResult<string>> {\n try {\n const mammoth = await import(\n\n // @ts-expect-error — mammoth is an optional peer dependency\n 'mammoth',\n ) as {\n extractRawText: (options: unknown) => Promise<{ value: string }>\n convertToHtml: (options: unknown) => Promise<{ value: string }>\n }\n if (outputFormat === 'markdown') {\n const result = await mammoth.convertToHtml({ buffer: content })\n return ok(htmlToMarkdown(result.value))\n }\n const result = await mammoth.extractRawText({ buffer: content })\n return ok(result.value)\n }\n catch (error) {\n return err(HaiAIError.FILE_PARSE_FAILED, aiM('ai_fileParseFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 使用视觉 LLM 进行 OCR 图片识别\n */\nasync function parseImageWithOcr(\n content: Buffer,\n mimeType: string,\n llmOps: LLMOperations,\n model?: string,\n outputFormat: OutputFormat = 'text',\n customPrompt?: string,\n): Promise<HaiResult<string>> {\n const base64 = content.toString('base64')\n const dataUrl = `data:${mimeType};base64,${base64}`\n const defaultPrompt = outputFormat === 'markdown'\n ? 'Please extract all text content from this image as Markdown, preserving document structure (headings, bullet lists, bold/italic). Return only the Markdown without additional commentary.'\n : 'Please extract all text content from this image accurately. Return only the extracted text without any additional commentary.'\n const prompt = customPrompt ?? defaultPrompt\n\n logger.trace('Running OCR via vision LLM', { mimeType, model })\n\n const result = await llmOps.chat({\n model,\n messages: [\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: { url: dataUrl, detail: 'high' },\n },\n {\n type: 'text',\n text: prompt,\n },\n ],\n },\n ],\n })\n\n if (!result.success) {\n return err(HaiAIError.FILE_OCR_FAILED, aiM('ai_fileOcrFailed', { params: { error: result.error.message } }), result.error)\n }\n\n return ok(result.data.choices[0]?.message?.content ?? '')\n}\n\n/**\n * 创建 File 操作接口\n *\n * @param config - 校验后的 AI 配置\n * @param llmOps - LLM 操作接口(用于 OCR)\n * @returns FileOperations 实例\n */\nexport function createFileOperations(config: AIConfig, llmOps: LLMOperations): FileOperations {\n /**\n * 统一 OCR 执行入口:解析模型配置 → 调用视觉 LLM → 包装结果\n *\n * 调用方负责确保 content 为 Buffer 类型。\n */\n async function runOcr(\n content: Buffer,\n mimeType: string,\n filename: string | undefined,\n model: string | undefined,\n outputFormat: OutputFormat,\n systemPrompt: string | undefined,\n ): Promise<HaiResult<FileParseResult>> {\n const resolvedResult = resolveModelEntry(config.llm, 'ocr', model, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for OCR' } }),\n })\n if (!resolvedResult.success)\n return resolvedResult\n\n const ocrResult = await parseImageWithOcr(\n content,\n mimeType,\n llmOps,\n resolvedResult.data.model,\n outputFormat,\n systemPrompt,\n )\n if (!ocrResult.success)\n return ocrResult\n\n return ok({\n text: ocrResult.data,\n method: 'ocr' as FileParseMethod,\n metadata: { filename, mimeType, charCount: ocrResult.data.length },\n })\n }\n\n /**\n * 核心解析逻辑\n */\n async function doParse(request: FileParseRequest): Promise<HaiResult<FileParseResult>> {\n const { content, filename, options = {} } = request\n const mimeType = detectMimeType(content, filename, options.mimeType)\n const outputFormat: OutputFormat = options.outputFormat ?? 'text'\n\n logger.trace('Parsing file', { filename, mimeType, outputFormat, useOcr: options.useOcr })\n\n // 强制 OCR 模式\n if (options.useOcr) {\n if (!Buffer.isBuffer(content)) {\n return err(HaiAIError.FILE_INVALID_CONTENT, aiM('ai_fileInvalidContent', { params: { reason: 'OCR requires Buffer content' } }))\n }\n return runOcr(content, mimeType, filename, options.model, outputFormat, options.systemPrompt)\n }\n\n // 文本格式:直接解码(markdown 不改变纯文本语义)\n if (TEXT_MIME_TYPES.has(mimeType)) {\n const text = parseTextContent(content)\n return ok({\n text,\n method: 'text' as FileParseMethod,\n metadata: { filename, mimeType, charCount: text.length },\n })\n }\n\n // HTML:按输出格式选择解析方式\n if (mimeType === 'text/html') {\n const text = outputFormat === 'markdown' ? htmlToMarkdown(content) : parseHtmlContent(content)\n return ok({\n text,\n method: 'html' as FileParseMethod,\n metadata: { filename, mimeType, charCount: text.length },\n })\n }\n\n // PDF:尝试 pdfjs-dist,失败则回退 OCR\n if (mimeType === 'application/pdf') {\n if (!Buffer.isBuffer(content)) {\n return err(HaiAIError.FILE_INVALID_CONTENT, aiM('ai_fileInvalidContent', { params: { reason: 'PDF parsing requires Buffer content' } }))\n }\n const pdfResult = await parsePdfContent(content, outputFormat, options.maxPages)\n if (pdfResult.success) {\n return ok({\n text: pdfResult.data.text,\n method: 'pdf' as FileParseMethod,\n pageCount: pdfResult.data.pageCount,\n metadata: { filename, mimeType, charCount: pdfResult.data.text.length },\n })\n }\n logger.warn('PDF native parser failed, falling back to OCR', { filename })\n return runOcr(content, mimeType, filename, options.model, outputFormat, options.systemPrompt)\n }\n\n // DOCX:尝试 mammoth,失败则回退 OCR\n if (\n mimeType === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n || mimeType === 'application/msword'\n || mimeType === 'application/zip'\n ) {\n if (!Buffer.isBuffer(content)) {\n return err(HaiAIError.FILE_INVALID_CONTENT, aiM('ai_fileInvalidContent', { params: { reason: 'DOCX parsing requires Buffer content' } }))\n }\n const docxResult = await parseDocxContent(content, outputFormat)\n if (docxResult.success) {\n return ok({\n text: docxResult.data,\n method: 'docx' as FileParseMethod,\n metadata: { filename, mimeType, charCount: docxResult.data.length },\n })\n }\n logger.warn('DOCX native parser failed, falling back to OCR', { filename })\n return runOcr(content, mimeType, filename, options.model, outputFormat, options.systemPrompt)\n }\n\n // 图片格式:OCR\n if (IMAGE_MIME_TYPES.has(mimeType)) {\n if (!Buffer.isBuffer(content)) {\n return err(HaiAIError.FILE_INVALID_CONTENT, aiM('ai_fileInvalidContent', { params: { reason: 'Image OCR requires Buffer content' } }))\n }\n return runOcr(content, mimeType, filename, options.model, outputFormat, options.systemPrompt)\n }\n\n // 其他格式:不支持\n return err(HaiAIError.FILE_UNSUPPORTED_FORMAT, aiM('ai_fileUnsupportedFormat', { params: { mimeType } }))\n }\n\n return {\n async parse(request: FileParseRequest): Promise<HaiResult<FileParseResult>> {\n try {\n return await doParse(request)\n }\n catch (error) {\n logger.error('File parse failed unexpectedly', { filename: request.filename, error })\n return err(HaiAIError.FILE_PARSE_FAILED, aiM('ai_fileParseFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async parseText(content: Buffer | string, filename?: string): Promise<HaiResult<string>> {\n const result = await this.parse({ content, filename })\n if (!result.success)\n return result\n return ok(result.data.text)\n },\n }\n}\n","/**\n * @h-ai/ai — Knowledge 实体提取\n *\n * 使用 LLM 从文本中提取命名实体(人名、项目名、概念等)。\n * @module ai-knowledge-entity\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { LLMOperations } from '../llm/ai-llm-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'knowledge-entity' })\nconst LEADING_MARKDOWN_FENCE_REGEX = /^```(?:json)?\\n?/\nconst TRAILING_MARKDOWN_FENCE_REGEX = /\\n?```$/\n\n// ─── 提取结果类型 ───\n\n/**\n * LLM 实体提取结果(单条)\n */\nexport interface ExtractedEntity {\n /** 实体名称 */\n name: string\n /** 实体类型(内置类型或用户自定义类型) */\n type: string\n /** 别名列表 */\n aliases?: string[]\n /** 简短描述 */\n description?: string\n}\n\n// ─── Prompt ───\n\n/** 默认实体类型列表 */\nexport const DEFAULT_ENTITY_TYPES = ['person', 'project', 'concept', 'organization', 'location', 'event', 'other']\n\n/**\n * 根据实体类型列表生成实体提取系统提示词\n */\nfunction buildEntityExtractionPrompt(entityTypes: string[]): string {\n const typeList = entityTypes.map(t => `\"${t}\"`).join(', ')\n return `You are a named entity extraction assistant. Extract named entities from the given text.\n\nReturn a JSON array of entities. Each entity has:\n- \"name\": the primary name (string, required)\n- \"type\": one of ${typeList} (required)\n- \"aliases\": alternative names or abbreviations (string array, optional)\n- \"description\": a one-sentence description (string, optional)\n\nRules:\n- Only extract clearly mentioned entities. Do NOT infer or guess.\n- Deduplicate: if the same entity appears with different names, merge into one entry with aliases.\n- Be precise and concise.\n- Return an empty array [] if no entities are found.\n- Return ONLY the JSON array, no markdown fences, no explanation.`\n}\n\n/**\n * 从文本中提取实体\n *\n * 调用 LLM 分析文本,返回结构化的实体列表。\n *\n * @param llm - LLM 操作接口\n * @param text - 待提取的文本(通常是单个 chunk 的内容)\n * @param model - 模型名称覆盖(可选)\n * @param entityTypes - 实体类型列表(可选,默认使用内置类型)\n * @param systemPrompt - 系统提示词覆盖(可选,默认根据 entityTypes 自动生成)\n * @returns 提取到的实体列表\n */\nexport async function extractEntities(\n llm: LLMOperations,\n text: string,\n model?: string,\n entityTypes?: string[],\n systemPrompt?: string,\n): Promise<HaiResult<ExtractedEntity[]>> {\n if (!text.trim()) {\n return ok([])\n }\n\n const resolvedTypes = entityTypes ?? DEFAULT_ENTITY_TYPES\n const resolvedPrompt = systemPrompt ?? buildEntityExtractionPrompt(resolvedTypes)\n\n try {\n const chatResult = await llm.chat({\n model,\n messages: [\n { role: 'system', content: resolvedPrompt },\n { role: 'user', content: text },\n ],\n temperature: 0.1,\n enablePersist: false,\n })\n\n if (!chatResult.success) {\n logger.warn('Entity extraction LLM call failed', { error: chatResult.error })\n return err(HaiAIError.KNOWLEDGE_ENTITY_EXTRACT_FAILED, aiM('ai_knowledgeEntityExtractFailed', { params: { error: String(chatResult.error.message) } }), chatResult.error)\n }\n\n const content = chatResult.data.choices[0]?.message?.content ?? ''\n\n // 解析 JSON 响应\n const validTypes = new Set(resolvedTypes)\n const entities = parseEntityResponse(content, validTypes)\n logger.trace('Entity extraction completed', { textLength: text.length, entityCount: entities.length })\n\n return ok(entities)\n }\n catch (error) {\n logger.error('Entity extraction failed', { error })\n return err(HaiAIError.KNOWLEDGE_ENTITY_EXTRACT_FAILED, aiM('ai_knowledgeEntityExtractFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 解析 LLM 返回的实体 JSON\n *\n * 容错处理:去除 markdown 代码围栏、尝试 JSON.parse。\n */\nfunction parseEntityResponse(content: string, validTypes: Set<string>): ExtractedEntity[] {\n let cleaned = content.trim()\n\n // 去除 markdown 代码围栏\n if (cleaned.startsWith('```')) {\n cleaned = cleaned.replace(LEADING_MARKDOWN_FENCE_REGEX, '').replace(TRAILING_MARKDOWN_FENCE_REGEX, '')\n }\n\n try {\n const parsed = JSON.parse(cleaned) as unknown\n\n // 可能是数组\n if (Array.isArray(parsed)) {\n return parsed\n .filter(isValidEntity)\n .map(e => normalizeEntity(e, validTypes))\n }\n\n // 可能是 { entities: [...] } 包装\n if (typeof parsed === 'object' && parsed !== null && 'entities' in parsed) {\n const entities = (parsed as { entities: unknown }).entities\n if (Array.isArray(entities)) {\n return entities.filter(isValidEntity).map(e => normalizeEntity(e, validTypes))\n }\n }\n\n logger.warn('Entity extraction returned unexpected format', { content: content.slice(0, 200) })\n return []\n }\n catch {\n logger.warn('Entity extraction returned invalid JSON', { content: content.slice(0, 200) })\n return []\n }\n}\n\n/**\n * 校验实体结构\n */\nfunction isValidEntity(item: unknown): item is Record<string, unknown> {\n if (typeof item !== 'object' || item === null)\n return false\n const obj = item as Record<string, unknown>\n return typeof obj.name === 'string' && obj.name.length > 0\n && typeof obj.type === 'string'\n}\n\n/**\n * 标准化实体\n *\n * @param item - 原始实体对象\n * @param validTypes - 合法类型集合(不在集合内的归为 'other')\n */\nfunction normalizeEntity(item: Record<string, unknown>, validTypes: Set<string>): ExtractedEntity {\n const type = validTypes.has(item.type as string) ? item.type as string : 'other'\n\n return {\n name: (item.name as string).trim(),\n type,\n aliases: Array.isArray(item.aliases) ? (item.aliases as string[]).map(String) : undefined,\n description: typeof item.description === 'string' ? item.description.trim() : undefined,\n }\n}\n\n/**\n/**\n * 批量提取实体并去重合并\n *\n * 对多个 chunk 并发提取,合并同名实体。\n *\n * @param llm - LLM 操作接口\n * @param chunks - 文本块列表\n * @param model - 模型名称覆盖(可选)\n * @param entityTypes - 实体类型列表(可选,默认使用内置类型)\n * @param systemPrompt - 系统提示词覆盖(可选)\n * @param concurrency - 并发数(默认 3)\n * @returns 去重合并后的实体列表\n */\nexport async function extractEntitiesBatch(\n llm: LLMOperations,\n chunks: Array<{ content: string, chunkId: string }>,\n model?: string,\n entityTypes?: string[],\n systemPrompt?: string,\n concurrency = 3,\n): Promise<HaiResult<Array<ExtractedEntity & { chunkIds: string[] }>>> {\n // 简单并发控制:按批次执行\n const allEntities: Array<{ entity: ExtractedEntity, chunkId: string }> = []\n\n for (let i = 0; i < chunks.length; i += concurrency) {\n const batch = chunks.slice(i, i + concurrency)\n const results = await Promise.all(\n batch.map(async (chunk) => {\n const result = await extractEntities(llm, chunk.content, model, entityTypes, systemPrompt)\n if (result.success) {\n return result.data.map(e => ({ entity: e, chunkId: chunk.chunkId }))\n }\n logger.warn('Entity extraction failed for chunk', { chunkId: chunk.chunkId })\n return []\n }),\n )\n\n for (const entities of results) {\n allEntities.push(...entities)\n }\n }\n\n // 去重合并:按名称(忽略大小写)分组\n const entityMap = new Map<string, ExtractedEntity & { chunkIds: string[] }>()\n\n for (const { entity, chunkId } of allEntities) {\n const key = entity.name.toLowerCase()\n const existing = entityMap.get(key)\n\n if (existing) {\n // 合并 chunkIds\n if (!existing.chunkIds.includes(chunkId)) {\n existing.chunkIds.push(chunkId)\n }\n // 合并别名\n if (entity.aliases) {\n const existingAliases = new Set(existing.aliases ?? [])\n for (const alias of entity.aliases) {\n existingAliases.add(alias)\n }\n existing.aliases = Array.from(existingAliases)\n }\n // 使用更详细的描述\n if (entity.description && (!existing.description || entity.description.length > existing.description.length)) {\n existing.description = entity.description\n }\n }\n else {\n entityMap.set(key, { ...entity, chunkIds: [chunkId] })\n }\n }\n\n return ok(Array.from(entityMap.values()))\n}\n","/**\n * @h-ai/ai — Knowledge 子功能实现\n *\n * 编排 datapipe + KnowledgeStore + embedding + LLM,\n * 实现文档导入、实体索引、信源追踪检索。\n * @module ai-knowledge-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ChunkOptionsInput, CleanOptionsInput, DatapipeFunctions } from '@h-ai/datapipe'\nimport type { KnowledgeConfig } from '../ai-config.js'\n\nimport type { EmbeddingOperations } from '../embedding/ai-embedding-types.js'\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type { Citation } from '../retrieval/ai-retrieval-types.js'\nimport type { KnowledgeStore } from '../store/ai-store-types.js'\nimport type {\n EntityDocumentResult,\n EntityListOptions,\n EntityQueryOptions,\n KnowledgeAskOptions,\n KnowledgeAskResult,\n KnowledgeDocumentInfo,\n KnowledgeDocumentListOptions,\n KnowledgeDocumentRemoveOptions,\n KnowledgeEntity,\n KnowledgeIngestBatchProgress,\n KnowledgeIngestBatchResult,\n KnowledgeIngestFileInput,\n KnowledgeIngestInput,\n KnowledgeIngestResult,\n KnowledgeOperations,\n KnowledgeRetrieveItem,\n KnowledgeRetrieveOptions,\n KnowledgeRetrieveResult,\n KnowledgeSetupOptions,\n} from './ai-knowledge-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { nanoid } from 'nanoid'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { extractEntities, extractEntitiesBatch } from './ai-knowledge-entity.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'knowledge' })\n\n// ─── 默认提示词 ───\n\nconst DEFAULT_KNOWLEDGE_ASK_SYSTEM_PROMPT = `You are an expert assistant. Answer the user's question based ONLY on the provided context.\n\nRules:\n- Cite sources using [N] notation where N matches the context item number.\n- If the context doesn't contain enough information, say so honestly.\n- Be precise and factual.\n- Prefer direct quotes when appropriate.`\n\n/**\n * 创建 Knowledge 操作接口\n *\n * 编排 datapipe → embedding → KnowledgeStore(向量存储 + 实体倒排索引),\n * 实现文档导入、语义检索与实体增强。\n *\n * @param config - Knowledge 配置(分块策略、向量集合、实体提取开关等)\n * @param llm - LLM 操作(用于实体提取和问答生成)\n * @param embedding - Embedding 操作(用于文本向量化)\n * @param datapipe - datapipe 实例(必选,用于文本清洗与分块)\n * @param store - KnowledgeStore 实例(可选,未提供时 knowledge 子系统不可用)\n * @returns KnowledgeOperations 实例\n */\nexport function createKnowledgeOperations(\n config: KnowledgeConfig,\n llm: LLMOperations,\n embedding: EmbeddingOperations,\n datapipe: DatapipeFunctions,\n store?: KnowledgeStore,\n): KnowledgeOperations {\n /**\n * 检查 collection 是否已就绪(cache-aside:先查进程内缓存,未命中则查 DB 注册表并回填缓存)\n *\n * 支持多节点场景:其他节点完成 setup 后,本节点通过 DB 查询亦可感知。\n */\n async function isCollectionReady(collection: string): Promise<boolean> {\n if (!store)\n return false\n return await store.collectionExists(collection)\n }\n\n return {\n // ─── setup ───\n /**\n * 初始化知识库(幂等,支持多次调用以初始化不同 collection)\n *\n * 创建 vecdb 集合(已存在则跳过)和 reldb 实体索引表(DDL 幂等)。\n * **每个 collection 在使用 `ingest` / `retrieve` / `ask` 前必须先对该 collection 执行 `setup`。**\n * 多分场景下可多次调用本方法,每次传入不同 `collection` 名称。\n *\n * @param options - 可选覆盖(collection 名称、向量维度)\n * @returns `ok(undefined)` 成功;建表失败时返回 `KNOWLEDGE_SETUP_FAILED`\n */\n async setup(options?: KnowledgeSetupOptions): Promise<HaiResult<void>> {\n if (!store) {\n return err(HaiAIError.KNOWLEDGE_SETUP_FAILED, aiM('ai_knowledgeSetupFailed', { params: { error: 'KnowledgeStore not available. Provider may not support knowledge operations.' } }))\n }\n\n const collection = options?.collection ?? config.collection\n const dimension = options?.dimension ?? config.dimension\n\n logger.debug('Setting up knowledge base', { collection, dimension })\n\n try {\n await store.initialize(collection, dimension)\n await store.registerCollection(collection, dimension)\n\n logger.debug('Knowledge base setup completed', { collection })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Knowledge base setup failed', { error })\n return err(HaiAIError.KNOWLEDGE_SETUP_FAILED, aiM('ai_knowledgeSetupFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── ingest ───\n /**\n * 导入文档到知识库\n *\n * 流程:清洗 → 分块 → Embedding 向量化 → 存入 vecdb;\n * 可选地提取命名实体并建立倒排索引(实体增强相关度)。\n *\n * @param input - 导入输入(documentId、content、可选 cleanOptions / chunkOptions / metadata 等)\n * @returns `ok(KnowledgeIngestResult)` 含导入信息;未初始化时返回 `KNOWLEDGE_NOT_SETUP`\n *\n * @example\n * ```ts\n * await knowledge.ingest({\n * documentId: 'doc-001',\n * content: '文章内容...',\n * chunkOptions: { maxSize: 512 },\n * })\n * ```\n */\n async ingest(input: KnowledgeIngestInput): Promise<HaiResult<KnowledgeIngestResult>> {\n const collection = input.collection ?? config.collection\n if (!await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n const startTime = Date.now()\n const enableEntityExtraction = input.enableEntityExtraction ?? config.enableEntityExtraction\n // 合并 config 默认值与 input 覆盖选项(input 优先级更高)\n const cleanOptions: CleanOptionsInput = {\n ...config.cleanOptions,\n ...input.cleanOptions,\n }\n const chunkOptions: ChunkOptionsInput = {\n ...config.chunkOptions,\n ...input.chunkOptions,\n }\n\n logger.trace('Ingesting document', { documentId: input.documentId, collection, contentLength: input.content.length })\n\n try {\n // ① 清洗:标准化文本(去 HTML、空白规整等)\n const cleanResult = datapipe.clean(input.content, cleanOptions)\n const cleanedText = cleanResult.success ? cleanResult.data : input.content\n\n // ② 分块:按指定策略切割(分块失败退回整文本单一 chunk)\n const chunkResult = datapipe.chunk(cleanedText, chunkOptions)\n const chunks: Array<{ index: number, content: string, metadata?: Record<string, unknown> }> = chunkResult.success\n ? chunkResult.data\n : [{ index: 0, content: cleanedText }]\n\n // ③ 批量向量化\n const texts = chunks.map(c => c.content)\n const embedResult = await embedding.embedBatch(texts)\n if (!embedResult.success) {\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: 'Embedding failed' } }), embedResult.error)\n }\n\n // ④ 存入 vecdb\n const vectorDocuments = chunks.map((chunk, i) => {\n const chunkId = `${input.documentId}:chunk-${chunk.index}`\n return {\n id: chunkId,\n vector: embedResult.data[i],\n content: chunk.content,\n metadata: {\n ...input.metadata,\n ...chunk.metadata,\n documentId: input.documentId,\n title: input.title,\n url: input.url,\n position: `chunk:${chunk.index}`,\n chunkIndex: chunk.index,\n },\n }\n })\n\n await store!.upsertVectors(collection, vectorDocuments)\n\n // ④.b 记录文档元数据\n await store!.upsertDocument({\n documentId: input.documentId,\n collection,\n title: input.title,\n url: input.url,\n chunkCount: chunks.length,\n createdAt: Date.now(),\n })\n\n // ⑤ 实体提取(可选)\n const extractedEntities: KnowledgeEntity[] = []\n\n if (enableEntityExtraction) {\n const chunkInputs = chunks.map(chunk => ({\n content: chunk.content,\n chunkId: `${input.documentId}:chunk-${chunk.index}`,\n }))\n\n const entityResult = await extractEntitiesBatch(llm, chunkInputs, undefined, config.entityTypes, config.systemPrompt)\n if (entityResult.success) {\n // ⑥ 写入 reldb\n for (const entity of entityResult.data) {\n const entityId = `ent-${nanoid(12)}`\n const knowledgeEntity: KnowledgeEntity = {\n id: entityId,\n name: entity.name,\n type: entity.type,\n aliases: entity.aliases,\n description: entity.description,\n }\n extractedEntities.push(knowledgeEntity)\n\n // 插入实体\n await store!.upsertEntity({\n id: entityId,\n name: entity.name,\n type: entity.type,\n collection,\n aliases: entity.aliases,\n description: entity.description,\n })\n\n // 插入文档-实体关联(每个命中的 chunkId 建一条倒排记录)\n for (const chunkId of entity.chunkIds) {\n await store!.insertEntityDocument({\n entityId,\n documentId: input.documentId,\n chunkId,\n collection,\n relevance: 1.0,\n context: chunks.find(c => `${input.documentId}:chunk-${c.index}` === chunkId)?.content?.slice(0, 200),\n })\n }\n }\n }\n else {\n logger.warn('Entity extraction failed, skipping', { error: entityResult.error })\n }\n }\n\n const duration = Date.now() - startTime\n logger.debug('Document ingested', {\n documentId: input.documentId,\n chunkCount: chunks.length,\n entityCount: extractedEntities.length,\n duration,\n })\n\n return ok({\n documentId: input.documentId,\n chunkCount: chunks.length,\n entities: extractedEntities,\n duration,\n })\n }\n catch (error) {\n logger.error('Document ingestion failed', { documentId: input.documentId, error })\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── retrieve ───\n /**\n * 语义检索知识库\n *\n * 1. 将查询向量化 → 2. vecdb 向量搜索 → 3. 实体增强(可选):\n * LLM 提取查询中的命名实体,查实体倒排索引对匹配文档加权重排。\n *\n * @param query - 查询文本\n * @param options - 可选(collection、topK、minScore、enableEntityBoost、filter 等)\n * @returns `ok(KnowledgeRetrieveResult)` 含检索项和引用列表;未初始化时返回 `KNOWLEDGE_NOT_SETUP`\n */\n async retrieve(query: string, options?: KnowledgeRetrieveOptions): Promise<HaiResult<KnowledgeRetrieveResult>> {\n const collection = options?.collection ?? config.collection\n if (!await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n const startTime = Date.now()\n const topK = options?.topK ?? 10\n const enableEntityBoost = options?.enableEntityBoost ?? true\n\n logger.trace('Knowledge retrieval', { query: query.slice(0, 100), collection, topK })\n\n try {\n // ① 向量化查询\n const embedResult = await embedding.embedText(query)\n if (!embedResult.success) {\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: 'Query embedding failed' } }), embedResult.error)\n }\n\n // ② 向量搜索\n const searchHits = await store!.searchVectors(collection, embedResult.data, {\n topK: topK * 2, // 多取一些,后续合并后再截断\n minScore: options?.minScore,\n filter: options?.filter,\n })\n\n // 构建结果项\n const itemMap = new Map<string, KnowledgeRetrieveItem>()\n for (const hit of searchHits) {\n const metadata = hit.metadata ?? {}\n const citation: Citation = {\n documentId: metadata.documentId as string | undefined,\n title: metadata.title as string | undefined,\n url: metadata.url as string | undefined,\n position: metadata.position as string | undefined,\n chunkId: hit.id,\n collection,\n }\n\n itemMap.set(hit.id, {\n id: hit.id,\n content: hit.content ?? '',\n score: hit.score,\n citation,\n metadata,\n matchedEntities: [],\n })\n }\n\n // ③ 实体增强(可选):先用 LLM 从查询中提取命名实体,再查倒排索引对向量结果加权\n if (enableEntityBoost) {\n const queryEntityResult = await extractEntities(\n llm,\n query,\n undefined,\n config.entityTypes,\n config.systemPrompt,\n )\n const queryEntityNames = queryEntityResult.success\n ? queryEntityResult.data.map(e => e.name)\n : []\n\n if (queryEntityNames.length > 0) {\n // 合并多个实体名的匹配结果(Map 保证去重)\n const entityMap = new Map<string, { id: string, name: string, type: string, aliases: string[] }>()\n for (const name of queryEntityNames) {\n const entities = await store!.findEntitiesByName(name, collection)\n for (const e of entities)\n entityMap.set(e.id, e)\n }\n\n if (entityMap.size > 0) {\n const entityIds = Array.from(entityMap.keys())\n const entityNameMap = new Map(Array.from(entityMap.values()).map(e => [e.id, e.name]))\n\n const docRelations = await store!.findDocumentsByEntityIds(entityIds, collection)\n const boostWeight = config.entityBoostWeight\n\n for (const relation of docRelations) {\n const chunkKey = relation.chunkId || relation.documentId\n const entityName = entityNameMap.get(relation.entityId) ?? ''\n\n for (const [itemId, item] of itemMap) {\n const itemDocId = item.metadata?.documentId as string | undefined\n if (itemId === chunkKey || itemDocId === relation.documentId) {\n item.score += boostWeight * relation.relevance\n if (entityName && !item.matchedEntities!.includes(entityName)) {\n item.matchedEntities!.push(entityName)\n }\n }\n }\n }\n }\n }\n }\n\n // 排序 + 截断\n const items = Array.from(itemMap.values())\n .sort((a, b) => b.score - a.score)\n .slice(0, topK)\n\n // 去重信源引用\n const citationMap = new Map<string, Citation>()\n for (const item of items) {\n const key = item.citation.documentId ?? item.citation.chunkId ?? item.id\n if (!citationMap.has(key)) {\n citationMap.set(key, item.citation)\n }\n }\n\n const duration = Date.now() - startTime\n logger.trace('Knowledge retrieval completed', { resultCount: items.length, duration })\n\n return ok({\n items,\n citations: Array.from(citationMap.values()),\n query,\n duration,\n })\n }\n catch (error) {\n logger.error('Knowledge retrieval failed', { error })\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── ask ───\n /**\n * 基于知识库回答问题(RAG 模式)\n *\n * 内部调用 `retrieve` 获取相关文档,将检索结果格式化为上下文后和历史消息一起发送给 LLM 生成回答。\n *\n * @param query - 用户问题\n * @param options - 可选(满足 `KnowledgeRetrieveOptions` 的所有选项 + systemPrompt、messages、temperature、model)\n * @returns `ok(KnowledgeAskResult)` 含 answer、context 列表、citations、usage 等;检索或生成失败时返回错误\n */\n async ask(query: string, options?: KnowledgeAskOptions): Promise<HaiResult<KnowledgeAskResult>> {\n // 先检索\n const retrieveResult = await this.retrieve(query, options)\n if (!retrieveResult.success) {\n return err(HaiAIError.RAG_FAILED, aiM('ai_ragFailed', { params: { error: retrieveResult.error.message } }), retrieveResult.error)\n }\n\n const { items, citations } = retrieveResult.data\n\n // 格式化上下文(带编号引用标记)\n const contextText = items.length > 0\n ? items.map((item, i) => {\n const source = item.citation.title ?? item.citation.documentId ?? item.citation.chunkId ?? 'unknown'\n return `[${i + 1}] (source: ${source}, score: ${item.score.toFixed(3)})\\n${item.content}`\n }).join('\\n\\n')\n : 'No relevant context found.'\n\n // 构建 LLM 消息\n const systemPrompt = options?.systemPrompt ?? DEFAULT_KNOWLEDGE_ASK_SYSTEM_PROMPT\n const systemContent = `${systemPrompt}\\n\\n--- Context ---\\n${contextText}\\n--- End Context ---`\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemContent },\n ]\n\n // 消息历史\n if (options?.messages) {\n messages.push(...options.messages)\n }\n\n messages.push({ role: 'user', content: query })\n\n // 调用 LLM\n const chatResult = await llm.chat({\n model: options?.model,\n messages,\n temperature: options?.temperature,\n })\n\n if (!chatResult.success) {\n return err(HaiAIError.RAG_FAILED, aiM('ai_ragFailed', { params: { error: chatResult.error.message } }), chatResult.error)\n }\n\n const choice = chatResult.data.choices[0]\n const answer = choice?.message?.content ?? ''\n\n logger.trace('Knowledge ask completed', {\n contextCount: items.length,\n model: chatResult.data.model,\n })\n\n return ok({\n answer,\n context: items,\n citations,\n query,\n model: chatResult.data.model,\n usage: chatResult.data.usage\n ? {\n prompt_tokens: chatResult.data.usage.prompt_tokens,\n completion_tokens: chatResult.data.usage.completion_tokens,\n total_tokens: chatResult.data.usage.total_tokens,\n }\n : undefined,\n })\n },\n\n // ─── findByEntity ───\n async findByEntity(entityName: string, options?: EntityQueryOptions): Promise<HaiResult<EntityDocumentResult[]>> {\n const collection = options?.collection ?? config.collection\n if (!store || !await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n const results = await store.findByEntityName(entityName, {\n collection,\n type: options?.type,\n })\n\n return ok(results.map(item => ({\n entity: {\n id: item.entity.id,\n name: item.entity.name,\n type: item.entity.type as KnowledgeEntity['type'],\n aliases: item.entity.aliases,\n description: item.entity.description ?? undefined,\n },\n documents: item.documents.map(doc => ({\n documentId: doc.documentId,\n chunkId: doc.chunkId || undefined,\n collection: doc.collection,\n relevance: doc.relevance,\n context: doc.context ?? undefined,\n })),\n })))\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── listEntities ───\n async listEntities(options?: EntityListOptions): Promise<HaiResult<KnowledgeEntity[]>> {\n if (!store) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n const rows = await store.listEntities({\n collection: options?.collection,\n type: options?.type,\n keyword: options?.keyword,\n limit: options?.limit,\n })\n\n return ok(rows.map(row => ({\n id: row.id,\n name: row.name,\n type: row.type as KnowledgeEntity['type'],\n aliases: row.aliases,\n description: row.description ?? undefined,\n createdAt: row.createdAt ?? undefined,\n updatedAt: row.updatedAt ?? undefined,\n })))\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── listDocuments ───\n async listDocuments(options?: KnowledgeDocumentListOptions): Promise<HaiResult<KnowledgeDocumentInfo[]>> {\n const collection = options?.collection ?? config.collection\n if (!store || !await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n const docs = await store.listDocuments(collection, {\n offset: options?.offset,\n limit: options?.limit,\n })\n\n // 查询每个文档的实体关联数\n const docIds = docs.map(d => d.documentId)\n const entityCounts = await store.listDocumentEntityCounts(docIds, collection)\n\n const result: KnowledgeDocumentInfo[] = docs.map(d => ({\n documentId: d.documentId,\n title: d.title ?? undefined,\n url: d.url ?? undefined,\n chunkCount: d.chunkCount,\n entityCount: entityCounts.get(d.documentId) ?? 0,\n createdAt: d.createdAt,\n }))\n\n return ok(result)\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_RETRIEVE_FAILED, aiM('ai_knowledgeRetrieveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n // ─── removeDocument ───\n async removeDocument(documentId: string, options?: KnowledgeDocumentRemoveOptions): Promise<HaiResult<void>> {\n const collection = options?.collection ?? config.collection\n if (!store || !await isCollectionReady(collection)) {\n return err(HaiAIError.KNOWLEDGE_NOT_SETUP, aiM('ai_knowledgeNotSetup'))\n }\n\n try {\n // ① 查询该文档的所有 chunk ID\n const docMeta = await store.getDocument(documentId, collection)\n const chunkCount = docMeta?.chunkCount ?? 100 // 回退到大数保证覆盖\n\n // 生成要删除的向量 ID 列表\n const vectorIds: string[] = []\n for (let i = 0; i < chunkCount; i++) {\n vectorIds.push(`${documentId}:chunk-${i}`)\n }\n\n // ② 删除向量\n if (vectorIds.length > 0) {\n try {\n await store.removeVectors(collection, vectorIds)\n }\n catch (vecError) {\n logger.warn('Failed to delete some vectors', { documentId, error: vecError })\n }\n }\n\n // ③ 删除实体本体(需先于关联行删除,子查询依赖关联表)\n await store.deleteDocumentEntities(documentId, collection)\n\n // ④ 删除实体关联行\n await store.removeDocumentEntityRelations(documentId, collection)\n\n // ⑤ 删除文档元数据\n await store.removeDocument(documentId, collection)\n\n logger.debug('Document removed', { documentId, collection })\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 从文件路径读取并导入文档(仅 Node.js 端可用)\n */\n async ingestFile(input: KnowledgeIngestFileInput): Promise<HaiResult<KnowledgeIngestResult>> {\n try {\n const { readFile } = await import('node:fs/promises')\n const { basename } = await import('node:path')\n const content = await readFile(input.filePath, { encoding: input.encoding ?? 'utf-8' })\n const fileName = basename(input.filePath)\n const documentId = input.documentId ?? fileName\n\n return this.ingest({\n documentId,\n content,\n title: input.title ?? fileName,\n url: input.filePath,\n collection: input.collection,\n metadata: input.metadata,\n enableEntityExtraction: input.enableEntityExtraction,\n cleanOptions: input.cleanOptions,\n chunkOptions: input.chunkOptions,\n })\n }\n catch (error) {\n return err(HaiAIError.KNOWLEDGE_INGEST_FAILED, aiM('ai_knowledgeIngestFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 批量导入文档,逐个执行 ingest(),单个失败不中断\n */\n async ingestBatch(\n inputs: KnowledgeIngestInput[],\n onProgress?: (progress: KnowledgeIngestBatchProgress) => void,\n ): Promise<HaiResult<KnowledgeIngestBatchResult>> {\n const startTime = Date.now()\n let successCount = 0\n let failureCount = 0\n const results: KnowledgeIngestBatchResult['results'] = []\n\n for (let i = 0; i < inputs.length; i++) {\n const input = inputs[i]\n const documentId = input.documentId ?? `batch-${i}`\n const ingestResult = await this.ingest(input)\n\n if (ingestResult.success) {\n successCount++\n results.push({ documentId, result: ingestResult.data })\n onProgress?.({ completed: i + 1, total: inputs.length, currentDocumentId: documentId, result: ingestResult.data })\n }\n else {\n failureCount++\n results.push({ documentId, error: ingestResult.error })\n onProgress?.({ completed: i + 1, total: inputs.length, currentDocumentId: documentId, error: ingestResult.error })\n }\n }\n\n return ok({ successCount, failureCount, results, duration: Date.now() - startTime })\n },\n\n // ─── deleteCollection ───\n async deleteCollection(collection?: string): Promise<HaiResult<void>> {\n if (!store) {\n return err(HaiAIError.KNOWLEDGE_SETUP_FAILED, aiM('ai_knowledgeSetupFailed', { params: { error: 'KnowledgeStore not available. Provider may not support knowledge operations.' } }))\n }\n\n const col = collection ?? config.collection\n logger.debug('Deleting knowledge collection', { collection: col })\n\n try {\n await store.deleteCollection(col)\n logger.debug('Knowledge collection deleted', { collection: col })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Knowledge collection deletion failed', { collection: col, error })\n return err(HaiAIError.KNOWLEDGE_SETUP_FAILED, aiM('ai_knowledgeSetupFailed', { params: { error: String(error) } }), error)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — LLM 工具定义与注册表\n *\n * 提供 OpenAI function calling 的工具定义、参数校验和批量执行功能。\n * @module ai-llm-tool\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { z } from 'zod'\n\nimport type {\n DefineToolOptions,\n Tool,\n ToolCall,\n ToolDefinition,\n ToolExecutionContext,\n ToolExecutionOptions,\n ToolMessage,\n ToolRegistryOperations,\n ToolRegistryOptions,\n} from './ai-llm-types.js'\n\nimport { err, ok } from '@h-ai/core'\nimport { z as zod } from 'zod'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\n/** 工具默认执行超时(毫秒):未指定 deadline / timeoutMs / 工具默认时生效 */\nconst DEFAULT_TOOL_TIMEOUT_MS = 30_000\n\n/**\n * 依据执行入参解析出传给 handler 的执行上下文(含始终存在的取消信号)。\n *\n * 组合调用方 `signal` 与超时信号:超时时长优先级 `deadline` > `timeoutMs` > 工具默认 > 全局默认。\n * 返回上下文与实际生效的超时毫秒数(用于超时错误信息)。\n */\nfunction resolveExecutionContext(\n options: ToolExecutionOptions | undefined,\n toolTimeoutMs: number | undefined,\n): { context: ToolExecutionContext, timeoutMs: number } {\n const now = Date.now()\n const timeoutMs = options?.deadline !== undefined\n ? Math.max(0, options.deadline - now)\n : options?.timeoutMs ?? toolTimeoutMs ?? DEFAULT_TOOL_TIMEOUT_MS\n const deadline = options?.deadline ?? now + timeoutMs\n\n const timeoutSignal = AbortSignal.timeout(timeoutMs)\n const signal = options?.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n return {\n context: { signal, objectId: options?.objectId, sessionId: options?.sessionId, deadline },\n timeoutMs,\n }\n}\n\n/**\n * 执行 handler 并与取消信号竞速:即便 handler 未响应 signal,取消 / 超时后也立即停止等待。\n *\n * 返回 handler 结果,或在取消 / 超时时抛出(由调用方映射为 TOOL_TIMEOUT)。\n */\nasync function runWithCancellation<T>(\n run: (context: ToolExecutionContext) => Promise<T> | T,\n context: ToolExecutionContext,\n): Promise<T> {\n const { signal } = context\n if (signal.aborted)\n throw new DOMException('Aborted', 'AbortError')\n\n return await new Promise<T>((resolve, reject) => {\n const onAbort = (): void => reject(new DOMException('Aborted', 'AbortError'))\n signal.addEventListener('abort', onAbort, { once: true })\n Promise.resolve()\n .then(() => run(context))\n .then(\n (value) => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n (error: unknown) => {\n signal.removeEventListener('abort', onAbort)\n reject(error instanceof Error ? error : new Error(String(error)))\n },\n )\n })\n}\n\n/** 判断错误是否为取消 / 超时(AbortError / TimeoutError) */\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError')\n}\n\n// ─── 工具定义 ───\n\n/**\n * 定义工具(Zod schema 类型推断 + 自动参数校验)\n *\n * 调用 `execute()` 时自动用 Zod schema 校验输入,校验失败返回 `VALIDATION_FAILED` 错误。\n *\n * @param options - 工具选项(名称、描述、参数 schema、处理函数)\n * @returns 工具实例(含 `execute` 和 `toDefinition`)\n *\n * @example\n * ```ts\n * const weatherTool = defineTool({\n * name: 'getWeather',\n * description: '获取天气',\n * parameters: z.object({ city: z.string() }),\n * handler: async ({ city }) => ({ temp: 25, city }),\n * })\n * const result = await weatherTool.execute({ city: '北京' })\n * ```\n */\nexport function defineTool<TInput, TOutput>(\n options: DefineToolOptions<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n const { name, description, parameters, handler, timeoutMs } = options\n\n return {\n name,\n description,\n parameters,\n\n async execute(input: TInput, execOptions?: ToolExecutionOptions): Promise<HaiResult<TOutput>> {\n const parseResult = parameters.safeParse(input)\n if (!parseResult.success) {\n return err(HaiAIError.TOOL_VALIDATION_FAILED, parseResult.error.message)\n }\n const { context, timeoutMs: effectiveTimeout } = resolveExecutionContext(execOptions, timeoutMs)\n const authorizer = execOptions?.authorize\n if (authorizer) {\n try {\n const allowed = await runWithCancellation(\n ctx => authorizer({ toolName: name, input: parseResult.data, context: ctx }),\n context,\n )\n if (!allowed)\n return err(HaiAIError.TOOL_FORBIDDEN, aiM('ai_toolForbidden', { params: { name } }))\n }\n catch (error) {\n if (isAbortError(error))\n return err(HaiAIError.TOOL_TIMEOUT, aiM('ai_toolTimeout', { params: { name, ms: effectiveTimeout } }), error)\n return err(HaiAIError.TOOL_FORBIDDEN, aiM('ai_toolForbidden', { params: { name } }))\n }\n }\n\n try {\n const output = await runWithCancellation(ctx => handler(parseResult.data, ctx), context)\n return ok(output)\n }\n catch (error) {\n if (isAbortError(error))\n return err(HaiAIError.TOOL_TIMEOUT, aiM('ai_toolTimeout', { params: { name, ms: effectiveTimeout } }), error)\n return err(HaiAIError.TOOL_EXECUTION_FAILED, error instanceof Error ? error.message : String(error), error)\n }\n },\n\n toDefinition(): ToolDefinition {\n return {\n type: 'function',\n function: {\n name,\n description,\n parameters: zodToJsonSchema(parameters),\n },\n }\n },\n }\n}\n\n// ─── 工具注册表 ───\n\n/**\n * 创建工具注册表(闭包实现,非 class)\n *\n * 注册表默认拒绝重复名称;确需替换时必须显式调用 `replace()`。\n *\n * @returns 工具注册表实例\n *\n * @example\n * ```ts\n * const registry = createToolRegistry()\n * registry.registerMany([weatherTool, searchTool])\n * const defs = registry.getDefinitions() // 用于 ChatCompletionRequest.tools\n * const result = await registry.execute(toolCall)\n * ```\n */\nexport function createToolRegistry(options: ToolRegistryOptions = {}): ToolRegistryOperations {\n const tools: Map<string, Tool> = new Map()\n\n function duplicateTool(name: string): HaiResult<void> {\n return err(HaiAIError.TOOL_ALREADY_REGISTERED, aiM('ai_toolAlreadyRegistered', { params: { name } }))\n }\n\n const registry: ToolRegistryOperations = {\n /** 注册单个工具;默认拒绝同名覆盖 */\n register<TInput, TOutput>(tool: Tool<TInput, TOutput>): HaiResult<void> {\n if (tools.has(tool.name))\n return duplicateTool(tool.name)\n tools.set(tool.name, tool as Tool)\n return ok(undefined)\n },\n\n /** 原子批量注册工具;发现任何重名时不写入 */\n registerMany(toolList: Tool<unknown, unknown>[]): HaiResult<void> {\n const incomingNames = new Set<string>()\n for (const tool of toolList) {\n if (tools.has(tool.name) || incomingNames.has(tool.name))\n return duplicateTool(tool.name)\n incomingNames.add(tool.name)\n }\n for (const tool of toolList)\n tools.set(tool.name, tool as Tool)\n return ok(undefined)\n },\n\n /** 显式替换已注册工具 */\n replace<TInput, TOutput>(tool: Tool<TInput, TOutput>): HaiResult<void> {\n if (!tools.has(tool.name))\n return err(HaiAIError.TOOL_NOT_FOUND, aiM('ai_toolNotFound', { params: { name: tool.name } }))\n tools.set(tool.name, tool as Tool)\n return ok(undefined)\n },\n\n /** 移除指定名称的工具,返回是否成功删除 */\n unregister(name: string): boolean {\n return tools.delete(name)\n },\n\n /** 按名称获取工具实例(未注册返回 `undefined`) */\n get(name: string): Tool | undefined {\n return tools.get(name)\n },\n\n /** 判断是否已注册指定名称的工具 */\n has(name: string): boolean {\n return tools.has(name)\n },\n\n /** 获取所有已注册工具的名称列表 */\n getNames(): string[] {\n return Array.from(tools.keys())\n },\n\n /** 获取所有工具的 OpenAI function calling 定义 */\n getDefinitions(): ToolDefinition[] {\n return Array.from(tools.values()).map(tool => tool.toDefinition())\n },\n\n /** 执行单个工具调用,解析 JSON 参数后调用工具的 execute 方法(透传执行上下文) */\n async execute(toolCall: ToolCall, execOptions?: ToolExecutionOptions): Promise<HaiResult<ToolMessage>> {\n // 仅支持 function 类型工具调用(OpenAI SDK union 含 custom 类型)\n if (toolCall.type !== 'function') {\n return err(HaiAIError.TOOL_NOT_FOUND, aiM('ai_toolNotFound', { params: { name: 'unknown' } }))\n }\n const tool = tools.get(toolCall.function.name)\n if (!tool) {\n return err(HaiAIError.TOOL_NOT_FOUND, aiM('ai_toolNotFound', { params: { name: toolCall.function.name } }))\n }\n\n let args: unknown\n try {\n args = JSON.parse(toolCall.function.arguments)\n }\n catch {\n return err(HaiAIError.TOOL_VALIDATION_FAILED, aiM('ai_toolInvalidJson'))\n }\n\n const registryAuthorize = options.authorize\n const executionAuthorize = execOptions?.authorize\n const authorize = registryAuthorize || executionAuthorize\n ? async (request: Parameters<NonNullable<ToolExecutionOptions['authorize']>>[0]): Promise<boolean> => {\n if (registryAuthorize && !await registryAuthorize(request))\n return false\n if (executionAuthorize && !await executionAuthorize(request))\n return false\n return true\n }\n : undefined\n\n const result = await tool.execute(args, { ...execOptions, authorize })\n if (!result.success) {\n return result\n }\n\n const content = typeof result.data === 'string'\n ? result.data\n : JSON.stringify(result.data)\n\n return ok({\n role: 'tool',\n content,\n tool_call_id: toolCall.id,\n })\n },\n\n /** 批量执行工具调用(默认串行),仅显式 parallel=true 时并行 */\n async executeAll(\n toolCalls: ToolCall[],\n options: ToolExecutionOptions & { parallel?: boolean } = {},\n ): Promise<HaiResult<ToolMessage[]>> {\n const { parallel = false, ...execOptions } = options\n const messages: ToolMessage[] = []\n\n if (parallel) {\n const results = await Promise.all(\n toolCalls.map(tc => registry.execute(tc, execOptions)),\n )\n for (const result of results) {\n if (!result.success) {\n return result\n }\n messages.push(result.data)\n }\n }\n else {\n for (const toolCall of toolCalls) {\n const result = await registry.execute(toolCall, execOptions)\n if (!result.success) {\n return result\n }\n messages.push(result.data)\n }\n }\n\n return ok(messages)\n },\n\n /** 清空所有已注册工具 */\n clear(): void {\n tools.clear()\n },\n\n /** 已注册工具数量 */\n get size(): number {\n return tools.size\n },\n }\n\n return registry\n}\n\n// ─── Zod → JSON Schema ───\n\n/**\n * 将 Zod schema 转换为 JSON Schema(移除 $schema 字段)\n *\n * @param schema - Zod 类型定义\n * @returns JSON Schema 对象\n */\nfunction zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = zod.toJSONSchema(schema)\n const { $schema: _, ...rest } = jsonSchema as Record<string, unknown>\n return rest\n}\n","/**\n * @h-ai/ai — LLM Provider: Anthropic Messages API 实现\n *\n * 通过原生 `fetch` 直连 Anthropic Messages API(`/v1/messages`),无需引入 SDK,\n * 天然支持 `AbortSignal` 取消。将框架统一的 Chat Completions 请求/响应形状与\n * Anthropic 协议互相转换,使 `ai.llm.chat/chatStream` 的调用方无需感知底层协议差异。\n *\n * 文本对话与工具调用(tool_use / tool_result)支持;流式覆盖文本增量与用量统计。\n * @module ai-llm-provider-anthropic\n */\n\nimport type { HaiErrorDef, HaiResult } from '@h-ai/core'\n\nimport type { AILLMFunctionsDeps, ChatCompletionChunk, ChatCompletionRequest, ChatCompletionResponse, ChatMessage, LLMProvider, TempModelConfig, ToolCall, ToolDefinition } from '../ai-llm-types.js'\n\nimport process from 'node:process'\nimport { err, ok } from '@h-ai/core'\n\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { createSSEDecoder } from '../ai-llm-stream.js'\n\nconst ANTHROPIC_VERSION = '2023-06-01'\nconst DEFAULT_ANTHROPIC_BASE_URL = 'https://api.anthropic.com'\nconst DEFAULT_MAX_TOKENS = 4096\n\n// ─── Anthropic REST 形状(无 SDK,最小类型定义) ───\n\ninterface AnthropicTextBlock { type: 'text', text: string }\ninterface AnthropicToolUseBlock { type: 'tool_use', id: string, name: string, input: unknown }\ninterface AnthropicToolResultBlock { type: 'tool_result', tool_use_id: string, content: string }\ntype AnthropicContentBlock = AnthropicTextBlock | AnthropicToolUseBlock | AnthropicToolResultBlock\n\ninterface AnthropicMessage { role: 'user' | 'assistant', content: string | AnthropicContentBlock[] }\n\ninterface AnthropicTool { name: string, description?: string, input_schema: Record<string, unknown> }\n\ninterface AnthropicRequest {\n model: string\n max_tokens: number\n messages: AnthropicMessage[]\n system?: string\n temperature?: number\n top_p?: number\n tools?: AnthropicTool[]\n stream?: boolean\n}\n\ninterface AnthropicUsage { input_tokens: number, output_tokens: number }\n\ninterface AnthropicResponse {\n id: string\n model: string\n content: AnthropicContentBlock[]\n stop_reason: string | null\n usage: AnthropicUsage\n}\n\n/** 已解析的 Anthropic 端点参数 */\ninterface ResolvedAnthropic {\n apiKey: string\n baseUrl: string\n model: string\n maxTokens: number\n temperature?: number\n timeout: number\n}\n\n// ─── 辅助转换 ───\n\n/** 从消息内容提取纯文本(字符串直接返回,多模态数组拼接 text 片段,忽略 refusal 等非文本块) */\nfunction contentToText(content: unknown): string {\n if (typeof content === 'string')\n return content\n if (Array.isArray(content))\n return content.map(part => (isRecord(part) && part.type === 'text' && typeof part.text === 'string' ? part.text : '')).filter(Boolean).join('')\n return ''\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\n/**\n * 将框架消息转换为 Anthropic messages + 顶层 system\n *\n * - system / developer 消息合并为顶层 `system` 字符串\n * - assistant 的 `tool_calls` 转 tool_use 块;tool 消息转 tool_result 块\n * - 连续同角色消息各自成条(Anthropic 允许交替,SDK 侧一般无强约束)\n */\nfunction toAnthropicMessages(messages: ChatMessage[]): { messages: AnthropicMessage[], system?: string } {\n const systemParts: string[] = []\n const result: AnthropicMessage[] = []\n\n for (const message of messages) {\n if (message.role === 'system' || message.role === 'developer') {\n const text = contentToText(message.content)\n if (text)\n systemParts.push(text)\n continue\n }\n\n if (message.role === 'tool') {\n result.push({\n role: 'user',\n content: [{ type: 'tool_result', tool_use_id: message.tool_call_id, content: contentToText(message.content) }],\n })\n continue\n }\n\n if (message.role === 'assistant') {\n const blocks: AnthropicContentBlock[] = []\n const text = contentToText(message.content)\n if (text)\n blocks.push({ type: 'text', text })\n if (message.tool_calls) {\n for (const call of message.tool_calls) {\n if (call.type === 'function') {\n let input: unknown = {}\n try {\n input = call.function.arguments ? JSON.parse(call.function.arguments) : {}\n }\n catch {\n input = {}\n }\n blocks.push({ type: 'tool_use', id: call.id, name: call.function.name, input })\n }\n }\n }\n result.push({ role: 'assistant', content: blocks.length > 0 ? blocks : (text || '') })\n continue\n }\n\n // user\n result.push({ role: 'user', content: contentToText(message.content) })\n }\n\n return { messages: result, system: systemParts.length > 0 ? systemParts.join('\\n\\n') : undefined }\n}\n\n/** 将 Chat Completions 工具定义转换为 Anthropic 工具定义 */\nfunction toAnthropicTools(tools?: ToolDefinition[]): AnthropicTool[] | undefined {\n if (!tools || tools.length === 0)\n return undefined\n const mapped: AnthropicTool[] = []\n for (const tool of tools) {\n if (tool.type !== 'function')\n continue\n mapped.push({\n name: tool.function.name,\n description: tool.function.description ?? undefined,\n input_schema: (tool.function.parameters ?? { type: 'object', properties: {} }) as Record<string, unknown>,\n })\n }\n return mapped.length > 0 ? mapped : undefined\n}\n\n/** 将 Anthropic stop_reason 映射为 Chat Completions finish_reason */\nfunction mapStopReason(stopReason: string | null, hasToolUse: boolean): string {\n if (hasToolUse || stopReason === 'tool_use')\n return 'tool_calls'\n if (stopReason === 'max_tokens')\n return 'length'\n return 'stop'\n}\n\n/** 将 Anthropic 响应转换为 Chat Completions 响应形状 */\nfunction toChatResponse(response: AnthropicResponse, model: string): ChatCompletionResponse {\n const textParts: string[] = []\n const toolCalls: ToolCall[] = []\n for (const block of response.content) {\n if (block.type === 'text')\n textParts.push(block.text)\n else if (block.type === 'tool_use')\n toolCalls.push({ id: block.id, type: 'function', function: { name: block.name, arguments: JSON.stringify(block.input ?? {}) } })\n }\n const text = textParts.join('')\n\n return {\n id: response.id,\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: response.model ?? model,\n choices: [{\n index: 0,\n message: {\n role: 'assistant',\n content: toolCalls.length > 0 && text.length === 0 ? null : text,\n refusal: null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n },\n finish_reason: mapStopReason(response.stop_reason, toolCalls.length > 0) as ChatCompletionResponse['choices'][number]['finish_reason'],\n logprobs: null,\n }],\n usage: {\n prompt_tokens: response.usage.input_tokens,\n completion_tokens: response.usage.output_tokens,\n total_tokens: response.usage.input_tokens + response.usage.output_tokens,\n },\n }\n}\n\n/** 构造纯文本增量的流块 */\nfunction textChunk(id: string, model: string, delta: string): ChatCompletionChunk {\n return {\n id,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [{ index: 0, delta: { content: delta }, finish_reason: null, logprobs: null }],\n }\n}\n\n// ─── 工厂 ───\n\n/**\n * 创建 Anthropic LLM Provider\n *\n * @param deps - LLM 子功能依赖(含校验后配置)\n * @returns LLMProvider 实例\n */\nexport function createAnthropicProvider(deps: AILLMFunctionsDeps): LLMProvider {\n const { config } = deps\n\n /**\n * 解析 Anthropic 端点参数\n *\n * apiKey / baseUrl 采用 Anthropic 专属环境变量兜底(ANTHROPIC_API_KEY / ANTHROPIC_BASE_URL),\n * 避免误用面向 OpenAI 的全局默认 baseUrl。\n */\n function resolveAnthropic(requestModel?: string, tempModel?: TempModelConfig): HaiResult<ResolvedAnthropic> {\n const entry = requestModel ? config.llm.models?.find(m => m.id === requestModel || m.model === requestModel) : undefined\n const model = tempModel?.model ?? entry?.model ?? requestModel ?? config.llm.model ?? 'claude-3-5-sonnet-latest'\n const apiKey = tempModel?.apiKey ?? entry?.apiKey ?? config.llm.apiKey ?? process.env.HAI_AI_ANTHROPIC_API_KEY ?? process.env.ANTHROPIC_API_KEY\n if (!apiKey)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_configError', { params: { error: 'API Key is required for Anthropic' } }))\n const baseUrl = (tempModel?.baseUrl ?? entry?.baseUrl ?? process.env.HAI_AI_ANTHROPIC_BASE_URL ?? process.env.ANTHROPIC_BASE_URL ?? DEFAULT_ANTHROPIC_BASE_URL).replace(/\\/+$/, '')\n return ok({\n apiKey,\n baseUrl,\n model,\n maxTokens: tempModel?.maxTokens ?? entry?.maxTokens ?? config.llm.maxTokens ?? DEFAULT_MAX_TOKENS,\n temperature: tempModel?.temperature ?? entry?.temperature ?? config.llm.temperature,\n timeout: tempModel?.timeout ?? entry?.timeout ?? config.llm.timeout ?? 60000,\n })\n }\n\n /** 构造 Anthropic 请求体 */\n function buildRequest(request: ChatCompletionRequest, resolved: ResolvedAnthropic, stream: boolean): AnthropicRequest {\n const { messages, system } = toAnthropicMessages(request.messages)\n const temperature = request.temperature ?? resolved.temperature\n return {\n model: resolved.model,\n max_tokens: request.max_tokens ?? resolved.maxTokens,\n messages,\n ...(system ? { system } : {}),\n ...(temperature != null ? { temperature } : {}),\n ...(request.top_p != null ? { top_p: request.top_p } : {}),\n ...(toAnthropicTools(request.tools) ? { tools: toAnthropicTools(request.tools) } : {}),\n stream,\n }\n }\n\n /** 发送 fetch 请求并统一超时/取消/错误处理 */\n async function post(resolved: ResolvedAnthropic, body: AnthropicRequest, signal?: AbortSignal): Promise<Response> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), resolved.timeout)\n // 合并外部取消信号与超时信号\n if (signal) {\n if (signal.aborted)\n controller.abort()\n else\n signal.addEventListener('abort', () => controller.abort(), { once: true })\n }\n try {\n return await fetch(`${resolved.baseUrl}/v1/messages`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': resolved.apiKey,\n 'anthropic-version': ANTHROPIC_VERSION,\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n })\n }\n finally {\n clearTimeout(timer)\n }\n }\n\n /** 将 HTTP 错误状态映射为标准错误定义 */\n function httpError(status: number, detail: string): { def: HaiErrorDef, message: string } {\n if (status === 429)\n return { def: HaiAIError.RATE_LIMITED, message: detail }\n if (status === 404)\n return { def: HaiAIError.MODEL_NOT_FOUND, message: detail }\n if (status === 400)\n return { def: HaiAIError.INVALID_REQUEST, message: detail }\n return { def: HaiAIError.API_ERROR, message: detail }\n }\n\n return {\n async chat(request): Promise<HaiResult<ChatCompletionResponse>> {\n const resolvedResult = resolveAnthropic(request.model, request.tempModel)\n if (!resolvedResult.success)\n return resolvedResult\n const resolved = resolvedResult.data\n try {\n const res = await post(resolved, buildRequest(request, resolved, false), request.signal)\n if (!res.ok) {\n const detail = await res.text().catch(() => res.statusText)\n const mapped = httpError(res.status, detail.slice(0, 500))\n return err(mapped.def, mapped.message, { status: res.status })\n }\n const data = await res.json() as AnthropicResponse\n return ok(toChatResponse(data, resolved.model))\n }\n catch (error) {\n if (error instanceof Error && error.name === 'AbortError')\n return err(HaiAIError.TIMEOUT, aiM('ai_requestTimeout'), { message: error.message })\n return err(HaiAIError.INTERNAL_ERROR, aiM('ai_internalError', { params: { error: error instanceof Error ? error.message : 'Unknown error' } }), error)\n }\n },\n\n async* chatStream(request): AsyncIterable<ChatCompletionChunk> {\n const resolvedResult = resolveAnthropic(request.model, request.tempModel)\n if (!resolvedResult.success)\n throw new Error(resolvedResult.error.message)\n const resolved = resolvedResult.data\n\n const res = await post(resolved, buildRequest(request, resolved, true), request.signal)\n if (!res.ok || !res.body) {\n const detail = await res.text().catch(() => res.statusText)\n throw new Error(`Anthropic stream failed (${res.status}): ${detail.slice(0, 300)}`)\n }\n\n const decoder = createSSEDecoder()\n const reader = res.body.getReader()\n const textDecoder = new TextDecoder()\n\n while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n for (const event of decoder.decode(textDecoder.decode(value, { stream: true }))) {\n if (!event.data || event.data === '[DONE]')\n continue\n let payload: { type?: string, delta?: { type?: string, text?: string }, usage?: AnthropicUsage, message?: { usage?: AnthropicUsage } }\n try {\n payload = JSON.parse(event.data)\n }\n catch {\n continue\n }\n // 文本增量\n if (payload.type === 'content_block_delta' && payload.delta?.type === 'text_delta' && payload.delta.text) {\n yield textChunk(resolved.model, resolved.model, payload.delta.text)\n }\n // 完成事件:携带输出用量\n else if (payload.type === 'message_delta' && payload.usage) {\n yield {\n id: resolved.model,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model: resolved.model,\n choices: [{ index: 0, delta: {}, finish_reason: 'stop', logprobs: null }],\n usage: {\n prompt_tokens: payload.message?.usage?.input_tokens ?? 0,\n completion_tokens: payload.usage.output_tokens,\n total_tokens: (payload.message?.usage?.input_tokens ?? 0) + payload.usage.output_tokens,\n },\n }\n }\n }\n }\n },\n\n async listModels(): Promise<HaiResult<string[]>> {\n // Anthropic 未提供公开的模型列表端点;返回配置中声明的模型名\n const models = new Set<string>()\n if (config.llm.model)\n models.add(config.llm.model)\n for (const entry of config.llm.models ?? []) {\n if ((entry.api ?? config.llm.api) === 'anthropic')\n models.add(entry.model)\n }\n return ok([...models])\n },\n }\n}\n","/**\n * @h-ai/ai — OpenAI Responses API 适配器\n *\n * 将框架统一的 Chat Completions 请求/响应形状与 OpenAI Responses API\n * (`/v1/responses`)互相转换,使 `ai.llm.chat/chatStream` 的调用方无需感知底层协议差异。\n *\n * 纯函数、无副作用,便于单测。文本对话与非流式工具调用完整支持;\n * 流式仅覆盖文本增量(流式工具调用建议使用 `api: 'chat'`)。\n * @module ai-llm-provider-openai-responses\n */\n\nimport type OpenAI from 'openai'\n\nimport type {\n AssistantMessage,\n ChatCompletionChunk,\n ChatCompletionResponse,\n ChatMessage,\n ToolCall,\n ToolDefinition,\n} from '../ai-llm-types.js'\n\ntype ResponseInput = OpenAI.Responses.ResponseInput\ntype ResponseInputItem = OpenAI.Responses.ResponseInputItem\ntype ResponsesResponse = OpenAI.Responses.Response\ntype ResponseStreamEvent = OpenAI.Responses.ResponseStreamEvent\ntype ResponsesTool = OpenAI.Responses.Tool\n\n/** 从消息内容中提取纯文本(字符串直接返回,多模态数组拼接其 text 片段,忽略 refusal 等非文本块) */\nfunction contentToText(content: unknown): string {\n if (typeof content === 'string')\n return content\n if (Array.isArray(content)) {\n return content\n .map(part => (isRecord(part) && part.type === 'text' && typeof part.text === 'string' ? part.text : ''))\n .filter(Boolean)\n .join('')\n }\n return ''\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\n/**\n * 将框架消息列表转换为 Responses API 的 input 项\n *\n * - system / developer / user:映射为 EasyInputMessage\n * - assistant:文本映射为 assistant 消息;`tool_calls` 映射为 function_call 项\n * - tool:映射为 function_call_output 项(按 tool_call_id 关联)\n */\nexport function toResponsesInput(messages: ChatMessage[]): ResponseInput {\n const items: ResponseInputItem[] = []\n for (const message of messages) {\n if (message.role === 'tool') {\n items.push({\n type: 'function_call_output',\n call_id: message.tool_call_id,\n output: contentToText(message.content),\n })\n continue\n }\n\n if (message.role === 'assistant') {\n const assistant = message as AssistantMessage\n const text = contentToText(assistant.content)\n if (text)\n items.push({ role: 'assistant', content: text })\n if (assistant.tool_calls) {\n for (const call of assistant.tool_calls) {\n if (call.type === 'function') {\n items.push({\n type: 'function_call',\n call_id: call.id,\n name: call.function.name,\n arguments: call.function.arguments,\n })\n }\n }\n }\n continue\n }\n\n // system / developer / user——仅映射 EasyInputMessage 支持的角色(跳过遗留 function 角色)\n if (message.role === 'user' || message.role === 'system' || message.role === 'developer')\n items.push({ role: message.role, content: contentToText(message.content) })\n }\n return items\n}\n\n/** 将 Chat Completions 工具定义转换为 Responses API 工具定义 */\nexport function toResponsesTools(tools?: ToolDefinition[]): ResponsesTool[] | undefined {\n if (!tools || tools.length === 0)\n return undefined\n const mapped: ResponsesTool[] = []\n for (const tool of tools) {\n if (tool.type !== 'function')\n continue\n mapped.push({\n type: 'function',\n name: tool.function.name,\n description: tool.function.description ?? null,\n parameters: (tool.function.parameters ?? {}) as Record<string, unknown>,\n strict: tool.function.strict ?? false,\n })\n }\n return mapped.length > 0 ? mapped : undefined\n}\n\n/** 从 Responses 响应的 output 数组提取 function_call → Chat Completions tool_calls */\nfunction extractToolCalls(response: ResponsesResponse): ToolCall[] {\n const toolCalls: ToolCall[] = []\n for (const item of response.output) {\n if (item.type === 'function_call') {\n toolCalls.push({\n id: item.call_id,\n type: 'function',\n function: { name: item.name, arguments: item.arguments },\n })\n }\n }\n return toolCalls\n}\n\n/** 将 Responses usage 映射为 Chat Completions usage */\nfunction mapUsage(usage: ResponsesResponse['usage']): ChatCompletionResponse['usage'] | undefined {\n if (!usage)\n return undefined\n return {\n prompt_tokens: usage.input_tokens,\n completion_tokens: usage.output_tokens,\n total_tokens: usage.total_tokens,\n }\n}\n\n/**\n * 将 Responses API 的完整响应转换为 Chat Completions 响应形状\n *\n * @param response - Responses API 响应\n * @param model - 请求使用的模型名(响应缺省时回退)\n */\nexport function responsesToChatResponse(response: ResponsesResponse, model: string): ChatCompletionResponse {\n const toolCalls = extractToolCalls(response)\n const text = response.output_text ?? ''\n\n const message: ChatCompletionResponse['choices'][number]['message'] = {\n role: 'assistant',\n content: toolCalls.length > 0 && text.length === 0 ? null : text,\n refusal: null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n }\n\n const usage = mapUsage(response.usage)\n\n return {\n id: response.id,\n object: 'chat.completion',\n created: response.created_at,\n model: response.model ?? model,\n choices: [{\n index: 0,\n message,\n finish_reason: toolCalls.length > 0 ? 'tool_calls' : 'stop',\n logprobs: null,\n }],\n ...(usage ? { usage } : {}),\n }\n}\n\n/**\n * 将单个 Responses 流事件转换为 Chat Completions 流块\n *\n * 仅处理文本增量与完成事件;其余事件(工具调用、推理等)返回 null 由上层忽略。\n *\n * @param event - Responses 流事件\n * @param model - 请求使用的模型名\n * @returns 对应的 ChatCompletionChunk,或 null(无需转发的事件)\n */\nexport function responsesEventToChunk(event: ResponseStreamEvent, model: string): ChatCompletionChunk | null {\n if (event.type === 'response.output_text.delta') {\n return {\n id: event.item_id,\n object: 'chat.completion.chunk',\n created: Math.floor(Date.now() / 1000),\n model,\n choices: [{ index: 0, delta: { content: event.delta }, finish_reason: null, logprobs: null }],\n }\n }\n\n if (event.type === 'response.completed') {\n const usage = mapUsage(event.response.usage)\n return {\n id: event.response.id,\n object: 'chat.completion.chunk',\n created: event.response.created_at,\n model: event.response.model ?? model,\n choices: [{ index: 0, delta: {}, finish_reason: 'stop', logprobs: null }],\n ...(usage ? { usage } : {}),\n }\n }\n\n return null\n}\n","/**\n * @h-ai/ai — LLM Provider: OpenAI 兼容实现\n *\n * 工厂函数创建,基于 OpenAI SDK 支持所有 OpenAI 兼容的 API 端点。\n * @module ai-llm-provider-openai\n */\n\nimport type { HaiErrorDef, HaiResult } from '@h-ai/core'\n\nimport type {\n AILLMFunctionsDeps,\n ChatCompletionChunk,\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatMessage,\n LLMProvider,\n TempModelConfig,\n} from '../ai-llm-types.js'\n\nimport process from 'node:process'\nimport { err, ok } from '@h-ai/core'\nimport OpenAI from 'openai'\n\nimport { resolveModelEntry } from '../../ai-config.js'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport {\n responsesEventToChunk,\n responsesToChatResponse,\n toResponsesInput,\n toResponsesTools,\n} from './ai-llm-provider-openai-responses.js'\n\n// ─── 辅助函数 ───\n\n/**\n * 清理错误对象中可能包含的敏感信息\n *\n * OpenAI SDK 的 APIError 可能在 headers 中携带 Authorization Bearer Token,\n * 直接作为 cause 传递会泄漏 API Key。此函数仅保留安全字段。\n *\n * @param error - 原始错误对象\n * @returns 去除敏感信息的错误摘要\n */\nfunction sanitizeErrorCause(error: unknown): { message: string, status?: number, code?: string } {\n if (error instanceof OpenAI.APIError) {\n return { message: error.message, status: error.status, code: error.code ?? undefined }\n }\n if (error instanceof Error) {\n return { message: error.message }\n }\n return { message: String(error) }\n}\n\n/**\n * 将 OpenAI SDK 异常映射为标准错误定义 + 消息\n *\n * 映射规则:\n * - HTTP 429 → `RATE_LIMITED`\n * - HTTP 404 → `MODEL_NOT_FOUND`\n * - HTTP 400 → `INVALID_REQUEST`\n * - 其他 `APIError` → `API_ERROR`\n * - `AbortError` → `TIMEOUT`\n * - 其他 → `INTERNAL_ERROR`\n *\n * @param error - 捕获的异常\n * @returns 统一错误映射(cause 已脱敏,不含 API Key)\n */\nfunction toAIError(error: unknown): { def: HaiErrorDef, message: string, cause: unknown } {\n if (error instanceof OpenAI.APIError) {\n let def = HaiAIError.API_ERROR\n if (error.status === 429) {\n def = HaiAIError.RATE_LIMITED\n }\n else if (error.status === 404) {\n def = HaiAIError.MODEL_NOT_FOUND\n }\n else if (error.status === 400) {\n def = HaiAIError.INVALID_REQUEST\n }\n return { def, message: error.message, cause: sanitizeErrorCause(error) }\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n return {\n def: HaiAIError.TIMEOUT,\n message: aiM('ai_requestTimeout'),\n cause: sanitizeErrorCause(error),\n }\n }\n\n return {\n def: HaiAIError.INTERNAL_ERROR,\n message: aiM('ai_internalError', {\n params: { error: error instanceof Error ? error.message : 'Unknown error' },\n }),\n cause: sanitizeErrorCause(error),\n }\n}\n\nfunction toOpenAIMessage(message: ChatMessage): OpenAI.Chat.Completions.ChatCompletionMessageParam {\n if (message.role === 'developer') {\n const developerMessage: OpenAI.Chat.Completions.ChatCompletionDeveloperMessageParam = {\n role: 'developer',\n content: message.content,\n ...(message.name ? { name: message.name } : {}),\n }\n return developerMessage\n }\n\n return message\n}\n\n// ─── 工厂函数 ───\n\n/** 已解析的客户端及其参数回填默认值(maxTokens/temperature 仅临时模型路径有值) */\ninterface ResolvedClient {\n client: OpenAI\n model: string\n /** API 协议:chat = Chat Completions;responses = Responses API */\n api: 'chat' | 'responses'\n maxTokens?: number\n temperature?: number\n}\n\n/**\n * 创建 OpenAI 兼容 LLM Provider\n *\n * 支持所有 OpenAI 兼容 API 端点(如 Azure OpenAI、本地 Ollama 等)。\n * 通过 `resolveModelEntry()` 统一解析模型配置(apiKey / baseUrl / timeout 等),\n * 支持多模型条目各自配置不同的 API 端点。\n *\n * @param deps - LLM 子功能依赖(含校验后配置)\n * @returns LLMProvider 实例\n */\nexport function createOpenAIProvider(deps: AILLMFunctionsDeps): LLMProvider {\n const { config } = deps\n\n // 缓存客户端实例,按 apiKey+baseURL+timeout 复用,支持多端点并发调用\n const clientCache = new Map<string, OpenAI>()\n\n // 临时模型客户端缓存:与常驻 clientCache 隔离,带 TTL 过期(默认 10 分钟,见 LLMConfig.tempModelCacheTtl)\n const tempClientCache = new Map<string, { client: OpenAI, expiresAt: number }>()\n const tempCacheTtl = config.llm.tempModelCacheTtl ?? 600000\n\n function getClient(apiKey: string, baseURL: string, timeout: number): OpenAI {\n const key = `${apiKey}::${baseURL}::${timeout}`\n let client = clientCache.get(key)\n if (!client) {\n client = new OpenAI({ apiKey, baseURL, timeout })\n clientCache.set(key, client)\n }\n return client\n }\n\n /**\n * 获取临时模型客户端(带 TTL 过期)\n *\n * 每次调用惰性清理过期实例(无需定时器,避免 close 清理负担)。\n * 命中未过期缓存直接复用;否则创建新实例并记录过期时间(自创建起 `tempCacheTtl` 毫秒)。\n */\n function getTempClient(apiKey: string, baseURL: string, timeout: number): OpenAI {\n const now = Date.now()\n // 惰性清理过期实例,避免缓存无限增长\n for (const [k, v] of tempClientCache) {\n if (v.expiresAt <= now)\n tempClientCache.delete(k)\n }\n const key = `${apiKey}::${baseURL}::${timeout}`\n const cached = tempClientCache.get(key)\n if (cached)\n return cached.client\n const client = new OpenAI({ apiKey, baseURL, timeout })\n tempClientCache.set(key, { client, expiresAt: now + tempCacheTtl })\n return client\n }\n\n function resolveClient(requestModel?: string, tempModel?: TempModelConfig): HaiResult<ResolvedClient> {\n if (tempModel)\n return resolveTempClient(tempModel)\n const resolvedResult = resolveModelEntry(config.llm, 'chat', requestModel, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for chat' } }),\n })\n if (!resolvedResult.success)\n return resolvedResult\n const { apiKey, baseUrl, timeout, model, api } = resolvedResult.data\n // 本 Provider 覆盖 OpenAI 原生的两种协议;anthropic 由路由层分派到 Anthropic Provider\n const resolvedApi = api === 'responses' ? 'responses' : 'chat'\n return ok({ client: getClient(apiKey ?? '', baseUrl ?? 'https://api.openai.com/v1', timeout), model, api: resolvedApi })\n }\n\n /**\n * 解析临时模型客户端\n *\n * 临时模型字段优先,未指定时回退到全局 LLM 配置 / 环境变量;\n * `maxTokens` / `temperature` 作为请求未显式指定时的回填默认值返回。\n */\n function resolveTempClient(tempModel: TempModelConfig): HaiResult<ResolvedClient> {\n const apiKey = tempModel.apiKey ?? config.llm.apiKey ?? process.env.HAI_AI_LLM_API_KEY ?? process.env.OPENAI_API_KEY\n if (!apiKey)\n return err(HaiAIError.CONFIGURATION_ERROR, aiM('ai_configError', { params: { error: 'API Key is required for temp model' } }))\n const baseUrl = tempModel.baseUrl ?? config.llm.baseUrl ?? process.env.HAI_AI_LLM_BASE_URL ?? process.env.OPENAI_BASE_URL ?? 'https://api.openai.com/v1'\n const timeout = tempModel.timeout ?? config.llm.timeout ?? 60000\n const api = (tempModel.api ?? config.llm.api) === 'responses' ? 'responses' : 'chat'\n return ok({\n client: getTempClient(apiKey, baseUrl, timeout),\n model: tempModel.model,\n api,\n maxTokens: tempModel.maxTokens ?? config.llm.maxTokens,\n temperature: tempModel.temperature ?? config.llm.temperature,\n })\n }\n\n /**\n * 构建 Responses API 请求参数(非流式基础形状)\n *\n * 将 Chat Completions 语义映射到 Responses:messages→input、max_tokens→max_output_tokens、\n * tools 转 Responses 工具定义;`tool_choice` 仅透传字符串枚举。\n */\n function buildResponsesParams(\n request: ChatCompletionRequest,\n resolved: ResolvedClient,\n ): OpenAI.Responses.ResponseCreateParamsNonStreaming {\n const maxOutput = request.max_tokens ?? resolved.maxTokens\n const temperature = request.temperature ?? resolved.temperature\n const toolChoice = typeof request.tool_choice === 'string' ? request.tool_choice : undefined\n return {\n model: resolved.model,\n input: toResponsesInput(request.messages),\n ...(maxOutput != null ? { max_output_tokens: maxOutput } : {}),\n ...(temperature != null ? { temperature } : {}),\n ...(request.top_p != null ? { top_p: request.top_p } : {}),\n ...(toResponsesTools(request.tools) ? { tools: toResponsesTools(request.tools) } : {}),\n ...(toolChoice ? { tool_choice: toolChoice } : {}),\n stream: false,\n }\n }\n\n return {\n async chat(request: ChatCompletionRequest): Promise<HaiResult<ChatCompletionResponse>> {\n const clientResult = resolveClient(request.model, request.tempModel)\n if (!clientResult.success)\n return clientResult\n const resolved = clientResult.data\n const { client, model, maxTokens, temperature, api } = resolved\n const { objectId: _objectId, sessionId: _sessionId, tempModel: _tempModel, signal, ...openaiRequest } = request\n try {\n // Responses API 分支:转换请求/响应形状,对调用方透明\n if (api === 'responses') {\n const response = await client.responses.create(buildResponsesParams(request, resolved), { signal })\n return ok(responsesToChatResponse(response, model))\n }\n\n const openaiMessages = request.messages.map(toOpenAIMessage)\n const params = {\n ...openaiRequest,\n messages: openaiMessages,\n model,\n ...(maxTokens !== undefined && openaiRequest.max_tokens == null ? { max_tokens: maxTokens } : {}),\n ...(temperature !== undefined && openaiRequest.temperature == null ? { temperature } : {}),\n stream: false,\n } as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n // 仅在存在取消信号时传入请求选项,避免无谓的第二参数\n const response = signal\n ? await client.chat.completions.create(params, { signal })\n : await client.chat.completions.create(params)\n return ok(response)\n }\n catch (error) {\n const mapped = toAIError(error)\n return err(mapped.def, mapped.message, mapped.cause)\n }\n },\n\n async* chatStream(request: ChatCompletionRequest): AsyncIterable<ChatCompletionChunk> {\n const clientResult = resolveClient(request.model, request.tempModel)\n if (!clientResult.success)\n throw new Error(clientResult.error.message)\n const resolved = clientResult.data\n const { client, model, maxTokens, temperature, api } = resolved\n const { objectId: _objectId, sessionId: _sessionId, tempModel: _tempModel, signal, ...openaiRequest } = request\n\n // Responses API 流式分支:转发文本增量与完成事件\n if (api === 'responses') {\n const responsesStream = await client.responses.create(\n { ...buildResponsesParams(request, resolved), stream: true },\n { signal },\n )\n for await (const event of responsesStream) {\n const chunk = responsesEventToChunk(event, model)\n if (chunk)\n yield chunk\n }\n return\n }\n\n const openaiMessages = request.messages.map(toOpenAIMessage)\n const params = {\n ...openaiRequest,\n messages: openaiMessages,\n model,\n ...(maxTokens !== undefined && openaiRequest.max_tokens == null ? { max_tokens: maxTokens } : {}),\n ...(temperature !== undefined && openaiRequest.temperature == null ? { temperature } : {}),\n stream: true,\n } as OpenAI.Chat.ChatCompletionCreateParamsStreaming\n const stream = signal\n ? await client.chat.completions.create(params, { signal })\n : await client.chat.completions.create(params)\n for await (const chunk of stream) {\n yield chunk\n }\n },\n\n async listModels(): Promise<HaiResult<string[]>> {\n const clientResult = resolveClient()\n if (!clientResult.success)\n return clientResult\n const { client } = clientResult.data\n try {\n const response = await client.models.list()\n const models = response.data.map((m: { id: string }) => m.id)\n return ok(models)\n }\n catch (error) {\n const mapped = toAIError(error)\n return err(mapped.def, mapped.message, mapped.cause)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — LLM Provider 路由层\n *\n * 按每次请求解析出的 API 协议(`chat` / `responses` / `anthropic`)分派到具体 Provider,\n * 对上层 `ai.llm` 暴露统一的 `LLMProvider` 接口。OpenAI Provider 内部同时覆盖\n * Chat Completions 与 Responses 两种原生协议;Anthropic 走独立 Provider。\n * @module ai-llm-provider-router\n */\n\nimport type { AILLMFunctionsDeps, ChatCompletionChunk, ChatCompletionRequest, LLMProvider } from '../ai-llm-types.js'\n\nimport { resolveModelApi } from '../../ai-config.js'\nimport { createAnthropicProvider } from './ai-llm-provider-anthropic.js'\nimport { createOpenAIProvider } from './ai-llm-provider-openai.js'\n\n/**\n * 创建按协议分派的 LLM Provider\n *\n * @param deps - LLM 子功能依赖(含校验后配置)\n * @returns 统一的 LLMProvider(内部按模型 `api` 路由)\n */\nexport function createLLMProvider(deps: AILLMFunctionsDeps): LLMProvider {\n const openai = createOpenAIProvider(deps)\n // Anthropic Provider 惰性创建:仅在实际使用到 anthropic 协议时初始化\n let anthropic: LLMProvider | undefined\n\n function getAnthropic(): LLMProvider {\n anthropic ??= createAnthropicProvider(deps)\n return anthropic\n }\n\n /** 按请求解析协议并选择 Provider(chat / responses → OpenAI;anthropic → Anthropic) */\n function pick(request: ChatCompletionRequest): LLMProvider {\n const api = resolveModelApi(deps.config.llm, request.model, request.tempModel?.api)\n return api === 'anthropic' ? getAnthropic() : openai\n }\n\n return {\n chat: request => pick(request).chat(request),\n chatStream: (request): AsyncIterable<ChatCompletionChunk> => pick(request).chatStream(request),\n listModels: () => {\n const api = deps.config.llm.api ?? 'chat'\n return api === 'anthropic' ? getAnthropic().listModels() : openai.listModels()\n },\n }\n}\n","/**\n * @h-ai/ai — LLM 子功能工厂\n *\n * 根据配置创建 OpenAI Provider,组装 LLM 操作接口。\n * 同时导出工具与流处理的纯函数包装器(不依赖配置,可独立使用)。\n * @module ai-llm-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AIConfig } from '../ai-config.js'\n\nimport type { AIRelStore, InteractionScope, SessionInfo } from '../store/ai-store-types.js'\nimport type {\n AskOptions,\n ChatCompletionChunk,\n ChatCompletionRequest,\n ChatCompletionResponse,\n ChatHistoryOptions,\n ChatMessage,\n ChatRecord,\n GenerateObjectRequest,\n LLMOperations,\n StreamOperations,\n TokenUsage,\n ToolsOperations,\n} from './ai-llm-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { z } from 'zod'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { sessionStoreKey } from '../store/ai-store-key.js'\nimport { collectStream, createSSEDecoder, createStreamProcessor, encodeSSE } from './ai-llm-stream.js'\nimport { createToolRegistry, defineTool } from './ai-llm-tool.js'\nimport { createLLMProvider } from './providers/ai-llm-provider-router.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'llm' })\n\n// ─── LLM 子功能 ───\n\n/** LLM 子功能存储依赖 */\nexport interface AILLMStores {\n /** 对话记录存储(可选;未传入时不记录) */\n recordStore?: AIRelStore<ChatRecord>\n /** 会话信息存储(可选;未传入时 listSessions 返回空) */\n sessionStore?: AIRelStore<SessionInfo>\n}\n\n/** LLM 子功能创建结果 */\nexport interface AILLMFunctions {\n /** LLM 操作接口(对话 / 流式对话 / 模型列表 / 历史 / 会话) */\n llm: LLMOperations\n /** 工具操作接口(定义工具 / 创建注册表) */\n tools: ToolsOperations\n /** 流处理操作接口(流处理器 / SSE 编解码) */\n stream: StreamOperations\n}\n\n/**\n * 创建 LLM 相关的全部子功能\n *\n * 根据配置创建 OpenAI Provider,组装 LLM、工具、流处理三个操作接口。\n * 若传入 `deps.recordStore`,chat 调用会自动保存 ChatRecord。\n *\n * @param config - 校验后的 AI 配置\n * @param deps - 可选依赖(记录存储、会话存储)\n * @returns `{ llm, tools, stream }` 三个操作接口\n */\nexport function createAILLMFunctions(config: AIConfig, deps?: AILLMStores): AILLMFunctions {\n const provider = createLLMProvider({ config })\n const recordStore = deps?.recordStore\n const sessionStore = deps?.sessionStore\n let recordSeq = 0\n\n /**\n * 从消息列表中提取会话标题(取最后一条用户消息,截断到 50 字符)\n */\n function extractTitle(messages: ChatMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg.role === 'user') {\n const text = typeof msg.content === 'string'\n ? msg.content\n : msg.content.filter(c => c.type === 'text').map(c => c.text).join(' ')\n return text.length > 50 ? `${text.slice(0, 50)}...` : text\n }\n }\n return 'New Session'\n }\n\n /**\n * 保存 ChatRecord 并同步更新 SessionInfo\n */\n async function saveRecordAndSession(\n record: ChatRecord,\n messages: ChatMessage[],\n ): Promise<void> {\n await recordStore!.save(record.id, record, { objectId: record.objectId, sessionId: record.sessionId })\n logger.trace('Chat record saved', { id: record.id, objectId: record.objectId, sessionId: record.sessionId })\n\n if (sessionStore) {\n // 会话目录与上下文正文共用同一复合键,避免不同主体相同 sessionId 互相覆盖\n const sessionKey = sessionStoreKey({ objectId: record.objectId, sessionId: record.sessionId })\n const existing = await sessionStore.get(sessionKey)\n const now = Date.now()\n if (existing) {\n await sessionStore.save(sessionKey, { ...existing, updatedAt: now }, { objectId: existing.objectId })\n }\n else {\n await sessionStore.save(sessionKey, {\n sessionId: record.sessionId,\n objectId: record.objectId,\n title: extractTitle(messages),\n createdAt: now,\n updatedAt: now,\n }, { objectId: record.objectId })\n }\n }\n }\n\n /**\n * 包装 chat,在有 objectId 时自动保存 ChatRecord\n */\n async function chatWithRecord(request: ChatCompletionRequest): Promise<HaiResult<ChatCompletionResponse>> {\n const start = Date.now()\n const result = await provider.chat(request)\n\n // 仅在调用成功且传入了 objectId + recordStore 且未禁用持久化时记录\n if (result.success && request.objectId && recordStore && request.enablePersist !== false) {\n try {\n const response = result.data\n const choice = response.choices[0]\n const record: ChatRecord = {\n id: `${response.id}_${Date.now()}_${recordSeq++}`,\n objectId: request.objectId,\n sessionId: request.sessionId ?? 'default',\n request: {\n model: response.model,\n messages: request.messages,\n },\n response: {\n content: choice?.message?.content ?? '',\n toolCalls: choice?.message?.tool_calls,\n finishReason: choice?.finish_reason ?? 'stop',\n usage: response.usage ?? { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 },\n },\n createdAt: Date.now(),\n duration: Date.now() - start,\n }\n await saveRecordAndSession(record, request.messages)\n }\n catch (error) {\n // 记录失败不影响 chat 结果\n logger.debug('Failed to save chat record', { error })\n }\n }\n\n return result\n }\n\n /**\n * 包装 chatStream,在有 objectId 时自动保存 ChatRecord\n *\n * 流式输出不受影响,记录在流消费完成后异步保存。\n */\n async function* chatStreamWithRecord(request: ChatCompletionRequest): AsyncIterable<ChatCompletionChunk> {\n const start = Date.now()\n const shouldRecord = !!(request.objectId && recordStore && request.enablePersist !== false)\n\n // 累积流式响应的中间状态\n let content = ''\n let finishReason: string | null = null\n // 使用更窄的本地类型:流式响应中工具调用均为 function 类型\n const toolCalls: Array<{ id: string, type: 'function', function: { name: string, arguments: string } }> = []\n let streamId = ''\n let resolvedModel = request.model ?? request.tempModel?.model ?? ''\n\n for await (const chunk of provider.chatStream(request)) {\n yield chunk\n\n if (!shouldRecord)\n continue\n\n // 累积元数据\n if (!streamId && chunk.id)\n streamId = chunk.id\n if (!resolvedModel && chunk.model)\n resolvedModel = chunk.model\n\n for (const choice of chunk.choices) {\n if (choice.delta.content)\n content += choice.delta.content\n if (choice.finish_reason)\n finishReason = choice.finish_reason\n // 累积工具调用片段\n if (choice.delta.tool_calls) {\n for (const tc of choice.delta.tool_calls) {\n if (!toolCalls[tc.index]) {\n toolCalls[tc.index] = { id: tc.id ?? '', type: 'function', function: { name: tc.function?.name ?? '', arguments: '' } }\n }\n if (tc.function?.arguments)\n toolCalls[tc.index].function.arguments += tc.function.arguments\n if (tc.function?.name)\n toolCalls[tc.index].function.name = tc.function.name\n if (tc.id)\n toolCalls[tc.index].id = tc.id\n }\n }\n }\n }\n\n // 流消费完成后保存记录\n if (shouldRecord) {\n try {\n const usage: TokenUsage = { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 }\n const record: ChatRecord = {\n id: `${streamId || 'stream'}_${Date.now()}_${recordSeq++}`,\n objectId: request.objectId!,\n sessionId: request.sessionId ?? 'default',\n request: {\n model: resolvedModel,\n messages: request.messages,\n },\n response: {\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls.filter(Boolean) : undefined,\n finishReason: finishReason ?? 'stop',\n usage,\n },\n createdAt: Date.now(),\n duration: Date.now() - start,\n }\n await saveRecordAndSession(record, request.messages)\n }\n catch (error) {\n logger.debug('Failed to save stream chat record', { error })\n }\n }\n }\n\n /**\n * 查询对话历史记录\n */\n async function getHistory(\n scope: InteractionScope,\n options?: ChatHistoryOptions,\n ): Promise<HaiResult<ChatRecord[]>> {\n if (!recordStore) {\n return ok([])\n }\n try {\n const records = await recordStore.query({\n objectId: scope.objectId,\n sessionId: scope.sessionId,\n orderBy: { field: 'createdAt', direction: options?.order ?? 'desc' },\n limit: options?.limit,\n })\n return ok(records)\n }\n catch (error) {\n return err(HaiAIError.LLM_HISTORY_FAILED, aiM('ai_llmHistoryFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n }\n\n /**\n * 列出指定 objectId 下的所有会话\n */\n async function listSessions(\n objectId: string,\n ): Promise<HaiResult<SessionInfo[]>> {\n if (!sessionStore) {\n return ok([])\n }\n try {\n const sessions = await sessionStore.query({\n objectId,\n orderBy: { field: 'updatedAt', direction: 'desc' },\n })\n return ok(sessions)\n }\n catch (error) {\n return err(HaiAIError.LLM_HISTORY_FAILED, aiM('ai_llmHistoryFailed', { params: { error: error instanceof Error ? error.message : String(error) } }), error)\n }\n }\n\n const llm: LLMOperations = {\n chat: chatWithRecord,\n chatStream: chatStreamWithRecord,\n listModels: () => provider.listModels(),\n getHistory,\n listSessions,\n\n async ask(question: string, options?: AskOptions): Promise<HaiResult<string>> {\n const messages: ChatMessage[] = []\n if (options?.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt })\n }\n messages.push({ role: 'user', content: question })\n const result = await chatWithRecord({\n messages,\n model: options?.model,\n temperature: options?.temperature,\n objectId: options?.objectId,\n sessionId: options?.sessionId,\n enablePersist: options?.enablePersist,\n tempModel: options?.tempModel,\n signal: options?.signal,\n })\n if (!result.success)\n return result as HaiResult<never>\n return ok(result.data.choices[0]?.message?.content ?? '')\n },\n\n async* askStream(question: string, options?: AskOptions): AsyncIterable<string> {\n const messages: ChatMessage[] = []\n if (options?.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt })\n }\n messages.push({ role: 'user', content: question })\n for await (const chunk of chatStreamWithRecord({\n messages,\n model: options?.model,\n temperature: options?.temperature,\n objectId: options?.objectId,\n sessionId: options?.sessionId,\n enablePersist: options?.enablePersist,\n tempModel: options?.tempModel,\n signal: options?.signal,\n })) {\n const delta = chunk.choices[0]?.delta?.content\n if (delta)\n yield delta\n }\n },\n\n async generateObject<T>(request: GenerateObjectRequest<T>): Promise<HaiResult<T>> {\n const baseMessages: ChatMessage[] = []\n if (request.systemPrompt)\n baseMessages.push({ role: 'system', content: request.systemPrompt })\n baseMessages.push(...request.messages)\n\n const jsonSchema = z.toJSONSchema(request.schema)\n const schemaName = request.schemaName ?? 'result'\n const maxRepairs = request.maxRepairs ?? 1\n let lastError = ''\n\n for (let attempt = 0; attempt <= maxRepairs; attempt++) {\n const messages: ChatMessage[] = attempt === 0\n ? baseMessages\n : [...baseMessages, { role: 'user', content: aiM('ai_generateObjectRepair', { params: { error: lastError } }) }]\n const result = await chatWithRecord({\n messages,\n model: request.model,\n temperature: request.temperature,\n tempModel: request.tempModel,\n enablePersist: false,\n signal: request.signal,\n response_format: { type: 'json_schema', json_schema: { name: schemaName, schema: jsonSchema, strict: true } },\n })\n if (!result.success)\n return result as HaiResult<never>\n\n const content = result.data.choices[0]?.message?.content\n const text = typeof content === 'string' ? content : ''\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n }\n catch {\n lastError = 'invalid JSON'\n continue\n }\n const validated = request.schema.safeParse(parsed)\n if (validated.success)\n return ok(validated.data)\n lastError = validated.error.message\n }\n\n return err(HaiAIError.INVALID_REQUEST, aiM('ai_generateObjectFailed', { params: { error: lastError || 'unknown' } }))\n },\n }\n\n const tools: ToolsOperations = {\n define: defineTool,\n createRegistry: createToolRegistry,\n }\n\n const stream: StreamOperations = {\n createProcessor: createStreamProcessor,\n collect: collectStream,\n createSSEDecoder,\n encodeSSE,\n }\n\n return { llm, tools, stream }\n}\n","/**\n * @h-ai/ai — MCP 子功能工厂\n *\n * 提供 MCP 工具/资源/提示词的注册与调用功能。\n * @module ai-mcp-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type {\n AIMCPFunctionsDeps,\n MCPContext,\n MCPOperations,\n MCPPrompt,\n MCPPromptMessage,\n MCPResource,\n MCPResourceContent,\n MCPToolDefinition,\n MCPToolHandler,\n} from './ai-mcp-types.js'\n\nimport { err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\n// ─── 内部类型 ───\n\n/** 工具注册记录(定义 + 处理器) */\ninterface ToolRegistration {\n /** 工具元数据 */\n definition: MCPToolDefinition\n /** 工具执行处理器 */\n handler: MCPToolHandler\n}\n\n/** 资源注册记录(元数据 + 内容加载器) */\ninterface ResourceRegistration {\n /** 资源元数据 */\n resource: MCPResource\n /** 内容加载器(延迟读取) */\n handler: () => Promise<MCPResourceContent>\n}\n\n/** 提示词注册记录(元数据 + 模板渲染器) */\ninterface PromptRegistration {\n /** 提示词元数据 */\n prompt: MCPPrompt\n /** 模板渲染器(接收参数,返回消息列表) */\n handler: (args: Record<string, string>) => Promise<MCPPromptMessage[]>\n}\n\n// ─── 工厂函数 ───\n\n/**\n * 创建 MCP 子功能\n *\n * 提供工具、资源、提示词的注册与调用功能。\n * 注册是同步,调用是异步。所有调用方法返回 `HaiResult<T>`。\n *\n * @param _deps - MCP 子功能依赖(config 保留供将来使用)\n * @returns MCPOperations 接口\n *\n * @example\n * ```ts\n * const mcp = createAIMCPFunctions({ config })\n * mcp.registerTool(\n * { name: 'echo', description: '回音', inputSchema: { type: 'object' } },\n * async (input) => input,\n * )\n * const result = await mcp.callTool('echo', { msg: 'hi' })\n * ```\n */\nexport function createAIMCPFunctions(_deps: AIMCPFunctionsDeps): MCPOperations {\n // _deps.config 保留供将来使用\n\n /** 工具注册表(按 name 索引) */\n const tools = new Map<string, ToolRegistration>()\n /** 资源注册表(按 uri 索引) */\n const resources = new Map<string, ResourceRegistration>()\n /** 提示词注册表(按 name 索引) */\n const prompts = new Map<string, PromptRegistration>()\n\n return {\n /** 注册 MCP 工具(同名覆盖) */\n registerTool<TInput, TOutput>(\n definition: MCPToolDefinition,\n handler: MCPToolHandler<TInput, TOutput>,\n ): HaiResult<void> {\n tools.set(definition.name, {\n definition,\n handler: handler as MCPToolHandler,\n })\n return ok(undefined)\n },\n\n /** 注册 MCP 资源(同 URI 覆盖) */\n registerResource(\n resource: MCPResource,\n handler: () => Promise<MCPResourceContent>,\n ): HaiResult<void> {\n resources.set(resource.uri, { resource, handler })\n return ok(undefined)\n },\n\n /** 注册 MCP 提示词模板(同名覆盖) */\n registerPrompt(\n prompt: MCPPrompt,\n handler: (args: Record<string, string>) => Promise<MCPPromptMessage[]>,\n ): HaiResult<void> {\n prompts.set(prompt.name, { prompt, handler })\n return ok(undefined)\n },\n\n /**\n * 调用已注册的 MCP 工具\n *\n * @param name - 工具名称\n * @param args - 输入参数\n * @param context - 执行上下文(可选,未传时自动生成 requestId)\n * @returns 工具返回值或 `MCP_TOOL_ERROR`\n */\n async callTool(\n name: string,\n args: unknown,\n context?: MCPContext,\n ): Promise<HaiResult<unknown>> {\n try {\n const registration = tools.get(name)\n if (!registration) {\n return err(HaiAIError.MCP_TOOL_ERROR, aiM('ai_mcpToolNotFound', { params: { name } }))\n }\n const ctx: MCPContext = context || { requestId: crypto.randomUUID() }\n const result = await registration.handler(args, ctx)\n return ok(result)\n }\n catch (error) {\n return err(\n HaiAIError.MCP_TOOL_ERROR,\n aiM('ai_mcpToolFailed', {\n params: { name, error: error instanceof Error ? error.message : 'Unknown error' },\n }),\n error,\n )\n }\n },\n\n /**\n * 读取已注册的 MCP 资源\n *\n * @param uri - 资源 URI\n * @returns 资源内容或 `MCP_RESOURCE_ERROR`\n */\n async readResource(uri: string): Promise<HaiResult<MCPResourceContent>> {\n try {\n const registration = resources.get(uri)\n if (!registration) {\n return err(HaiAIError.MCP_RESOURCE_ERROR, aiM('ai_mcpResourceNotFound', { params: { uri } }))\n }\n const content = await registration.handler()\n return ok(content)\n }\n catch (error) {\n return err(\n HaiAIError.MCP_RESOURCE_ERROR,\n aiM('ai_mcpResourceFailed', {\n params: { uri, error: error instanceof Error ? error.message : 'Unknown error' },\n }),\n error,\n )\n }\n },\n\n /**\n * 获取已注册的 MCP 提示词\n *\n * 自动校验必填参数,缺少时返回 `MCP_PROTOCOL_ERROR`。\n *\n * @param name - 提示词名称\n * @param args - 模板参数\n * @returns 渲染后的消息列表或错误\n */\n async getPrompt(\n name: string,\n args: Record<string, string>,\n ): Promise<HaiResult<MCPPromptMessage[]>> {\n try {\n const registration = prompts.get(name)\n if (!registration) {\n return err(HaiAIError.MCP_PROTOCOL_ERROR, aiM('ai_mcpPromptNotFound', { params: { name } }))\n }\n\n // 验证必需参数\n for (const arg of registration.prompt.arguments || []) {\n if (arg.required && !(arg.name in args)) {\n return err(HaiAIError.MCP_PROTOCOL_ERROR, aiM('ai_mcpPromptMissingArg', { params: { name, arg: arg.name } }))\n }\n }\n\n const messages = await registration.handler(args)\n return ok(messages)\n }\n catch (error) {\n return err(\n HaiAIError.MCP_PROTOCOL_ERROR,\n aiM('ai_mcpPromptFailed', {\n params: { name, error: error instanceof Error ? error.message : 'Unknown error' },\n }),\n error,\n )\n }\n },\n }\n}\n","/**\n * @h-ai/ai — Memory 公共入口封装(作用域绑定 + 管理接口 + 空清空保护)\n *\n * 在 Provider 实现的 {@link MemoryCoreOperations} 基础上,封装出对外的 {@link MemoryOperations}:\n * - `scoped(binding)`:返回自动绑定 objectId / scope 的安全实例(多租户推荐入口);\n * - `admin.clearAll({ confirm })`:唯一的全局清空入口,需显式确认;\n * - `clear`:拒绝空过滤调用,防止「忘记传条件」导致误清全局。\n * @module memory/ai-memory-facade\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type {\n MemoryClearAllOptions,\n MemoryClearOptions,\n MemoryCoreOperations,\n MemoryEntryInput,\n MemoryOperations,\n ScopedMemoryBinding,\n ScopedMemoryOperations,\n} from './ai-memory-types.js'\n\nimport { err } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\n/**\n * 创建绑定作用域的记忆实例:所有操作自动携带 objectId / scope,get/update/remove 自动归属校验。\n */\nfunction createScopedMemory(core: MemoryCoreOperations, binding: ScopedMemoryBinding): ScopedMemoryOperations {\n const { objectId, scope } = binding\n const accessScope = { objectId, scope }\n\n return {\n extract: (messages: ChatMessage[], options) =>\n core.extract(messages, { ...options, objectId, scope }),\n recall: (query: string, options) =>\n core.recall(query, { ...options, objectId, scope }),\n injectMemories: (messages: ChatMessage[], options) =>\n core.injectMemories(messages, { ...options, objectId, scope }),\n add: (entry: Omit<MemoryEntryInput, 'objectId' | 'scope'>) =>\n core.add({ ...entry, objectId, scope }),\n update: (memoryId: string, updates) => core.update(memoryId, updates, accessScope),\n get: (memoryId: string) => core.get(memoryId, accessScope),\n remove: (memoryId: string) => core.remove(memoryId, accessScope),\n list: options =>\n core.list({ ...options, objectId, scope }),\n listPage: options =>\n core.listPage({ ...options, objectId, scope }),\n clear: options =>\n core.clear({ ...options, objectId, scope }),\n }\n}\n\n/**\n * 将 Provider 核心操作封装为对外的公共记忆操作接口。\n *\n * @param core - Provider 实现的核心操作\n * @returns 增加 scoped / admin 且对 clear 施加空过滤保护的公共接口\n */\nexport function createMemoryOperations(core: MemoryCoreOperations): MemoryOperations {\n return {\n ...core,\n\n /**\n * 清空记忆(空过滤保护)。\n *\n * 未传任何过滤条件(objectId / types / scope 全空)时**拒绝执行**,\n * 避免误清全局;全局清空必须显式使用 `admin.clearAll({ confirm: true })`。\n */\n async clear(options?: MemoryClearOptions): Promise<HaiResult<void>> {\n const hasFilter = Boolean(options?.objectId) || Boolean(options?.types?.length) || Boolean(options?.scope)\n if (!hasFilter) {\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryClearRequiresFilter'))\n }\n return core.clear(options)\n },\n\n scoped: (binding: ScopedMemoryBinding) => createScopedMemory(core, binding),\n\n admin: {\n async clearAll(options: MemoryClearAllOptions): Promise<HaiResult<void>> {\n if (options?.confirm !== true) {\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryClearAllUnconfirmed'))\n }\n return core.clear()\n },\n },\n }\n}\n","/**\n * @h-ai/ai — Memory 记忆提取\n *\n * 使用 LLM 从对话消息中提取值得记住的事实、偏好、事件等。\n * @module ai-memory-extractor\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage, LLMOperations, TempModelConfig } from '../llm/ai-llm-types.js'\nimport type { MemoryEntryInput, MemoryType } from './ai-memory-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory-extractor' })\nconst LEADING_MARKDOWN_FENCE_REGEX = /^```(?:json)?\\n?/\nconst TRAILING_MARKDOWN_FENCE_REGEX = /\\n?```$/\n\n// ─── 提取提示词 ───\n\nconst MEMORY_EXTRACTION_SYSTEM_PROMPT = `You are a memory extraction assistant. Analyze the conversation and extract important information worth remembering for future interactions.\n\nExtract items in the following categories:\n- \"fact\": Factual information mentioned in the conversation\n- \"preference\": User preferences, likes, dislikes, or habits\n- \"event\": Important events, deadlines, or time-specific information\n- \"entity\": Key people, organizations, projects, or concepts mentioned\n- \"instruction\": Explicit user instructions or rules for future behavior\n\nReturn a JSON array of extracted memories. Each memory has:\n- \"content\": a concise description of the memory (string, required)\n- \"type\": one of \"fact\", \"preference\", \"event\", \"entity\", \"instruction\" (required)\n- \"importance\": a float from 0.0 to 1.0 indicating how important this is to remember (required)\n\nRules:\n- Only extract clearly stated information. Do NOT infer or guess.\n- Be concise — each memory should be a single clear statement.\n- Deduplicate: do not extract the same information twice.\n- Rate importance based on likely future usefulness (0.3 = minor detail, 0.7 = moderately useful, 1.0 = critical).\n- Return an empty array [] if no memories worth extracting are found.\n- Return ONLY the JSON array, no markdown fences, no explanation.`\n\n/**\n * 将对话消息格式化为文本\n */\nfunction formatMessages(messages: ChatMessage[]): string {\n return messages\n .filter(m => m.role === 'user' || m.role === 'assistant')\n .map((m) => {\n const content = typeof m.content === 'string' ? m.content : '[multimodal content]'\n return `${m.role}: ${content}`\n })\n .join('\\n')\n}\n\n/**\n * 从对话中提取记忆\n *\n * @param llm - LLM 操作接口\n * @param messages - 对话消息列表\n * @param options - 提取选项\n * @param options.types - 只提取指定类型\n * @param options.model - 指定提取用的模型\n * @param options.minImportance - 过滤低重要性条目\n * @param options.objectId - 所属主体 ID\n * @param options.systemPrompt - 自定义提取用的系统提示词\n * @returns 提取到的记忆输入列表\n * @param options.tempModel - 临时模型配置\n * @param options.signal - 取消信号\n */\nexport async function extractMemories(\n llm: LLMOperations,\n messages: ChatMessage[],\n options?: {\n types?: MemoryType[]\n model?: string\n minImportance?: number\n objectId?: string\n systemPrompt?: string\n tempModel?: TempModelConfig\n signal?: AbortSignal\n },\n): Promise<HaiResult<MemoryEntryInput[]>> {\n const conversationText = formatMessages(messages)\n if (!conversationText.trim()) {\n return ok([])\n }\n\n try {\n let userPrompt = conversationText\n if (options?.types && options.types.length > 0) {\n userPrompt += `\\n\\nOnly extract memories of these types: ${options.types.join(', ')}`\n }\n\n const chatResult = await llm.chat({\n model: options?.model,\n ...(options?.tempModel ? { tempModel: options.tempModel } : {}),\n messages: [\n { role: 'system', content: options?.systemPrompt ?? MEMORY_EXTRACTION_SYSTEM_PROMPT },\n { role: 'user', content: userPrompt },\n ],\n temperature: 0.1,\n signal: options?.signal,\n })\n\n if (!chatResult.success) {\n logger.warn('Memory extraction LLM call failed', { error: chatResult.error })\n return err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(chatResult.error.message) } }), chatResult.error)\n }\n\n const content = chatResult.data.choices[0]?.message?.content ?? ''\n let entries = parseMemoryResponse(content)\n\n // 按 minImportance 过滤\n if (options?.minImportance && options.minImportance > 0) {\n entries = entries.filter(e => (e.importance ?? 0) >= options.minImportance!)\n }\n\n // 按类型过滤\n if (options?.types && options.types.length > 0) {\n const typeSet = new Set<MemoryType>(options.types)\n entries = entries.filter(e => typeSet.has(e.type))\n }\n\n // 附加 objectId\n if (options?.objectId) {\n entries = entries.map(e => ({ ...e, objectId: options.objectId }))\n }\n\n logger.trace('Memory extraction completed', { messageCount: messages.length, extractedCount: entries.length })\n return ok(entries)\n }\n catch (error) {\n logger.error('Memory extraction failed', { error })\n return err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(error) } }), error)\n }\n}\n\n// ─── 响应解析 ───\n\nconst VALID_MEMORY_TYPES = new Set<string>(['fact', 'preference', 'event', 'entity', 'instruction'])\n\n/**\n * 解析 LLM 返回的记忆 JSON\n */\nfunction parseMemoryResponse(content: string): MemoryEntryInput[] {\n let cleaned = content.trim()\n\n // 去除 markdown 代码围栏\n if (cleaned.startsWith('```')) {\n cleaned = cleaned.replace(LEADING_MARKDOWN_FENCE_REGEX, '').replace(TRAILING_MARKDOWN_FENCE_REGEX, '')\n }\n\n try {\n const parsed = JSON.parse(cleaned) as unknown\n\n if (Array.isArray(parsed)) {\n return parsed.filter(isValidMemoryItem).map(normalizeMemoryItem)\n }\n\n if (typeof parsed === 'object' && parsed !== null && 'memories' in parsed) {\n const memories = (parsed as { memories: unknown }).memories\n if (Array.isArray(memories)) {\n return memories.filter(isValidMemoryItem).map(normalizeMemoryItem)\n }\n }\n\n logger.warn('Memory extraction returned unexpected format', { content: content.slice(0, 200) })\n return []\n }\n catch {\n logger.warn('Memory extraction returned invalid JSON', { content: content.slice(0, 200) })\n return []\n }\n}\n\n/**\n * 校验记忆结构\n */\nfunction isValidMemoryItem(item: unknown): item is Record<string, unknown> {\n if (typeof item !== 'object' || item === null)\n return false\n const obj = item as Record<string, unknown>\n return typeof obj.content === 'string' && obj.content.length > 0\n && typeof obj.type === 'string'\n}\n\n/**\n * 标准化记忆条目\n */\nfunction normalizeMemoryItem(item: Record<string, unknown>): MemoryEntryInput {\n const type = VALID_MEMORY_TYPES.has(item.type as string)\n ? item.type as MemoryType\n : 'fact'\n\n const importance = typeof item.importance === 'number'\n ? Math.max(0, Math.min(1, item.importance))\n : 0.5\n\n return {\n content: (item.content as string).trim(),\n type,\n importance,\n }\n}\n","/**\n * @h-ai/ai — Memory 注入共享实现\n *\n * 原生与 Mem0 后端共用同一套上下文注入行为,确保切换后端不改变消息结构。\n * @module ai-memory-injection\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { MemoryAccessScope, MemoryEntry, MemoryInjectionOptions, MemoryRecallOptions } from './ai-memory-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory' })\n\ntype RecallMemories = (query: string, options?: MemoryRecallOptions) => Promise<HaiResult<MemoryEntry[]>>\n\n/**\n * 按 ID 访问单条记忆时的归属校验(native / Mem0 后端共用)。\n *\n * 返回 `true` 表示该记忆不属于调用主体 / 作用域,调用方应统一返回 `MEMORY_NOT_FOUND`;\n * `accessScope` 未传时不做校验(返回 `false`,向后兼容)。\n */\nexport function isMemoryAccessDenied(entry: MemoryEntry, accessScope?: MemoryAccessScope): boolean {\n if (!accessScope)\n return false\n if (entry.objectId !== accessScope.objectId)\n return true\n if (accessScope.scope) {\n if (!entry.scope)\n return true\n const entryScope = entry.scope as Record<string, unknown>\n return !Object.entries(accessScope.scope).every(([key, value]) => entryScope[key] === value)\n }\n return false\n}\n\n/** 从消息中提取最后一条用户文本 */\nfunction extractQueryFromMessages(messages: ChatMessage[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (message.role === 'user')\n return typeof message.content === 'string' ? message.content : ''\n }\n return ''\n}\n\n/** 将召回结果注入消息列表 */\nexport async function injectRelevantMemories(\n messages: ChatMessage[],\n options: MemoryInjectionOptions | undefined,\n recall: RecallMemories,\n): Promise<HaiResult<ChatMessage[]>> {\n const topK = options?.topK ?? 5\n const position = options?.position ?? 'system'\n\n try {\n const query = extractQueryFromMessages(messages)\n if (!query)\n return ok([...messages])\n\n const recallResult = await recall(query, {\n topK,\n candidateMultiplier: options?.candidateMultiplier,\n objectId: options?.objectId,\n scope: options?.scope,\n types: options?.types,\n minImportance: options?.minImportance,\n })\n if (!recallResult.success) {\n return err(HaiAIError.MEMORY_ENRICH_FAILED, aiM('ai_memoryEnrichFailed', { params: { error: recallResult.error.message } }), recallResult.error)\n }\n\n if (recallResult.data.length === 0)\n return ok([...messages])\n\n let memoryText = recallResult.data\n .map((memory, index) => `[${index + 1}] (${memory.type}) ${memory.content}`)\n .join('\\n')\n\n if (options?.maxTokens && options.maxTokens > 0) {\n const estimatedTokens = memoryText.length * 0.25\n if (estimatedTokens > options.maxTokens) {\n const maxChars = Math.floor(options.maxTokens / 0.25)\n memoryText = `${memoryText.slice(0, maxChars)}...`\n }\n }\n\n const memoryBlock = `\\n\\n--- Relevant Memories ---\\n${memoryText}\\n--- End Memories ---`\n const result = [...messages]\n\n if (position === 'system') {\n const systemIndex = result.findIndex(message => message.role === 'system')\n if (systemIndex >= 0) {\n const systemMessage = result[systemIndex]\n result[systemIndex] = {\n ...systemMessage,\n content: (systemMessage as { content: string }).content + memoryBlock,\n }\n }\n else {\n result.unshift({\n role: 'system',\n content: `You have the following relevant memories from previous interactions:${memoryBlock}`,\n })\n }\n }\n else {\n let lastUserIndex = -1\n for (let index = result.length - 1; index >= 0; index--) {\n if (result[index].role === 'user') {\n lastUserIndex = index\n break\n }\n }\n if (lastUserIndex > 0) {\n result.splice(lastUserIndex, 0, {\n role: 'system',\n content: `Relevant memories:${memoryBlock}`,\n })\n }\n }\n\n logger.trace('Memories enriched', { count: recallResult.data.length, position })\n return ok(result)\n }\n catch (error) {\n logger.error('Memory enrichment failed', { error })\n return err(HaiAIError.MEMORY_ENRICH_FAILED, aiM('ai_memoryEnrichFailed', { params: { error: String(error) } }), error)\n }\n}\n","/**\n * @h-ai/ai — Mem0 OSS 记忆 Provider(真·嵌入式 mem0 引擎)\n *\n * 通过 `mem0ai/oss` 的 `Memory` 引擎实现记忆能力,LLM / Embedder 从 AIConfig 提取\n * (OpenAI 兼容,走 baseURL),向量库从 storeProvider 暴露的原始连接映射:\n * qdrant / pgvector 复用同一后端;lancedb / chroma 等 mem0 不支持的持久化后端默认\n * fail-fast,仅在显式允许时退回 in-memory 存储。历史记录禁用以避免额外 SQLite 依赖。\n * @module ai-memory-provider-mem0-oss\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { MemoryConfig as Mem0Config, Memory as Mem0Memory, MemoryItem as Mem0MemoryItem } from 'mem0ai/oss'\n\nimport type { AIConfig, MemoryConfig } from '../../ai-config.js'\nimport type { ChatMessage, LLMOperations } from '../../llm/ai-llm-types.js'\nimport type { AIVectorBackend } from '../../store/ai-store-types.js'\nimport type {\n MemoryAccessScope,\n MemoryCoreOperations,\n MemoryEntry,\n MemoryEntryInput,\n MemoryExtractOptions,\n MemoryType,\n MemoryUpdateInput,\n} from '../ai-memory-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../../ai-config.js'\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { extractMemories as extractTypedMemories } from '../ai-memory-extractor.js'\nimport { injectRelevantMemories, isMemoryAccessDenied } from '../ai-memory-injection.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory-mem0-oss' })\nconst DEFAULT_IMPORTANCE = 0.5\nconst DEFAULT_OBJECT_ID = 'hai-global'\nconst MEMORY_TYPES = new Set<MemoryType>(['fact', 'preference', 'event', 'entity', 'instruction'])\n\n/** 创建 Mem0 OSS Provider 的依赖 */\nexport interface Mem0OssDeps {\n /** 记忆配置(与 native 共用顶层字段) */\n config: MemoryConfig\n /** 完整 AI 配置(用于解析 LLM / Embedder) */\n aiConfig: AIConfig\n /** hai LLM 操作接口(用于框架层记忆提取,保证 type/importance 分类与 native 一致) */\n llm: LLMOperations\n /** 向量库集合名 */\n collectionName: string\n /** 向量维度(可选,未提供时由 mem0 探测) */\n embeddingDims?: number\n /** hai vecdb 后端连接(qdrant / pgvector 复用;不支持的后端默认 fail-fast) */\n vectorBackend?: AIVectorBackend\n}\n\ninterface Mem0OssContext {\n memory: Mem0Memory\n /** hai LLM 操作接口(框架层提取用) */\n llm: LLMOperations\n /** 提取默认 systemPrompt(模块配置,可被调用级 systemPrompt 覆盖) */\n systemPrompt?: string\n defaultObjectId: string\n /** 检索默认返回数量 */\n defaultTopK: number\n /** 候选池倍数(scope 过滤前的候选取回宽度 = topK × candidateMultiplier) */\n candidateMultiplier: number\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction normalizeType(value: unknown, fallback: MemoryType): MemoryType {\n return typeof value === 'string' && MEMORY_TYPES.has(value as MemoryType) ? value as MemoryType : fallback\n}\n\nfunction normalizeImportance(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? Math.max(0, Math.min(1, value)) : fallback\n}\n\nfunction parseTimestamp(value: unknown, fallback: number): number {\n if (typeof value === 'string' || typeof value === 'number') {\n const timestamp = new Date(value).getTime()\n if (Number.isFinite(timestamp))\n return timestamp\n }\n return fallback\n}\n\n/**\n * 将 hai 业务字段编码为 mem0 metadata\n *\n * 完整保留业务 metadata,\n * 并记录归属主体 `hai_object_id`。\n * `category` 额外平铺到顶层,兼容 consolidation 逻辑与 mem0 过滤。\n *\n * @param entry - 记忆输入字段(type / importance / scope / metadata)\n * @param objectId - 归属主体 ID(写入 hai_object_id)\n */\nfunction buildMetadata(\n entry: Pick<MemoryEntryInput, 'type' | 'importance' | 'scope' | 'metadata'>,\n objectId: string,\n): Record<string, unknown> {\n const metadata: Record<string, unknown> = {\n hai_type: entry.type,\n hai_importance: entry.importance ?? DEFAULT_IMPORTANCE,\n hai_object_id: objectId,\n }\n if (entry.scope)\n metadata.hai_scope = entry.scope\n if (entry.metadata && Object.keys(entry.metadata).length > 0)\n metadata.hai_metadata = entry.metadata\n const category = entry.metadata?.category\n if (typeof category === 'string' && category.trim().length > 0)\n metadata.category = category.trim()\n return metadata\n}\n\n/**\n * 从 mem0 metadata 还原 hai 公共元数据(剥离内部保留键)\n *\n * 优先返回完整业务 metadata(`hai_metadata`);对早期仅平铺 `category` 的数据做兼容。\n */\nfunction toPublicMetadata(metadata: Record<string, unknown>): Record<string, unknown> | undefined {\n const business: Record<string, unknown> = isRecord(metadata.hai_metadata) ? { ...metadata.hai_metadata } : {}\n if (business.category === undefined && typeof metadata.category === 'string' && metadata.category.trim().length > 0)\n business.category = metadata.category.trim()\n return Object.keys(business).length > 0 ? business : undefined\n}\n\n/** 将 mem0 MemoryItem 映射为 hai MemoryEntry */\nfunction toMemoryEntry(item: Mem0MemoryItem, fallbackObjectId: string): MemoryEntry {\n const metadata = isRecord(item.metadata) ? item.metadata : {}\n const now = Date.now()\n const createdAt = parseTimestamp(item.createdAt, now)\n const scope = isRecord(metadata.hai_scope) ? metadata.hai_scope : undefined\n // 优先使用写入时记录的归属主体,避免按 memoryId 直读时误判为默认主体\n const objectId = typeof metadata.hai_object_id === 'string' ? metadata.hai_object_id : fallbackObjectId\n\n return {\n id: item.id,\n content: item.memory ?? '',\n type: normalizeType(metadata.hai_type, 'fact'),\n importance: normalizeImportance(metadata.hai_importance, DEFAULT_IMPORTANCE),\n objectId,\n scope,\n metadata: toPublicMetadata(metadata),\n createdAt,\n lastAccessedAt: parseTimestamp(item.updatedAt, createdAt),\n accessCount: 0,\n }\n}\n\n/**\n * 判断记忆条目是否匹配指定业务作用域(key-value 全部相等;条目无 scope 时不匹配)\n */\nfunction matchScope(entry: MemoryEntry, scope: Record<string, unknown>): boolean {\n if (!entry.scope)\n return false\n return Object.entries(scope).every(([k, v]) => (entry.scope as Record<string, unknown>)[k] === v)\n}\n\n/** mem0 向量库解析结果:配置 + 实际生效 provider + 是否持久化 */\ninterface Mem0VectorStoreResolution {\n vectorStore: Mem0Config['vectorStore']\n /** 实际生效的向量 provider(qdrant / pgvector / memory) */\n provider: string\n /** 是否为持久化后端(服务重启后数据是否保留) */\n persistent: boolean\n}\n\n/**\n * 将 hai vecdb 后端映射为 mem0 vectorStore 配置\n *\n * mem0 TS 仅支持 qdrant / pgvector。当底层后端为 lancedb / chroma / 未知时无法映射,\n * 默认 fail-fast(返回错误)以避免服务重启后记忆静默丢失;仅当显式允许时才退回内存存储。\n */\nfunction buildVectorStoreConfig(deps: Mem0OssDeps): HaiResult<Mem0VectorStoreResolution> {\n const collectionName = deps.collectionName\n const dimension = deps.embeddingDims\n const backend = deps.vectorBackend\n\n if (backend?.type === 'qdrant') {\n return ok({\n provider: 'qdrant',\n persistent: true,\n vectorStore: {\n provider: 'qdrant',\n config: {\n url: backend.url,\n apiKey: backend.apiKey,\n collectionName,\n ...(dimension ? { dimension, embeddingModelDims: dimension } : {}),\n },\n },\n })\n }\n\n if (backend?.type === 'pgvector') {\n return ok({\n provider: 'pgvector',\n persistent: true,\n vectorStore: {\n provider: 'pgvector',\n config: {\n host: backend.host,\n port: backend.port,\n dbName: backend.database,\n user: backend.user,\n password: backend.password,\n connectionString: backend.connectionString,\n collectionName,\n ...(dimension ? { dimension, embeddingModelDims: dimension } : {}),\n },\n },\n })\n }\n\n // 配置了持久化后端但 mem0 无法映射(lancedb / chroma / 未知):默认 fail-fast,\n // 避免服务重启后记忆静默丢失;仅当 memory.allowEphemeralFallback=true 时退回内存存储。\n if (backend && !deps.config.allowEphemeralFallback) {\n return err(\n HaiAIError.CONFIGURATION_ERROR,\n aiM('ai_memoryEphemeralFallbackDenied', { params: { backend: backend.type } }),\n )\n }\n if (backend)\n logger.warn('Mem0 OSS falls back to in-memory vector store (allowEphemeralFallback=true); data will not survive restart', { backend: backend.type })\n return ok({\n provider: 'memory',\n persistent: false,\n vectorStore: {\n provider: 'memory',\n config: {\n collectionName,\n ...(dimension ? { dimension } : {}),\n },\n },\n })\n}\n\n/** 解析 LLM / Embedder 配置并构建 mem0 Memory 配置(含实际生效向量 provider 与持久化状态) */\nfunction buildMem0Config(deps: Mem0OssDeps): HaiResult<{ config: Mem0Config, vectorProvider: string, persistent: boolean }> {\n const llmResolved = resolveModelEntry(deps.aiConfig.llm, 'extraction', undefined, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for mem0 LLM' } }),\n })\n if (!llmResolved.success)\n return llmResolved\n\n const embedderResolved = resolveModelEntry(deps.aiConfig.llm, 'embedding', undefined, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for mem0 embedder' } }),\n })\n if (!embedderResolved.success)\n return embedderResolved\n\n const vectorResolved = buildVectorStoreConfig(deps)\n if (!vectorResolved.success)\n return vectorResolved\n\n return ok({\n vectorProvider: vectorResolved.data.provider,\n persistent: vectorResolved.data.persistent,\n config: {\n llm: {\n provider: 'openai',\n config: {\n apiKey: llmResolved.data.apiKey,\n model: llmResolved.data.model,\n baseURL: llmResolved.data.baseUrl,\n temperature: 0.1,\n },\n },\n embedder: {\n provider: 'openai',\n config: {\n apiKey: embedderResolved.data.apiKey,\n model: embedderResolved.data.model,\n baseURL: embedderResolved.data.baseUrl,\n ...(deps.embeddingDims ? { embeddingDims: deps.embeddingDims } : {}),\n },\n },\n vectorStore: vectorResolved.data.vectorStore,\n disableHistory: true,\n customInstructions: deps.config.systemPrompt,\n },\n })\n}\n\nasync function extractMemories(context: Mem0OssContext, messages: ChatMessage[], options?: MemoryExtractOptions): Promise<HaiResult<MemoryEntry[]>> {\n const objectId = options?.objectId ?? context.defaultObjectId\n\n // 在框架层用统一提取器完成分类与打分(honor types / model / minImportance / systemPrompt / tempModel),\n // 再以 infer:false 写入 mem0 并保留 hai_type / hai_importance,确保与 native 后端业务语义一致。\n const extracted = await extractTypedMemories(context.llm, messages, {\n types: options?.types,\n model: options?.model,\n minImportance: options?.minImportance,\n systemPrompt: options?.systemPrompt ?? context.systemPrompt,\n objectId,\n tempModel: options?.tempModel,\n signal: options?.signal,\n })\n if (!extracted.success)\n return extracted\n if (extracted.data.length === 0)\n return ok([])\n\n try {\n // 批量并发写入,避免 await-in-loop(N+1)\n const stored = await Promise.all(extracted.data.map(async (entry) => {\n const response = await context.memory.add([{ role: 'user', content: entry.content }], {\n userId: objectId,\n metadata: buildMetadata({ type: entry.type, importance: entry.importance, scope: options?.scope, metadata: entry.metadata }, objectId),\n infer: false,\n })\n const item = response.results[0]\n return item ? toMemoryEntry(item, objectId) : undefined\n }))\n return ok(stored.filter((entry): entry is MemoryEntry => entry !== undefined))\n }\n catch (error) {\n logger.error('Mem0 OSS extract failed', { error })\n return err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(error) } }), error)\n }\n}\n\nasync function recallMemories(context: Mem0OssContext, query: string, options?: { topK?: number, candidateMultiplier?: number, objectId?: string, minImportance?: number, types?: MemoryType[], recencyWeight?: number, scope?: Record<string, unknown> }): Promise<HaiResult<MemoryEntry[]>> {\n const objectId = options?.objectId ?? context.defaultObjectId\n const topK = options?.topK ?? context.defaultTopK\n const candidateMultiplier = Math.max(1, options?.candidateMultiplier ?? context.candidateMultiplier)\n try {\n // mem0 无法下推 scope(存于 metadata),只能先取回更大的候选池再在内存过滤。\n // 若仅取 topK,scope 命中的记忆很可能已被同主体其它主题/角色的高相关条目挤出候选,导致漏召回。\n const response = await context.memory.search(query, {\n filters: { userId: objectId },\n topK: topK * candidateMultiplier,\n })\n let entries = response.results\n .map(item => toMemoryEntry(item, objectId))\n // 主体隔离兜底:即便底层向量库未按 user 过滤,也确保只召回归属该主体的记忆\n .filter(entry => entry.objectId === objectId)\n // 按业务作用域严格过滤,避免同一主体下不同主题/角色互相召回\n .filter(entry => !options?.scope || matchScope(entry, options.scope))\n // 按类型过滤\n .filter(entry => !options?.types?.length || options.types.includes(entry.type))\n .filter(entry => entry.importance >= (options?.minImportance ?? 0))\n\n // 时间衰减重排:mem0 已按相关度排序,以排名作为相关度代理与时间新近度线性加权\n const recencyWeight = options?.recencyWeight\n if (recencyWeight && recencyWeight > 0 && entries.length > 1) {\n const times = entries.map(entry => entry.createdAt)\n const minTime = Math.min(...times)\n const span = Math.max(1, Math.max(...times) - minTime)\n const count = entries.length\n entries = entries\n .map((entry, index) => {\n const relevance = 1 - index / (count - 1)\n const recency = (entry.createdAt - minTime) / span\n return { entry, score: relevance * (1 - recencyWeight) + recency * recencyWeight }\n })\n .sort((a, b) => b.score - a.score)\n .map(ranked => ranked.entry)\n }\n\n return ok(entries.slice(0, topK))\n }\n catch (error) {\n logger.error('Mem0 OSS recall failed', { error })\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n}\n\nasync function addMemory(context: Mem0OssContext, entry: MemoryEntryInput): Promise<HaiResult<MemoryEntry>> {\n const objectId = entry.objectId ?? context.defaultObjectId\n try {\n const response = await context.memory.add([{ role: 'user', content: entry.content }], {\n userId: objectId,\n metadata: buildMetadata(entry, objectId),\n infer: false,\n })\n const stored = response.results[0]\n if (!stored)\n throw new Error('Mem0 OSS did not return the stored memory')\n return ok(toMemoryEntry(stored, objectId))\n }\n catch (error) {\n logger.error('Mem0 OSS add failed', { error })\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 更新一条记忆的任意字段(content / type / importance / metadata / scope)\n *\n * mem0 OSS 的 `update()` 仅能改写记忆文本,且未暴露 metadata 更新 API,其内部 vectorStore\n * 为私有字段,无法安全地原地改写 payload。为完整实现更新语义,此处采用\n * 「读取现有条目 → 合并字段 → 删除旧条目 → infer:false 重新写入」的方式。\n *\n * 代价:mem0 后端会为更新后的记忆分配新的 memoryId(与 native 后端保持稳定 id 的行为不同,\n * 已在 README 中作为后端差异说明);通过 `timestamp` 保留原始创建时间。\n */\nasync function updateMemory(context: Mem0OssContext, memoryId: string, updates: MemoryUpdateInput, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n try {\n const item = await context.memory.get(memoryId)\n if (!item)\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n\n const existing = toMemoryEntry(item, context.defaultObjectId)\n if (isMemoryAccessDenied(existing, accessScope))\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n const objectId = existing.objectId ?? context.defaultObjectId\n\n // 仅改文本:mem0.update 可原地更新,保持 memoryId 稳定\n const onlyContentChanged = updates.content !== undefined\n && updates.type === undefined\n && updates.importance === undefined\n && updates.metadata === undefined\n if (onlyContentChanged) {\n await context.memory.update(memoryId, updates.content!)\n const refreshed = await context.memory.get(memoryId)\n return ok(refreshed ? toMemoryEntry(refreshed, objectId) : { ...existing, content: updates.content! })\n }\n\n // 涉及 type / importance / metadata:删除后按合并结果重建\n const merged: MemoryEntryInput = {\n content: updates.content ?? existing.content,\n type: updates.type ?? existing.type,\n importance: updates.importance ?? existing.importance,\n objectId,\n scope: existing.scope,\n metadata: updates.metadata ?? existing.metadata,\n }\n await context.memory.delete(memoryId)\n const response = await context.memory.add([{ role: 'user', content: merged.content }], {\n userId: objectId,\n metadata: buildMetadata(merged, objectId),\n infer: false,\n timestamp: existing.createdAt,\n })\n const stored = response.results[0]\n if (!stored)\n throw new Error('Mem0 OSS did not return the updated memory')\n return ok(toMemoryEntry(stored, objectId))\n }\n catch (error) {\n logger.error('Mem0 OSS update failed', { id: memoryId, error })\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n}\n\nasync function getMemory(context: Mem0OssContext, memoryId: string, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n try {\n const item = await context.memory.get(memoryId)\n if (!item)\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n const entry = toMemoryEntry(item, context.defaultObjectId)\n if (isMemoryAccessDenied(entry, accessScope))\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n return ok(entry)\n }\n catch (error) {\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n}\n\nasync function removeMemory(context: Mem0OssContext, memoryId: string, accessScope?: MemoryAccessScope): Promise<HaiResult<void>> {\n try {\n if (accessScope) {\n const item = await context.memory.get(memoryId)\n if (!item || isMemoryAccessDenied(toMemoryEntry(item, context.defaultObjectId), accessScope))\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n await context.memory.delete(memoryId)\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n}\n\n/**\n * 列出指定主体的记忆条目(供 list / listPage / clear 复用)\n *\n * objectId 走 mem0 过滤,types / scope 在内存中匹配(scope 存于 metadata.hai_scope,无法下推)。\n * `limit` 必须在 types / scope 过滤**之后**应用:若在 getAll 时截断,目标类型/作用域的记忆\n * 很可能不在前 N 条候选内,导致漏返回甚至返回空列表(与 native provider 语义保持一致)。\n */\nasync function listMemories(context: Mem0OssContext, options?: { objectId?: string, types?: MemoryType[], scope?: Record<string, unknown>, limit?: number }): Promise<MemoryEntry[]> {\n const objectId = options?.objectId ?? context.defaultObjectId\n // 完整取回该主体候选(不在此处传 topK),过滤后再截取 limit\n const response = await context.memory.getAll({ filters: { userId: objectId } })\n let entries = response.results\n .map(item => toMemoryEntry(item, objectId))\n .filter(entry => entry.objectId === objectId)\n if (options?.types?.length)\n entries = entries.filter(entry => options.types!.includes(entry.type))\n if (options?.scope)\n entries = entries.filter(entry => matchScope(entry, options.scope!))\n return options?.limit !== undefined ? entries.slice(0, options.limit) : entries\n}\n\n/**\n * 创建 Mem0 OSS 记忆操作接口\n *\n * @param deps - LLM / Embedder / 向量库来源\n * @returns MemoryOperations 实例\n * @throws 当 `mem0ai` 未安装或配置缺失时抛出,由 `ai.init()` 转为 HaiResult\n */\nexport async function createMem0OssMemoryOperations(deps: Mem0OssDeps): Promise<MemoryCoreOperations> {\n const configResult = buildMem0Config(deps)\n if (!configResult.success)\n throw configResult.error\n\n let mod: typeof import('mem0ai/oss')\n try {\n mod = await import('mem0ai/oss')\n }\n catch (error) {\n logger.error('Failed to load mem0ai/oss', { error })\n throw new Error('mem0ai is required for memory.provider=\"mem0\"; install it with `pnpm add mem0ai`')\n }\n\n // 暴露实际生效的向量 provider 与持久化状态,便于运维确认记忆是否会在重启后保留\n logger.info('Mem0 OSS memory initialized', {\n vectorProvider: configResult.data.vectorProvider,\n persistent: configResult.data.persistent,\n })\n\n const context: Mem0OssContext = {\n memory: new mod.Memory(configResult.data.config),\n llm: deps.llm,\n systemPrompt: deps.config.systemPrompt,\n defaultObjectId: DEFAULT_OBJECT_ID,\n defaultTopK: deps.config.defaultTopK,\n candidateMultiplier: deps.config.candidateMultiplier,\n }\n\n const recall: MemoryCoreOperations['recall'] = (query, options) => recallMemories(context, query, {\n topK: options?.topK ?? deps.config.defaultTopK,\n candidateMultiplier: options?.candidateMultiplier,\n objectId: options?.objectId,\n minImportance: options?.minImportance,\n types: options?.types,\n recencyWeight: options?.recencyWeight,\n scope: options?.scope,\n })\n\n return {\n extract: (messages, options) => extractMemories(context, messages, options),\n recall,\n injectMemories: (messages, options) => injectRelevantMemories(messages, options, recall),\n add: entry => addMemory(context, entry),\n update: (memoryId, updates, accessScope) => updateMemory(context, memoryId, updates, accessScope),\n get: (memoryId, accessScope) => getMemory(context, memoryId, accessScope),\n remove: (memoryId, accessScope) => removeMemory(context, memoryId, accessScope),\n async list(options) {\n try {\n return ok(await listMemories(context, options))\n }\n catch (error) {\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n },\n async listPage(options) {\n try {\n const offset = options?.offset ?? 0\n const limit = options?.limit ?? 20\n // mem0 getAll 不支持 offset 分页,只能取回匹配集合后在内存切片(后端能力限制,已在 README 说明)\n const all = await listMemories(context, { objectId: options?.objectId, types: options?.types, scope: options?.scope })\n return ok({ items: all.slice(offset, offset + limit), total: all.length })\n }\n catch (error) {\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n },\n /**\n * 清除记忆\n *\n * - 无任何过滤条件:`reset()` 清空整个后端。\n * - 仅 objectId(无 types / scope):`deleteAll({ userId })` 删除该主体全部记忆。\n * - 含 types 或 scope:先列出同时匹配的条目,再逐条 `delete`,避免误删该主体其他类型/作用域的记忆。\n */\n async clear(options) {\n try {\n const hasTypeOrScope = Boolean(options?.types?.length) || Boolean(options?.scope)\n\n if (!options?.objectId && !hasTypeOrScope) {\n await context.memory.reset()\n return ok(undefined)\n }\n\n if (options?.objectId && !hasTypeOrScope) {\n await context.memory.deleteAll({ userId: options.objectId })\n return ok(undefined)\n }\n\n // 存在 types / scope:精确匹配后逐条删除\n const matched = await listMemories(context, { objectId: options?.objectId, types: options?.types, scope: options?.scope })\n for (const entry of matched)\n await context.memory.delete(entry.id)\n logger.debug('Mem0 OSS memories cleared', { removed: matched.length, objectId: options?.objectId, types: options?.types, scoped: Boolean(options?.scope) })\n return ok(undefined)\n }\n catch (error) {\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — Memory 合并(Mem0 式增量更新)\n *\n * 对一批抽取事实与相关既有记忆做单次 LLM 合并决策,产出 ADD/UPDATE/DELETE/NONE\n * 操作并应用,实现增量更新、跨条去重与矛盾删除。作为 native 记忆的默认写入策略。\n * @module ai-memory-consolidation\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type {\n MemoryEntry,\n MemoryEntryInput,\n MemoryExtractOptions,\n MemoryOperations,\n MemoryType,\n} from './ai-memory-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\nimport { extractMemories } from './ai-memory-extractor.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory-consolidation' })\nconst DEFAULT_IMPORTANCE = 0.5\nconst MEMORY_TYPES = new Set<MemoryType>(['fact', 'preference', 'event', 'entity', 'instruction'])\nconst LEADING_CODE_FENCE_REGEX = /^```(?:json)?\\n?/\nconst TRAILING_CODE_FENCE_REGEX = /\\n?```$/\n\nconst MEMORY_CONSOLIDATION_SYSTEM_PROMPT = [\n 'You maintain a long-term memory store using the Mem0 consolidation algorithm.',\n 'You receive existing related memories (each with an id) and newly extracted facts.',\n 'Decide the minimal set of operations that keeps the store consistent and non-redundant.',\n 'Return exactly one JSON object: { \"memory\": [ { \"id\"?, \"text\", \"type\", \"importance\", \"category\"?, \"event\" } ] }.',\n 'Allowed event values:',\n '- \"ADD\": the fact is new information; omit id.',\n '- \"UPDATE\": refine an existing memory; include its id and the merged text.',\n '- \"DELETE\": an existing memory is contradicted or obsolete; include its id.',\n '- \"NONE\": an existing memory already fully covers the fact; include its id and make no change.',\n 'Rules:',\n '- \"type\" must be one of: fact, preference, event, entity, instruction.',\n '- \"importance\" is a float in [0, 1].',\n '- \"category\" is an optional short topical label (e.g. \"work\", \"food\", \"travel\").',\n '- Only reference ids that appear in the provided existing memories.',\n '- Be conservative: prefer UPDATE or NONE over duplicating information with ADD.',\n 'Return JSON only, without markdown fences or explanation.',\n].join('\\n')\n\n/** 单条合并操作 */\ninterface ConsolidationOp {\n event: 'ADD' | 'UPDATE' | 'DELETE' | 'NONE'\n id?: string\n text: string\n type: MemoryType\n importance: number\n category?: string\n}\n\n/** 合并依赖:默认记忆引擎通过公共操作接口注入 */\nexport interface ConsolidationDeps {\n llm: LLMOperations\n recall: MemoryOperations['recall']\n add: MemoryOperations['add']\n update: MemoryOperations['update']\n remove: MemoryOperations['remove']\n /** 检索相关既有记忆的数量 */\n relatedTopK: number\n /** 抽取阶段的自定义 systemPrompt */\n systemPrompt?: string\n}\n\nfunction stripCodeFences(content: string): string {\n const cleaned = content.trim()\n if (!cleaned.startsWith('```'))\n return cleaned\n return cleaned.replace(LEADING_CODE_FENCE_REGEX, '').replace(TRAILING_CODE_FENCE_REGEX, '').trim()\n}\n\nfunction normalizeText(content: string): string {\n return content.trim().replace(/\\s+/g, ' ').toLocaleLowerCase()\n}\n\nfunction normalizeType(value: unknown, fallback: MemoryType): MemoryType {\n return typeof value === 'string' && MEMORY_TYPES.has(value as MemoryType)\n ? value as MemoryType\n : fallback\n}\n\nfunction normalizeImportance(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.max(0, Math.min(1, value))\n : fallback\n}\n\n/** 收集候选事实的相关既有记忆,按 id 去重 */\nasync function collectRelated(\n deps: ConsolidationDeps,\n candidates: MemoryEntryInput[],\n options?: MemoryExtractOptions,\n): Promise<HaiResult<MemoryEntry[]>> {\n const recallResults = await Promise.all(\n candidates.map(candidate => deps.recall(candidate.content, {\n topK: deps.relatedTopK,\n objectId: candidate.objectId ?? options?.objectId,\n scope: options?.scope,\n types: options?.types,\n })),\n )\n\n const related = new Map<string, MemoryEntry>()\n for (const result of recallResults) {\n if (!result.success)\n return result\n for (const entry of result.data)\n related.set(entry.id, entry)\n }\n return ok([...related.values()])\n}\n\n/**\n * 解析 LLM 返回的合并操作列表\n *\n * 缺失的 type / importance / category 会从匹配文本的候选事实回填;UPDATE/DELETE/NONE\n * 的 id 必须命中既有记忆,否则 UPDATE 降级为 ADD、DELETE/NONE 丢弃。\n */\nfunction parseConsolidationOps(\n raw: string,\n candidates: MemoryEntryInput[],\n relatedIds: Set<string>,\n): ConsolidationOp[] {\n const parsed = JSON.parse(stripCodeFences(raw)) as unknown\n const list = Array.isArray(parsed)\n ? parsed\n : typeof parsed === 'object' && parsed !== null && Array.isArray((parsed as { memory?: unknown }).memory)\n ? (parsed as { memory: unknown[] }).memory\n : []\n\n const candidateByText = new Map(candidates.map(candidate => [normalizeText(candidate.content), candidate]))\n const ops: ConsolidationOp[] = []\n\n for (const item of list) {\n if (typeof item !== 'object' || item === null)\n continue\n const record = item as Record<string, unknown>\n const text = typeof record.text === 'string' ? record.text.trim() : ''\n if (!text)\n continue\n\n const event = String(record.event ?? 'ADD').toUpperCase()\n const fallback = candidateByText.get(normalizeText(text))\n const type = normalizeType(record.type, fallback?.type ?? 'fact')\n const importance = normalizeImportance(record.importance, fallback?.importance ?? DEFAULT_IMPORTANCE)\n const category = typeof record.category === 'string' && record.category.trim().length > 0\n ? record.category.trim()\n : readCategory(fallback?.metadata)\n const id = typeof record.id === 'string' ? record.id : undefined\n\n if (event === 'UPDATE' && id && relatedIds.has(id)) {\n ops.push({ event: 'UPDATE', id, text, type, importance, category })\n }\n else if (event === 'DELETE' && id && relatedIds.has(id)) {\n ops.push({ event: 'DELETE', id, text, type, importance })\n }\n else if (event === 'NONE') {\n // 已被既有记忆覆盖,无需写入\n continue\n }\n else {\n ops.push({ event: 'ADD', text, type, importance, category })\n }\n }\n\n return ops\n}\n\n/** 从元数据中读取 category(若有) */\nfunction readCategory(metadata: Record<string, unknown> | undefined): string | undefined {\n const value = metadata?.category\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined\n}\n\n/** 合并 category 到元数据 */\nfunction withCategory(metadata: Record<string, unknown> | undefined, category: string | undefined): Record<string, unknown> | undefined {\n if (!category)\n return metadata\n return { ...metadata, category }\n}\n\n/**\n * 应用合并操作\n *\n * 顺序执行以保证容量淘汰(maxEntriesPerObject / maxEntriesGlobal)状态一致;批量规模受单次抽取的事实数量约束\n * (通常远小于 20 条)。返回新增与更新后的记忆条目。\n */\nasync function applyConsolidationOps(\n deps: ConsolidationDeps,\n ops: ConsolidationOp[],\n options?: MemoryExtractOptions,\n): Promise<HaiResult<MemoryEntry[]>> {\n const entries: MemoryEntry[] = []\n\n for (const op of ops) {\n if (op.event === 'DELETE' && op.id) {\n const removeResult = await deps.remove(op.id)\n if (!removeResult.success)\n logger.warn('Consolidation delete skipped', { id: op.id, error: removeResult.error.message })\n continue\n }\n\n if (op.event === 'UPDATE' && op.id) {\n const updateResult = await deps.update(op.id, {\n content: op.text,\n type: op.type,\n importance: op.importance,\n metadata: op.category ? { category: op.category } : undefined,\n })\n if (!updateResult.success)\n return updateResult\n entries.push(updateResult.data)\n continue\n }\n\n const addResult = await deps.add({\n content: op.text,\n type: op.type,\n importance: op.importance,\n objectId: options?.objectId,\n scope: options?.scope,\n metadata: withCategory(undefined, op.category),\n })\n if (!addResult.success)\n return addResult\n entries.push(addResult.data)\n }\n\n return ok(entries)\n}\n\n/**\n * 从对话消息中抽取事实并执行 Mem0 式合并\n *\n * 流程:抽取事实 → 检索相关记忆 → 单次 LLM 批量合并 → 应用 ADD/UPDATE/DELETE 操作。\n *\n * @param deps - 合并依赖(LLM + 记忆操作 + relatedTopK)\n * @param messages - 对话消息列表\n * @param options - 抽取选项(types / minImportance / objectId / scope / model 等)\n * @returns 新增与更新后的记忆条目\n */\nexport async function extractAndConsolidate(\n deps: ConsolidationDeps,\n messages: ChatMessage[],\n options?: MemoryExtractOptions,\n): Promise<HaiResult<MemoryEntry[]>> {\n logger.trace('Consolidation extract', { messageCount: messages.length })\n\n const extractResult = await extractMemories(deps.llm, messages, {\n types: options?.types,\n model: options?.model,\n minImportance: options?.minImportance,\n objectId: options?.objectId,\n systemPrompt: options?.systemPrompt ?? deps.systemPrompt,\n tempModel: options?.tempModel,\n signal: options?.signal,\n })\n if (!extractResult.success)\n return extractResult\n\n const candidates = extractResult.data\n if (candidates.length === 0)\n return ok([])\n\n const relatedResult = await collectRelated(deps, candidates, options)\n if (!relatedResult.success)\n return relatedResult\n const related = relatedResult.data\n\n const consolidationResult = await deps.llm.chat({\n model: options?.model,\n ...(options?.tempModel ? { tempModel: options.tempModel } : {}),\n messages: [\n { role: 'system', content: MEMORY_CONSOLIDATION_SYSTEM_PROMPT },\n {\n role: 'user',\n content: JSON.stringify({\n existingMemories: related.map(entry => ({\n id: entry.id,\n content: entry.content,\n type: entry.type,\n importance: entry.importance,\n category: readCategory(entry.metadata),\n })),\n newFacts: candidates.map(candidate => ({\n text: candidate.content,\n type: candidate.type,\n importance: candidate.importance ?? DEFAULT_IMPORTANCE,\n })),\n }),\n },\n ],\n temperature: 0.1,\n signal: options?.signal,\n })\n if (!consolidationResult.success) {\n return err(HaiAIError.MEMORY_EXTRACT_FAILED, aiM('ai_memoryExtractFailed', { params: { error: String(consolidationResult.error.message) } }), consolidationResult.error)\n }\n\n const rawContent = consolidationResult.data.choices[0]?.message?.content ?? ''\n const relatedIds = new Set(related.map(entry => entry.id))\n let ops: ConsolidationOp[]\n try {\n ops = parseConsolidationOps(rawContent, candidates, relatedIds)\n }\n catch {\n // 解析失败时退化为直接新增全部候选事实,保证抽取结果不丢失\n logger.warn('Consolidation returned invalid JSON, falling back to ADD-all', { content: rawContent.slice(0, 200) })\n ops = candidates.map(candidate => ({\n event: 'ADD' as const,\n text: candidate.content,\n type: candidate.type,\n importance: candidate.importance ?? DEFAULT_IMPORTANCE,\n }))\n }\n\n const applyResult = await applyConsolidationOps(deps, ops, options)\n if (!applyResult.success)\n return applyResult\n\n logger.trace('Consolidation completed', { candidates: candidates.length, related: related.length, ops: ops.length, written: applyResult.data.length })\n return ok(applyResult.data)\n}\n","/**\n * @h-ai/ai — 原生记忆 Provider(hai 自研引擎)\n *\n * 基于 AIRelStore + AIVectorStore 抽象,复用 vecdb / reldb / LLM / Embedding 组件,\n * 提供记忆的提取、存储、检索与注入。`extract` 采用共享的 mem0 式批量合并\n * (ADD/UPDATE/DELETE/NONE),跨条去重并增量更新。\n *\n * 与 mem0 OSS Provider(`ai-memory-provider-mem0-oss.ts`)并列,二者实现同一\n * `MemoryOperations` 接口,通过 `memory.provider` 配置切换。\n * @module ai-memory-provider-native\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { MemoryConfig } from '../../ai-config.js'\n\nimport type { EmbeddingOperations } from '../../embedding/ai-embedding-types.js'\nimport type { ChatMessage, LLMOperations } from '../../llm/ai-llm-types.js'\nimport type { AIRelStore, AIVectorStore, StorePage, WhereClause } from '../../store/ai-store-types.js'\nimport type {\n MemoryAccessScope,\n MemoryClearOptions,\n MemoryCoreOperations,\n MemoryEntry,\n MemoryEntryInput,\n MemoryExtractOptions,\n MemoryInjectionOptions,\n MemoryListOptions,\n MemoryListPageOptions,\n MemoryRecallOptions,\n MemoryUpdateInput,\n} from '../ai-memory-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../../ai-i18n.js'\nimport { HaiAIError } from '../../ai-types.js'\nimport { extractAndConsolidate } from '../ai-memory-consolidation.js'\nimport { injectRelevantMemories, isMemoryAccessDenied } from '../ai-memory-injection.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'memory-native' })\n\n/** 记忆淘汰的时间窗口:超过 7 天的记忆 recency 分量衰减为 0。 */\nconst EVICTION_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000\n\n/**\n * 生成记忆条目唯一 ID\n *\n * 形如 `mem_<毫秒时间戳>_<随机后缀>`,保证同一毫秒内多次写入也不冲突。\n */\nfunction generateId(): string {\n return `mem_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`\n}\n\n/**\n * 计算两个等长向量的余弦相似度\n *\n * 长度不一致或任一向量为零向量时返回 0(视为不相关),作为向量检索的回退度量。\n */\nfunction cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length)\n return 0\n let dot = 0\n let normA = 0\n let normB = 0\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i]\n normA += a[i] * a[i]\n normB += b[i] * b[i]\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB)\n return denom === 0 ? 0 : dot / denom\n}\n\n/**\n * 判断记忆条目是否匹配指定的业务作用域\n *\n * scope 存放在 JSON 列中,未建立索引,因此匹配在内存中完成:\n * 要求 scope 的每个 key-value 都与条目的 scope 严格相等;条目无 scope 时不匹配\n * (指定 scope 的查询不应召回全局记忆)。\n *\n * @param entry - 记忆条目\n * @param scope - 期望匹配的作用域(key-value 全部满足才算命中)\n */\nfunction matchScope(entry: MemoryEntry, scope: Record<string, unknown>): boolean {\n if (!entry.scope)\n return false\n return Object.entries(scope).every(([k, v]) => entry.scope![k] === v)\n}\n\n/**\n * 创建原生 Memory 操作接口\n *\n * 提供基于 LLM 的记忆提取并持久化、基于向量相似度的记忆检索,并支持将相关记忆\n * 注入消息用于 LLM 上下文。\n *\n * @param config - 记忆配置(maxEntriesPerObject / maxEntriesGlobal、recencyDecay、systemPrompt 等)\n * @param llm - LLM 操作接口(用于记忆提取)\n * @param embedding - Embedding 接口(可为 null,为 null 时使用关键词回退)\n * @param store - 记忆条目持久化存储\n * @param vectorStore - 向量库存储(用于语义检索)\n * @returns MemoryCoreOperations 实例\n */\nexport function createNativeMemoryOperations(\n config: MemoryConfig,\n llm: LLMOperations,\n embedding: EmbeddingOperations | null,\n store: AIRelStore<MemoryEntry>,\n vectorStore: AIVectorStore,\n): MemoryCoreOperations {\n /**\n * 为文本计算 embedding 向量(embedding 不可用或关闭时返回 undefined)\n */\n async function computeVector(text: string): Promise<number[] | undefined> {\n if (!config.embeddingEnabled || !embedding)\n return undefined\n\n const result = await embedding.embedText(text)\n if (result.success)\n return result.data\n\n logger.warn('Failed to compute embedding for memory', { error: result.error })\n return undefined\n }\n\n /**\n * 从给定候选集中淘汰优先级最低的一条(importance 0.7 + recency 0.3 加权最小者)\n *\n * @param candidates - 参与淘汰评估的候选条目(通常按 objectId 或全局筛出)\n */\n async function evictLowest(candidates: MemoryEntry[]): Promise<void> {\n if (candidates.length === 0)\n return\n\n const now = Date.now()\n let lowestScore = Infinity\n let lowestId: string | null = null\n\n for (const entry of candidates) {\n const age = now - entry.createdAt\n const recency = Math.max(0, 1 - age / EVICTION_MAX_AGE_MS)\n const score = entry.importance * 0.7 + recency * 0.3\n if (score < lowestScore) {\n lowestScore = score\n lowestId = entry.id\n }\n }\n\n if (lowestId) {\n await store.remove(lowestId)\n await vectorStore.remove(lowestId)\n }\n }\n\n /**\n * 按需淘汰记忆条目,保障多用户配额隔离\n *\n * 分两级触发:\n * 1. 单主体配额(maxEntriesPerObject):仅在传入 objectId 时生效,只统计并淘汰\n * 该主体自身的条目,避免用户 A 大量写入淘汰掉用户 B 的记忆。\n * 2. 全局配额(maxEntriesGlobal):跨所有主体的总量保护,超限时淘汰全局最低优先级条目。\n *\n * @param objectId - 即将写入条目的所属主体(undefined 表示全局记忆,仅受全局配额约束)\n */\n async function evictIfNeeded(objectId?: string): Promise<void> {\n // 全局总量保护\n const globalTotal = await store.count()\n if (globalTotal >= config.maxEntriesGlobal) {\n const all = await store.query({ orderBy: { field: 'createdAt', direction: 'asc' }, limit: globalTotal })\n await evictLowest(all)\n }\n\n // 单主体配额:仅对具名主体生效(undefined 时 store 不会按 object_id 过滤,会误统计全局)\n if (objectId) {\n const objectTotal = await store.count({ objectId })\n if (objectTotal >= config.maxEntriesPerObject) {\n const objectEntries = await store.query({ objectId, orderBy: { field: 'createdAt', direction: 'asc' }, limit: objectTotal })\n await evictLowest(objectEntries)\n }\n }\n }\n\n /**\n * 持久化一条记忆条目(含向量 upsert),写入前按主体配额淘汰\n */\n async function saveEntry(input: MemoryEntryInput, vector?: number[]): Promise<MemoryEntry> {\n await evictIfNeeded(input.objectId)\n\n const now = Date.now()\n const entry: MemoryEntry = {\n id: generateId(),\n content: input.content,\n type: input.type,\n importance: input.importance ?? 0.5,\n objectId: input.objectId,\n scope: input.scope,\n metadata: input.metadata,\n vector,\n createdAt: now,\n lastAccessedAt: now,\n accessCount: 0,\n }\n\n await store.save(entry.id, entry, { objectId: entry.objectId })\n\n if (vector) {\n await vectorStore.upsert(entry.id, vector, {\n objectId: entry.objectId,\n type: entry.type,\n })\n }\n\n return entry\n }\n\n /**\n * 更新一条记忆的任意字段(content / type / importance / metadata),\n * content 变更时重算向量并同步向量库。\n */\n async function updateEntry(memoryId: string, updates: MemoryUpdateInput, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n try {\n const existing = await store.get(memoryId)\n if (!existing || isMemoryAccessDenied(existing, accessScope)) {\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n\n if (updates.content !== undefined)\n existing.content = updates.content\n if (updates.type !== undefined)\n existing.type = updates.type\n if (updates.importance !== undefined)\n existing.importance = updates.importance\n if (updates.metadata !== undefined)\n existing.metadata = updates.metadata\n\n // 内容变更时重新计算向量\n if (updates.content !== undefined) {\n const vector = await computeVector(updates.content)\n existing.vector = vector\n if (vector) {\n await vectorStore.upsert(memoryId, vector, {\n objectId: existing.objectId,\n type: existing.type,\n })\n }\n }\n\n await store.save(memoryId, existing, { objectId: existing.objectId })\n logger.trace('Memory updated', { id: memoryId })\n return ok(existing)\n }\n catch (error) {\n logger.error('Memory update failed', { id: memoryId, error })\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n }\n\n /**\n * 检索最相关的记忆条目(内部实现,供 recall / extract / injectMemories 共用)\n *\n * 三阶段:候选筛选(objectId / type / minImportance / scope)→ 综合打分\n * (向量相似度 + 重要性 + 时间新鲜度)→ 排序截取 topK。\n *\n * @param query - 查询文本\n * @param options - 检索选项(objectId / type / minImportance / scope / topK 等)\n * @param updateAccessStats - 是否更新命中条目的访问统计(recall 为 true,提取阶段为 false)\n */\n async function recallEntries(\n query: string,\n options?: MemoryRecallOptions,\n updateAccessStats = true,\n ): Promise<HaiResult<MemoryEntry[]>> {\n const topK = options?.topK ?? config.defaultTopK\n const recencyWeight = options?.recencyWeight ?? (1 - config.recencyDecay)\n const candidateMultiplier = Math.max(1, options?.candidateMultiplier ?? config.candidateMultiplier)\n\n logger.trace('Recalling memories', { query: query.slice(0, 100), topK, updateAccessStats })\n\n try {\n const where: WhereClause<MemoryEntry> = {}\n\n const types = options?.types\n if (types && types.length === 1) {\n where.type = types[0]\n }\n else if (types && types.length > 1) {\n where.type = { $in: types }\n }\n\n if (options?.minImportance && options.minImportance > 0) {\n where.importance = { $gte: options.minImportance }\n }\n\n const allCandidates = await store.query({\n objectId: options?.objectId,\n scope: options?.scope,\n where: Object.keys(where).length > 0 ? where : undefined,\n })\n\n // scope 过滤在内存中完成:指定 scope 时 key-value 严格匹配,不纳入全局记忆(scope 为 null/undefined)\n const candidates = options?.scope\n ? allCandidates.filter(e => matchScope(e, options.scope!))\n : allCandidates\n\n if (candidates.length === 0) {\n return ok([])\n }\n\n let queryVector: number[] | undefined\n if (config.embeddingEnabled && embedding) {\n const embedResult = await embedding.embedText(query)\n if (embedResult.success) {\n queryVector = embedResult.data\n }\n }\n\n const vectorScores = new Map<string, number>()\n if (queryVector) {\n const vectorResults = await vectorStore.search(queryVector, {\n topK: topK * candidateMultiplier,\n filter: options?.objectId ? { objectId: options.objectId } : undefined,\n })\n for (const r of vectorResults) {\n vectorScores.set(r.id, r.score)\n }\n }\n\n const now = Date.now()\n\n const scored = candidates.map((entry) => {\n let similarity = vectorScores.get(entry.id) ?? 0\n if (!similarity && queryVector && entry.vector) {\n similarity = cosineSimilarity(queryVector, entry.vector)\n }\n else if (!similarity) {\n const queryLower = query.toLowerCase()\n const contentLower = entry.content.toLowerCase()\n similarity = contentLower.includes(queryLower) ? 0.8 : 0\n }\n\n const age = now - entry.createdAt\n const recency = Math.max(0, 1 - age / EVICTION_MAX_AGE_MS)\n const relevance = similarity * 0.8 + entry.importance * 0.2\n const score = relevance * (1 - recencyWeight) + recency * recencyWeight\n\n return { entry, score }\n })\n\n scored.sort((a, b) => b.score - a.score)\n const results: MemoryEntry[] = []\n for (const { entry } of scored.slice(0, topK)) {\n if (updateAccessStats) {\n entry.lastAccessedAt = now\n entry.accessCount++\n await store.save(entry.id, entry, { objectId: entry.objectId })\n results.push(entry)\n continue\n }\n\n results.push({ ...entry })\n }\n\n logger.trace('Memory recall completed', { query: query.slice(0, 50), resultCount: results.length, updateAccessStats })\n return ok(results)\n }\n catch (error) {\n logger.error('Memory recall failed', { error })\n return err(HaiAIError.MEMORY_RECALL_FAILED, aiM('ai_memoryRecallFailed', { params: { error: String(error) } }), error)\n }\n }\n\n const operations: MemoryCoreOperations = {\n /**\n * 从对话消息中提取记忆并合并存储(Mem0 式增量更新)\n *\n * 抽取事实 → 检索相关记忆 → 单次 LLM 批量合并 → 应用 ADD/UPDATE/DELETE/NONE。\n * 相比逐条写回,能跨条去重、增量更新并删除被矛盾的旧记忆。\n *\n * @param messages - 待分析的对话消息列表\n * @param options - 可选(记忆类型过滤、最小重要性阈值、自定义 model / systemPrompt / scope 等)\n * @returns `ok(MemoryEntry[])` 新写入与更新后的记忆列表;LLM 调用失败时返回 `MEMORY_EXTRACT_FAILED`\n */\n async extract(messages: ChatMessage[], options?: MemoryExtractOptions): Promise<HaiResult<MemoryEntry[]>> {\n return extractAndConsolidate({\n llm,\n recall: (query, recallOptions) => recallEntries(query, recallOptions, false),\n add: entry => operations.add(entry),\n update: (memoryId, updates) => updateEntry(memoryId, updates),\n remove: memoryId => operations.remove(memoryId),\n relatedTopK: config.writebackRelatedTopK,\n systemPrompt: config.systemPrompt,\n }, messages, options)\n },\n\n /**\n * 根据查询文本检索最相关的记忆条目并更新访问统计\n */\n async recall(query: string, options?: MemoryRecallOptions): Promise<HaiResult<MemoryEntry[]>> {\n return recallEntries(query, options, true)\n },\n\n /**\n * 将检索到的相关记忆注入消息列表(system 追加或最后一条用户消息前插入)\n */\n async injectMemories(messages: ChatMessage[], options?: MemoryInjectionOptions): Promise<HaiResult<ChatMessage[]>> {\n return injectRelevantMemories(messages, options, recallEntries)\n },\n\n /**\n * 手动添加一条记忆(非 LLM 提取),超过主体配额时自动淘汰最低优先级条目\n *\n * @param entry - 记忆条目输入(content、type、importance、objectId、scope、metadata 等)\n * @returns `ok(MemoryEntry)` 含完整字段(id、时间戳等);存储失败时返回 `MEMORY_STORE_FAILED`\n */\n async add(entry: MemoryEntryInput): Promise<HaiResult<MemoryEntry>> {\n try {\n const vector = await computeVector(entry.content)\n const stored = await saveEntry(entry, vector)\n logger.trace('Memory added', { id: stored.id, type: stored.type })\n return ok(stored)\n }\n catch (error) {\n logger.error('Memory add failed', { error })\n return err(HaiAIError.MEMORY_STORE_FAILED, aiM('ai_memoryStoreFailed', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 更新一条已有记忆(仅更新传入字段,content 变更时重算向量)\n */\n async update(memoryId: string, updates: MemoryUpdateInput, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n return updateEntry(memoryId, updates, accessScope)\n },\n\n /**\n * 根据 ID 获取一条记忆并更新访问统计\n *\n * @param memoryId - 记忆条目的唯一 ID\n * @param accessScope - 可选归属校验(不匹配返回 MEMORY_NOT_FOUND)\n * @returns `ok(MemoryEntry)` 操作成功;ID 不存在或归属不符时返回 `MEMORY_NOT_FOUND`\n */\n async get(memoryId: string, accessScope?: MemoryAccessScope): Promise<HaiResult<MemoryEntry>> {\n const entry = await store.get(memoryId)\n if (!entry || isMemoryAccessDenied(entry, accessScope)) {\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n entry.lastAccessedAt = Date.now()\n entry.accessCount++\n await store.save(memoryId, entry, { objectId: entry.objectId })\n return ok(entry)\n },\n\n /**\n * 根据 ID 删除一条记忆(同时清理关系存储与向量库)\n *\n * @param memoryId - 记忆条目的唯一 ID\n * @param accessScope - 可选归属校验(不匹配返回 MEMORY_NOT_FOUND)\n * @returns `ok(undefined)` 删除成功;ID 不存在或归属不符时返回 `MEMORY_NOT_FOUND`\n */\n async remove(memoryId: string, accessScope?: MemoryAccessScope): Promise<HaiResult<void>> {\n if (accessScope) {\n const existing = await store.get(memoryId)\n if (!existing || isMemoryAccessDenied(existing, accessScope)) {\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n }\n const removed = await store.remove(memoryId)\n if (!removed) {\n return err(HaiAIError.MEMORY_NOT_FOUND, aiM('ai_memoryNotFound', { params: { id: memoryId } }))\n }\n await vectorStore.remove(memoryId)\n logger.trace('Memory removed', { id: memoryId })\n return ok(undefined)\n },\n\n /**\n * 列出记忆条目(不分页)\n *\n * objectId / type 走存储层索引过滤,scope 在内存中 key-value 严格匹配。\n *\n * @param options - 可选(objectId、type、scope 过滤,limit 限制数量)\n * @returns `ok(MemoryEntry[])` 按创建时间降序排列的记忆列表\n */\n async list(options?: MemoryListOptions): Promise<HaiResult<MemoryEntry[]>> {\n const where: WhereClause<MemoryEntry> = {}\n if (options?.types && options.types.length === 1)\n where.type = options.types[0]\n else if (options?.types && options.types.length > 1)\n where.type = { $in: options.types }\n\n const results = await store.query({\n objectId: options?.objectId,\n scope: options?.scope,\n where: Object.keys(where).length > 0 ? where : undefined,\n orderBy: { field: 'createdAt', direction: 'desc' },\n // scope 需要内存过滤,故不能在存储层直接 limit(否则可能截断掉待匹配条目)\n limit: options?.scope ? undefined : options?.limit,\n })\n\n if (!options?.scope)\n return ok(results)\n\n const filtered = results.filter(e => matchScope(e, options.scope!))\n return ok(options.limit ? filtered.slice(0, options.limit) : filtered)\n },\n\n /**\n * 分页列出记忆条目\n *\n * 无 scope 时走存储层原生分页;指定 scope 时因作用域存于 JSON 列无法下推,\n * 先按 objectId / type 取出候选,再内存过滤后切片(数据量大时应优先用 objectId 收窄)。\n *\n * @param options - 可选(objectId、type、scope 过滤,offset / limit 分页参数)\n * @returns `ok(StorePage<MemoryEntry>)` 含当前页数据与总数\n */\n async listPage(options?: MemoryListPageOptions): Promise<HaiResult<StorePage<MemoryEntry>>> {\n const where: WhereClause<MemoryEntry> = {}\n if (options?.types && options.types.length === 1)\n where.type = options.types[0]\n else if (options?.types && options.types.length > 1)\n where.type = { $in: options.types }\n\n const offset = options?.offset ?? 0\n const limit = options?.limit ?? 20\n\n if (!options?.scope) {\n const page = await store.queryPage(\n {\n objectId: options?.objectId,\n where: Object.keys(where).length > 0 ? where : undefined,\n orderBy: { field: 'createdAt', direction: 'desc' },\n },\n { offset, limit },\n )\n return ok(page)\n }\n\n const all = await store.query({\n objectId: options?.objectId,\n scope: options?.scope,\n where: Object.keys(where).length > 0 ? where : undefined,\n orderBy: { field: 'createdAt', direction: 'desc' },\n })\n const filtered = all.filter(e => matchScope(e, options.scope!))\n return ok({ items: filtered.slice(offset, offset + limit), total: filtered.length })\n },\n\n /**\n * 清除记忆条目(安全语义)\n *\n * - 不传任何过滤条件:清空全部记忆(含向量库)。\n * - 传入 objectId / types / scope:仅删除同时满足全部条件的条目,避免误删。\n *\n * @param options - 可选范围过滤(objectId / types / scope 任意组合)\n * @returns `ok(undefined)` 操作成功\n */\n async clear(options?: MemoryClearOptions): Promise<HaiResult<void>> {\n if (!options?.types && !options?.objectId && !options?.scope) {\n await store.clear()\n await vectorStore.clear()\n logger.debug('All memories cleared')\n return ok(undefined)\n }\n\n const where: WhereClause<MemoryEntry> = {}\n if (options.types && options.types.length === 1)\n where.type = options.types[0]\n else if (options.types && options.types.length > 1)\n where.type = { $in: options.types }\n\n const candidates = await store.query({\n objectId: options.objectId,\n scope: options.scope,\n where: Object.keys(where).length > 0 ? where : undefined,\n })\n const toRemove = options.scope\n ? candidates.filter(e => matchScope(e, options.scope!))\n : candidates\n\n for (const entry of toRemove) {\n await store.remove(entry.id)\n await vectorStore.remove(entry.id)\n }\n logger.debug('Memories cleared', { removed: toRemove.length, objectId: options.objectId, types: options.types, scoped: Boolean(options.scope) })\n return ok(undefined)\n },\n }\n\n return operations\n}\n","/**\n * @h-ai/ai — Persona 子功能实现\n *\n * 基于 AIRelStore 持久化 AI 角色档案,并提供系统提示词组合。\n * 角色是全局共享的(不按 objectId 隔离),因此存储仅按 id 主键。\n * @module ai-persona-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { AIRelStore } from '../store/ai-store-types.js'\nimport type { PersonaOperations, PersonaProfile, PersonaProfileInput, PersonaProfileUpdate, PersonaScopeOptions } from './ai-persona-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'persona' })\n\n/** 默认主体:平台内置角色(未指定 objectId 时使用) */\nconst DEFAULT_OBJECT_ID = 'system'\n\n/** 构造存储键(JSON 数组序列化 [objectId, personaId],避免朴素拼接碰撞) */\nfunction personaKey(objectId: string, id: string): string {\n return JSON.stringify([objectId, id])\n}\n\n/**\n * 将角色档案的 traits 组合进系统提示词\n *\n * 无 traits 时直接返回 systemPrompt;有 traits 时追加一段「性格特征」清单。\n */\nfunction composeSystemPrompt(profile: PersonaProfile): string {\n if (profile.traits.length === 0)\n return profile.systemPrompt\n const traitLines = profile.traits.map(t => `- ${t}`).join('\\n')\n return `${profile.systemPrompt}\\n\\n性格特征:\\n${traitLines}`\n}\n\n/**\n * 创建 Persona 操作接口\n *\n * @param store - 角色档案持久化存储(按 [objectId, id] 复合键隔离多租户)\n * @returns PersonaOperations 实例\n */\nexport function createPersonaOperations(store: AIRelStore<PersonaProfile>): PersonaOperations {\n return {\n async save(input: PersonaProfileInput): Promise<HaiResult<PersonaProfile>> {\n try {\n const now = Date.now()\n const objectId = input.objectId ?? DEFAULT_OBJECT_ID\n const key = personaKey(objectId, input.id)\n const existing = await store.get(key)\n const profile: PersonaProfile = {\n id: input.id,\n objectId,\n name: input.name,\n systemPrompt: input.systemPrompt,\n traits: input.traits ?? [],\n metadata: input.metadata,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n }\n await store.save(key, profile, { objectId })\n logger.trace('Persona saved', { id: profile.id, objectId })\n return ok(profile)\n }\n catch (error) {\n return err(HaiAIError.PERSONA_SAVE_FAILED, aiM('ai_personaSaveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async get(id: string, options?: PersonaScopeOptions): Promise<HaiResult<PersonaProfile>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n const profile = await store.get(personaKey(objectId, id))\n if (!profile)\n return err(HaiAIError.PERSONA_NOT_FOUND, aiM('ai_personaNotFound', { params: { id } }))\n return ok(profile)\n },\n\n async update(id: string, updates: PersonaProfileUpdate, options?: PersonaScopeOptions): Promise<HaiResult<PersonaProfile>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n const key = personaKey(objectId, id)\n const existing = await store.get(key)\n if (!existing)\n return err(HaiAIError.PERSONA_NOT_FOUND, aiM('ai_personaNotFound', { params: { id } }))\n try {\n const profile: PersonaProfile = {\n ...existing,\n name: updates.name ?? existing.name,\n systemPrompt: updates.systemPrompt ?? existing.systemPrompt,\n traits: updates.traits ?? existing.traits,\n metadata: updates.metadata ?? existing.metadata,\n updatedAt: Date.now(),\n }\n await store.save(key, profile, { objectId })\n return ok(profile)\n }\n catch (error) {\n return err(HaiAIError.PERSONA_SAVE_FAILED, aiM('ai_personaSaveFailed', { params: { error: String(error) } }), error)\n }\n },\n\n async remove(id: string, options?: PersonaScopeOptions): Promise<HaiResult<void>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n await store.remove(personaKey(objectId, id))\n return ok(undefined)\n },\n\n async list(options?: PersonaScopeOptions): Promise<HaiResult<PersonaProfile[]>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n const profiles = await store.query({ objectId, orderBy: { field: 'createdAt', direction: 'asc' } })\n return ok(profiles)\n },\n\n async compose(id: string, options?: PersonaScopeOptions): Promise<HaiResult<string>> {\n const objectId = options?.objectId ?? DEFAULT_OBJECT_ID\n const profile = await store.get(personaKey(objectId, id))\n if (!profile)\n return err(HaiAIError.PERSONA_NOT_FOUND, aiM('ai_personaNotFound', { params: { id } }))\n return ok(composeSystemPrompt(profile))\n },\n }\n}\n","/**\n * @h-ai/ai — RAG 子功能实现\n *\n * 组合 Retrieval + LLM 实现检索增强生成。\n * @module ai-rag-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type { Citation, RetrievalOperations } from '../retrieval/ai-retrieval-types.js'\nimport type {\n RagContextItem,\n RagOperations,\n RagOptions,\n RagResult,\n RagStreamEvent,\n} from './ai-rag-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'rag' })\n\n// ─── 默认提示词 ───\n\nconst DEFAULT_RAG_SYSTEM_PROMPT = `You are a helpful assistant. Answer the user's question based on the provided context.\nIf the context doesn't contain relevant information, say so honestly.\nWhen using information from the context, cite the source by its number, e.g. [1] or [2].`\n\n/**\n * 默认上下文格式化:将检索结果格式化为编号列表,含标题和 URL、便于 LLM 注明信源\n */\nfunction defaultFormatContext(items: RagContextItem[]): string {\n if (items.length === 0)\n return 'No relevant context found.'\n\n return items\n .map((item, i) => {\n const sourceLabel = item.citation?.title ?? item.citation?.url ?? item.sourceId\n const urlPart = item.citation?.url ? ` (${item.citation.url})` : ''\n return `[${i + 1}] Source: ${sourceLabel}${urlPart}\\n${item.content}`\n })\n .join('\\n\\n')\n}\n\n/**\n * 创建 RAG 操作接口\n *\n * @param llm - LLM 操作(用于生成回答)\n * @param retrieval - Retrieval 操作(用于检索上下文)\n * @returns RagOperations 实例\n */\nexport function createRagOperations(llm: LLMOperations, retrieval: RetrievalOperations): RagOperations {\n return {\n /**\n * 执行 RAG 查询\n *\n * 流程:\n * 1. 向量检索相关文档(`retrieval.retrieve`)\n * 2. 格式化为编号列表上下文(可通过 `options.formatContext` 自定义)\n * 3. 组装系统提示 + 上下文 → 调用 LLM 生成回答\n *\n * @param query - 用户查询文本\n * @param options - 可选配置(sources / topK / minScore / systemPrompt / formatContext / history 等)\n * @returns `ok(RagResult)` 含 answer、context 列表与引用信源;检索或生成失败时返回错误\n */\n async query(query: string, options?: RagOptions): Promise<HaiResult<RagResult>> {\n logger.trace('Starting RAG query', { query: query.slice(0, 100) })\n\n try {\n // 阶段1:检索相关上下文\n const retrieveResult = await retrieval.retrieve({\n query,\n sources: options?.sources,\n topK: options?.topK ?? 5,\n minScore: options?.minScore,\n enableRerank: options?.enableRerank,\n rerankModel: options?.rerankModel,\n })\n\n if (!retrieveResult.success) {\n return err(HaiAIError.RAG_CONTEXT_BUILD_FAILED, aiM('ai_internalError', { params: { error: 'Failed to retrieve context' } }), retrieveResult.error)\n }\n\n // 构建上下文\n const contextItems: RagContextItem[] = retrieveResult.data.items.map(item => ({\n content: item.content,\n score: item.score,\n sourceId: item.sourceId,\n metadata: item.metadata,\n citation: item.citation,\n }))\n\n // 格式化上下文\n const formatFn = options?.formatContext ?? defaultFormatContext\n const contextText = formatFn(contextItems)\n\n // 阶段2:构建 LLM 消息\n const systemPrompt = options?.systemPrompt ?? DEFAULT_RAG_SYSTEM_PROMPT\n const systemContent = `${systemPrompt}\\n\\n--- Context ---\\n${contextText}\\n--- End Context ---`\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemContent },\n ]\n\n // 添加消息历史(多轮对话)\n if (options?.messages) {\n messages.push(...options.messages)\n }\n\n // 添加当前查询\n messages.push({ role: 'user', content: query })\n\n // 阶段3:调用 LLM 生成回答\n const chatResult = await llm.chat({\n model: options?.model,\n messages,\n temperature: options?.temperature,\n objectId: options?.objectId,\n sessionId: options?.sessionId,\n enablePersist: options?.enablePersist,\n signal: options?.signal,\n })\n\n if (!chatResult.success) {\n return err(HaiAIError.RAG_FAILED, aiM('ai_internalError', { params: { error: 'LLM generation failed' } }), chatResult.error)\n }\n\n const choice = chatResult.data.choices[0]\n const answer = choice?.message?.content ?? ''\n\n logger.trace('RAG query completed', {\n contextCount: contextItems.length,\n model: chatResult.data.model,\n })\n\n // 从上下文项中去重聚合信源引用\n const citationMap = new Map<string, Citation>()\n for (const ctx of contextItems) {\n if (ctx.citation) {\n const key = ctx.citation.documentId ?? ctx.citation.chunkId ?? ctx.citation.url ?? `${ctx.sourceId}:${ctx.content.slice(0, 50)}`\n if (!citationMap.has(key)) {\n citationMap.set(key, ctx.citation)\n }\n }\n }\n const citations = Array.from(citationMap.values())\n\n return ok({\n answer,\n context: contextItems,\n citations,\n query,\n model: chatResult.data.model,\n usage: chatResult.data.usage\n ? {\n prompt_tokens: chatResult.data.usage.prompt_tokens,\n completion_tokens: chatResult.data.usage.completion_tokens,\n total_tokens: chatResult.data.usage.total_tokens,\n }\n : undefined,\n })\n }\n catch (error) {\n logger.error('RAG query failed', { error })\n return err(HaiAIError.RAG_FAILED, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 流式 RAG 查询:先产出 context,再逐 chunk 产出 delta,最后 done\n */\n async* queryStream(query: string, options?: RagOptions): AsyncIterable<RagStreamEvent> {\n logger.trace('Starting RAG stream', { query: query.slice(0, 100) })\n\n // 阶段1:检索\n const retrieveResult = await retrieval.retrieve({\n query,\n sources: options?.sources,\n topK: options?.topK ?? 5,\n minScore: options?.minScore,\n enableRerank: options?.enableRerank,\n rerankModel: options?.rerankModel,\n })\n\n if (!retrieveResult.success) {\n throw new Error(`RAG context build failed: ${String(retrieveResult.error)}`)\n }\n\n const contextItems: RagContextItem[] = retrieveResult.data.items.map(item => ({\n content: item.content,\n score: item.score,\n sourceId: item.sourceId,\n metadata: item.metadata,\n citation: item.citation,\n }))\n\n // 去重信源\n const citationMap = new Map<string, Citation>()\n for (const ctx of contextItems) {\n if (ctx.citation) {\n const key = ctx.citation.documentId ?? ctx.citation.chunkId ?? ctx.citation.url ?? `${ctx.sourceId}:${ctx.content.slice(0, 50)}`\n if (!citationMap.has(key)) {\n citationMap.set(key, ctx.citation)\n }\n }\n }\n const citations = Array.from(citationMap.values())\n\n // 产出上下文事件\n yield { type: 'context', items: contextItems, citations }\n\n // 阶段2:流式 LLM 生成\n const formatFn = options?.formatContext ?? defaultFormatContext\n const contextText = formatFn(contextItems)\n const systemPrompt = options?.systemPrompt ?? DEFAULT_RAG_SYSTEM_PROMPT\n const systemContent = `${systemPrompt}\\n\\n--- Context ---\\n${contextText}\\n--- End Context ---`\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemContent },\n ]\n if (options?.messages) {\n messages.push(...options.messages)\n }\n messages.push({ role: 'user', content: query })\n\n const stream = llm.chatStream({\n model: options?.model,\n messages,\n temperature: options?.temperature,\n objectId: options?.objectId,\n sessionId: options?.sessionId,\n enablePersist: options?.enablePersist,\n signal: options?.signal,\n })\n\n let fullAnswer = ''\n let model = ''\n let usage: { prompt_tokens: number, completion_tokens: number, total_tokens: number } | undefined\n\n for await (const chunk of stream) {\n if (!model && chunk.model)\n model = chunk.model\n const delta = chunk.choices?.[0]?.delta?.content\n if (delta) {\n fullAnswer += delta\n yield { type: 'delta', text: delta }\n }\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens,\n completion_tokens: chunk.usage.completion_tokens,\n total_tokens: chunk.usage.total_tokens,\n }\n }\n }\n\n yield { type: 'done', answer: fullAnswer, model, usage }\n },\n }\n}\n","/**\n * @h-ai/ai — Reasoning 子功能实现\n *\n * 提供 ReAct、CoT、Plan-and-Execute 三种推理策略的实现。\n * @module ai-reasoning-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig, ModelScenario } from '../ai-config.js'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type {\n ReasoningOperations,\n ReasoningOptions,\n ReasoningResult,\n ReasoningStep,\n ReasoningStreamEvent,\n} from './ai-reasoning-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'reasoning' })\n\n// ─── 策略提示词 ───\n\nconst REACT_SYSTEM_PROMPT = `You are a reasoning agent that follows the ReAct (Reasoning and Acting) framework.\nFor each step:\n1. Think: Analyze what you know and what you need to find out.\n2. Act: If you need to use a tool, call it. If you have enough information, provide the final answer.\n3. Observe: Review the tool results.\n\nRepeat until you can provide a confident final answer.\nAlways think step by step before acting.`\n\nconst COT_SYSTEM_PROMPT = `You are a reasoning assistant that uses Chain-of-Thought reasoning.\nBreak down the problem into clear logical steps.\nShow your reasoning process explicitly.\nAfter working through all steps, provide a clear final answer.`\n\nconst PLAN_EXECUTE_SYSTEM_PROMPT = `You are a planning and execution agent.\nFirst, create a detailed step-by-step plan to solve the problem.\nThen, execute each step one by one.\nAfter completing all steps, provide the final answer.\n\nFormat your plan as a numbered list.`\n\n/**\n * 创建 Reasoning 操作接口\n *\n * @param config - 校验后的 AI 配置\n * @param llm - LLM 操作接口\n * @returns ReasoningOperations 实例\n */\nexport function createReasoningOperations(config: AIConfig, llm: LLMOperations): ReasoningOperations {\n /**\n * 提取场景对应的模型名称(仅用于构造请求, API Key 校验由 provider 层负责)\n */\n function scenarioModel(scenario: ModelScenario, explicit?: string): string | undefined {\n const result = resolveModelEntry(config.llm, scenario, explicit)\n return result.success ? result.data.model : explicit\n }\n /**\n * 执行 ReAct 策略推理\n */\n async function runReact(\n query: string,\n options: ReasoningOptions,\n ): Promise<HaiResult<ReasoningResult>> {\n const maxRounds = options.maxRounds ?? 10\n const systemPrompt = options.systemPrompt ?? REACT_SYSTEM_PROMPT\n const steps: ReasoningStep[] = []\n let stepIndex = 0\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemPrompt },\n ...(options.messages ?? []),\n { role: 'user', content: query },\n ]\n\n for (let round = 0; round < maxRounds; round++) {\n // 调用 LLM\n const chatResult = await llm.chat({\n model: scenarioModel('reasoning', options.model),\n messages,\n temperature: options.temperature,\n tools: options.tools?.getDefinitions(),\n tool_choice: options.tools ? 'auto' : undefined,\n objectId: options.objectId,\n sessionId: options.sessionId,\n enablePersist: options.enablePersist,\n signal: options.signal,\n })\n\n if (!chatResult.success)\n return chatResult\n\n const choice = chatResult.data.choices[0]\n if (!choice) {\n return err(HaiAIError.REASONING_FAILED, aiM('ai_internalError', { params: { error: 'No response from LLM' } }))\n }\n\n const assistantMessage = choice.message\n\n // 记录思考步骤\n if (assistantMessage.content) {\n steps.push({\n type: 'thought',\n content: typeof assistantMessage.content === 'string' ? assistantMessage.content : '',\n index: stepIndex++,\n })\n }\n\n // 添加助手消息到历史\n messages.push(assistantMessage)\n\n // 如果有工具调用\n if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0 && options.tools) {\n for (const toolCall of assistantMessage.tool_calls) {\n if (toolCall.type !== 'function')\n continue\n // 记录 action 步骤\n steps.push({\n type: 'action',\n content: `Calling tool: ${toolCall.function.name}`,\n toolCall: {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments) as Record<string, unknown>,\n },\n index: stepIndex++,\n })\n\n // 执行工具(透传取消信号与作用域,打断 / 超时时可提前中止耗时工具)\n const toolResult = await options.tools.execute(toolCall, { signal: options.signal, objectId: options.objectId, sessionId: options.sessionId })\n const rawToolContent = toolResult.success\n ? toolResult.data.content\n : `Tool error: ${toolResult.error.message}`\n const toolContent = typeof rawToolContent === 'string'\n ? rawToolContent\n : (rawToolContent as Array<{ text?: string }>).map(p => p.text ?? '').join(' ')\n\n // 记录 observation 步骤\n steps.push({\n type: 'observation',\n content: toolContent,\n index: stepIndex++,\n })\n\n // 添加工具消息\n messages.push({\n role: 'tool',\n tool_call_id: toolCall.id,\n content: toolContent,\n })\n }\n continue\n }\n\n // 完成推理\n if (choice.finish_reason === 'stop') {\n const answer = typeof assistantMessage.content === 'string' ? assistantMessage.content : ''\n steps.push({ type: 'answer', content: answer, index: stepIndex })\n\n return ok({\n answer,\n steps,\n strategy: 'react',\n rounds: round + 1,\n messages,\n })\n }\n }\n\n // 达到最大轮次\n return err(HaiAIError.REASONING_MAX_ROUNDS, aiM('ai_internalError', { params: { error: `Max rounds (${maxRounds}) reached` } }))\n }\n\n /**\n * 执行 Chain-of-Thought 策略推理\n */\n async function runCoT(\n query: string,\n options: ReasoningOptions,\n ): Promise<HaiResult<ReasoningResult>> {\n const systemPrompt = options.systemPrompt ?? COT_SYSTEM_PROMPT\n const steps: ReasoningStep[] = []\n\n const messages: ChatMessage[] = [\n { role: 'system', content: systemPrompt },\n ...(options.messages ?? []),\n { role: 'user', content: `${query}\\n\\nPlease think step by step.` },\n ]\n\n const chatResult = await llm.chat({\n model: scenarioModel('reasoning', options.model),\n messages,\n temperature: options.temperature,\n objectId: options.objectId,\n sessionId: options.sessionId,\n enablePersist: options.enablePersist,\n signal: options.signal,\n })\n\n if (!chatResult.success)\n return chatResult\n\n const choice = chatResult.data.choices[0]\n const answer = choice?.message?.content ?? ''\n\n // 将回答解析为步骤\n const lines = answer.split('\\n').filter(l => l.trim().length > 0)\n let isAnswer = false\n let stepIndex = 0\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (trimmed.toLowerCase().startsWith('final answer') || trimmed.toLowerCase().startsWith('answer:')) {\n isAnswer = true\n }\n\n steps.push({\n type: isAnswer ? 'answer' : 'thought',\n content: trimmed,\n index: stepIndex++,\n })\n }\n\n messages.push({ role: 'assistant', content: answer })\n\n return ok({\n answer,\n steps,\n strategy: 'cot',\n rounds: 1,\n messages,\n })\n }\n\n /**\n * 执行 Plan-and-Execute 策略推理\n */\n async function runPlanExecute(\n query: string,\n options: ReasoningOptions,\n ): Promise<HaiResult<ReasoningResult>> {\n const maxRounds = options.maxRounds ?? 10\n const systemPrompt = options.systemPrompt ?? PLAN_EXECUTE_SYSTEM_PROMPT\n const steps: ReasoningStep[] = []\n let stepIndex = 0\n\n // 阶段1:生成计划\n const planMessages: ChatMessage[] = [\n { role: 'system', content: systemPrompt },\n ...(options.messages ?? []),\n { role: 'user', content: `Create a plan to solve this:\\n${query}` },\n ]\n\n const planResult = await llm.chat({\n model: scenarioModel('plan', options.planModel ?? options.model),\n messages: planMessages,\n temperature: options.temperature,\n objectId: options.objectId,\n sessionId: options.sessionId,\n enablePersist: options.enablePersist,\n signal: options.signal,\n })\n\n if (!planResult.success)\n return planResult\n\n const plan = planResult.data.choices[0]?.message?.content ?? ''\n steps.push({ type: 'plan', content: plan, index: stepIndex++ })\n\n // 阶段2:执行计划\n const executeMessages: ChatMessage[] = [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: query },\n { role: 'assistant', content: plan },\n { role: 'user', content: 'Now execute each step of the plan. Use tools if available.' },\n ]\n\n for (let round = 0; round < maxRounds; round++) {\n const execResult = await llm.chat({\n model: scenarioModel('execute', options.executeModel ?? options.model),\n messages: executeMessages,\n temperature: options.temperature,\n tools: options.tools?.getDefinitions(),\n tool_choice: options.tools ? 'auto' : undefined,\n objectId: options.objectId,\n sessionId: options.sessionId,\n enablePersist: options.enablePersist,\n signal: options.signal,\n })\n\n if (!execResult.success)\n return execResult\n\n const choice = execResult.data.choices[0]\n if (!choice)\n break\n\n const msg = choice.message\n\n if (msg.content) {\n steps.push({ type: 'thought', content: typeof msg.content === 'string' ? msg.content : '', index: stepIndex++ })\n }\n\n executeMessages.push(msg)\n\n // 工具调用\n if (msg.tool_calls && msg.tool_calls.length > 0 && options.tools) {\n for (const toolCall of msg.tool_calls) {\n if (toolCall.type !== 'function')\n continue\n steps.push({\n type: 'action',\n content: `Executing: ${toolCall.function.name}`,\n toolCall: {\n name: toolCall.function.name,\n arguments: JSON.parse(toolCall.function.arguments) as Record<string, unknown>,\n },\n index: stepIndex++,\n })\n\n const toolResult = await options.tools.execute(toolCall, { signal: options.signal, objectId: options.objectId, sessionId: options.sessionId })\n const rawToolContent = toolResult.success\n ? toolResult.data.content\n : `Tool error: ${toolResult.error.message}`\n const toolContent = typeof rawToolContent === 'string'\n ? rawToolContent\n : (rawToolContent as Array<{ text?: string }>).map(p => p.text ?? '').join(' ')\n\n steps.push({ type: 'observation', content: toolContent, index: stepIndex++ })\n executeMessages.push({ role: 'tool', tool_call_id: toolCall.id, content: toolContent })\n }\n continue\n }\n\n // 完成\n if (choice.finish_reason === 'stop') {\n const answer = typeof msg.content === 'string' ? msg.content : ''\n steps.push({ type: 'answer', content: answer, index: stepIndex })\n return ok({\n answer,\n steps,\n strategy: 'plan-execute',\n rounds: round + 1,\n messages: executeMessages,\n })\n }\n }\n\n return err(HaiAIError.REASONING_MAX_ROUNDS, aiM('ai_internalError', { params: { error: `Max rounds (${maxRounds}) reached` } }))\n }\n\n return {\n async run(query: string, options?: ReasoningOptions): Promise<HaiResult<ReasoningResult>> {\n const strategy = options?.strategy ?? 'react'\n logger.trace('Starting reasoning', { strategy, maxRounds: options?.maxRounds })\n\n try {\n switch (strategy) {\n case 'react':\n return await runReact(query, options ?? {})\n case 'cot':\n return await runCoT(query, options ?? {})\n case 'plan-execute':\n return await runPlanExecute(query, options ?? {})\n default:\n return err(HaiAIError.REASONING_STRATEGY_NOT_FOUND, aiM('ai_internalError', { params: { error: `Unknown strategy: ${strategy}` } }))\n }\n }\n catch (error) {\n logger.error('Reasoning failed', { error })\n return err(HaiAIError.REASONING_FAILED, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n },\n\n /**\n * 流式推理:逐步产出推理步骤 + 最终答案增量\n *\n * 当前实现基于 run() 的结果分步产出事件,\n * 后续可优化为真正逐轮流式输出。\n */\n async* runStream(query: string, options?: ReasoningOptions): AsyncIterable<ReasoningStreamEvent> {\n const result = await this.run(query, options)\n\n if (!result.success) {\n throw result.error\n }\n\n const { steps, answer } = result.data\n\n // 产出所有推理步骤(排除最终 answer 步骤)\n for (const step of steps) {\n if (step.type !== 'answer') {\n yield { type: 'step', step }\n }\n }\n\n // 产出最终答案作为 delta\n if (answer) {\n yield { type: 'delta', text: answer }\n }\n\n // 产出完成事件\n yield { type: 'done', result: result.data }\n },\n }\n}\n","/**\n * @h-ai/ai — Rerank 子功能实现\n *\n * 基于 Cohere 兼容格式的文档重排序实现。\n * @module ai-rerank-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { AIConfig } from '../ai-config.js'\n\nimport type {\n RerankDocument,\n RerankItem,\n RerankOperations,\n RerankRequest,\n RerankResponse,\n} from './ai-rerank-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'rerank' })\n\n/**\n * Cohere Rerank API 响应结果条目\n */\ninterface CohereRerankResult {\n index: number\n relevance_score: number\n document?: { text: string }\n}\n\n/**\n * Cohere Rerank API 响应体\n */\ninterface CohereRerankResponse {\n id: string\n results: CohereRerankResult[]\n meta?: Record<string, unknown>\n}\n\n/**\n * 创建 Rerank 操作接口\n *\n * 通过 Cohere 兼容的 Rerank API 对文档进行相关性重排序。\n * apiKey / baseUrl / model 统一通过 `resolveModelEntry(llm, 'rerank')` 解析,\n * 可在 `llm.models` 中为 rerank 场景配置独立的 apiKey / baseUrl。\n *\n * @param config - 校验后的 AI 配置\n * @returns RerankOperations 实例\n */\nexport function createRerankOperations(config: AIConfig): RerankOperations {\n /** 将输入文档统一转换为文本数组和 id 映射 */\n function normalizeDocuments(documents: string[] | RerankDocument[]): {\n texts: string[]\n ids: (string | undefined)[]\n } {\n if (documents.length === 0) {\n return { texts: [], ids: [] }\n }\n if (typeof documents[0] === 'string') {\n const strs = documents as string[]\n return { texts: strs, ids: strs.map(() => undefined) }\n }\n const docs = documents as RerankDocument[]\n return {\n texts: docs.map(d => d.text),\n ids: docs.map(d => d.id),\n }\n }\n\n /**\n * 调用 Cohere 兼容的 Rerank API\n */\n async function callRerankAPI(request: RerankRequest): Promise<HaiResult<RerankResponse>> {\n const resolvedResult = resolveModelEntry(config.llm, 'rerank', request.model, {\n missingApiKeyMessage: aiM('ai_configError', { params: { error: 'API Key is required for rerank' } }),\n })\n if (!resolvedResult.success)\n return resolvedResult\n const resolved = resolvedResult.data\n\n const { texts, ids } = normalizeDocuments(request.documents)\n if (texts.length === 0) {\n return err(HaiAIError.RERANK_INVALID_REQUEST, aiM('ai_rerankInvalidRequest', { params: { reason: 'documents cannot be empty' } }))\n }\n\n const body: Record<string, unknown> = {\n model: resolved.model,\n query: request.query,\n documents: texts,\n }\n if (request.topN !== undefined) {\n body.top_n = request.topN\n }\n if (request.returnDocuments) {\n body.return_documents = true\n }\n\n logger.trace('Calling rerank API', { model: resolved.model, documentCount: texts.length, topN: request.topN })\n\n try {\n const response = await fetch(`${resolved.baseUrl}/v1/rerank`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${resolved.apiKey}`,\n },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => response.statusText)\n logger.error('Rerank API request failed', { status: response.status, error: errorText })\n return err(HaiAIError.RERANK_API_ERROR, aiM('ai_rerankApiFailed', { params: { error: `HTTP ${response.status}: ${errorText}` } }))\n }\n\n const data = await response.json() as CohereRerankResponse\n\n const results: RerankItem[] = data.results.map(item => ({\n index: item.index,\n id: ids[item.index],\n relevanceScore: item.relevance_score,\n document: item.document?.text,\n }))\n\n logger.trace('Rerank completed', { resultCount: results.length })\n\n return ok({ model: resolved.model, results })\n }\n catch (error) {\n logger.error('Rerank API call failed', { error })\n return err(HaiAIError.RERANK_API_ERROR, aiM('ai_rerankApiFailed', { params: { error: String(error) } }), error)\n }\n }\n\n return {\n /**\n * 对文档列表进行相关度重排\n *\n * 调用 Cohere 兼容 Rerank API,按与 query 的语义相关度对文档重新排序。\n *\n * @param request - 重排请求(query、documents、可选 topN/model)\n * @returns `ok(RerankResponse)` 含重排后的结果列表;API 调用失败时返回 `RERANK_API_ERROR`\n */\n async rerank(request: RerankRequest): Promise<HaiResult<RerankResponse>> {\n return callRerankAPI(request)\n },\n\n /**\n * 对纯文本数组进行重排(`rerank` 的简化版本)\n *\n * @param query - 用于对比相关度的查询文本\n * @param texts - 待重排的文本列表\n * @param topN - 仅返回前 N 个结果(可选)\n * @returns `ok(RerankItem[])` 按相关度降序排列的结果;API 调用失败时返回错误\n */\n async rerankTexts(query: string, texts: string[], topN?: number): Promise<HaiResult<RerankItem[]>> {\n const result = await callRerankAPI({ query, documents: texts, topN })\n if (!result.success)\n return result\n return ok(result.data.results)\n },\n }\n}\n","/**\n * @h-ai/ai — Retrieval 子功能实现\n *\n * 基于向量数据库 (@h-ai/vecdb) 和 Embedding 实现的检索功能。\n * @module ai-retrieval-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { EmbeddingOperations } from '../embedding/ai-embedding-types.js'\nimport type { RerankOperations } from '../rerank/ai-rerank-types.js'\nimport type { AIRelStore, AIStoreProvider } from '../store/ai-store-types.js'\nimport type {\n Citation,\n RetrievalOperations,\n RetrievalRequest,\n RetrievalResult,\n RetrievalResultItem,\n RetrievalSource,\n} from './ai-retrieval-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'retrieval' })\n\n/**\n * 创建 Retrieval 操作接口\n *\n * @param embeddingOps - Embedding 操作(用于将查询文本向量化)\n * @param storeProvider - 存储 Provider(用于按 collection 创建向量存储实例)\n * @param sourceStore - 检索源持久化存储(支持分布式一致)\n * @returns RetrievalOperations 实例\n */\nexport function createRetrievalOperations(\n embeddingOps: EmbeddingOperations,\n storeProvider: AIStoreProvider,\n sourceStore: AIRelStore<RetrievalSource>,\n rerankOps?: RerankOperations | null,\n): RetrievalOperations {\n // vectorStore 实例缓存(按 collection 复用,避免每次检索都创建新实例)\n const vectorStoreCache = new Map<string, ReturnType<AIStoreProvider['createVectorStore']>>()\n function getVectorStore(collection: string) {\n let store = vectorStoreCache.get(collection)\n if (!store) {\n store = storeProvider.createVectorStore(collection)\n vectorStoreCache.set(collection, store)\n }\n return store\n }\n\n return {\n /**\n * 注册检索源\n *\n * 将配置好的检索源持久化到 store,后续 `retrieve` 时根据 source.id 匹配。\n * 同一 id 不可重复注册,重复调用返回错误。\n *\n * @param source - 检索源配置(id、collection、描述等)\n * @returns `ok(undefined)` 注册成功;`err` 含错误码 `RETRIEVAL_FAILED`(重复注册)\n */\n async addSource(source: RetrievalSource): Promise<HaiResult<void>> {\n const existing = await sourceStore.get(source.id)\n if (existing) {\n return err(HaiAIError.RETRIEVAL_FAILED, aiM('ai_internalError', { params: { error: `Source '${source.id}' already exists` } }))\n }\n await sourceStore.save(source.id, source)\n logger.debug('Retrieval source added', { sourceId: source.id, collection: source.collection })\n return ok(undefined)\n },\n\n /**\n * 取消注册检索源\n *\n * 从 store 删除指定 id 的检索源。源不存在时返回 `RETRIEVAL_SOURCE_NOT_FOUND` 错误。\n *\n * @param sourceId - 检索源的唯一标识\n * @returns `ok(undefined)` 删除成功;`err` 含错误码 `RETRIEVAL_SOURCE_NOT_FOUND`\n */\n async removeSource(sourceId: string): Promise<HaiResult<void>> {\n const existing = await sourceStore.get(sourceId)\n if (!existing) {\n return err(HaiAIError.RETRIEVAL_SOURCE_NOT_FOUND, aiM('ai_internalError', { params: { error: `Source '${sourceId}' not found` } }))\n }\n await sourceStore.remove(sourceId)\n logger.debug('Retrieval source removed', { sourceId })\n return ok(undefined)\n },\n\n /**\n * 列出所有已注册的检索源\n *\n * @returns 全部检索源数组(无源时返回空数组)\n */\n async listSources(): Promise<RetrievalSource[]> {\n return sourceStore.query({})\n },\n\n /**\n * 执行向量检索\n *\n * 流程:\n * 1. 将 `request.query` 向量化(Embedding)\n * 2. 对每个目标检索源并发执行向量近邻搜索\n * 3. 合并结果 → 按 score 降序 → 截取 topK\n *\n * @param request - 检索请求(query、可选 sources / topK / minScore 等)\n * @returns `ok(RetrievalResult)` 含检索项列表与引用信息;无源时返回 `RETRIEVAL_SOURCE_NOT_FOUND` 错误\n */\n async retrieve(request: RetrievalRequest): Promise<HaiResult<RetrievalResult>> {\n const startTime = Date.now()\n\n // 确定要查询的源(从 DB 读取,分布式一致)\n const targetSources = await sourceStore.query(\n request.sources?.length\n ? { where: { id: { $in: request.sources } } }\n : {},\n )\n\n if (targetSources.length === 0) {\n return err(HaiAIError.RETRIEVAL_SOURCE_NOT_FOUND, aiM('ai_internalError', { params: { error: 'No retrieval sources configured' } }))\n }\n\n try {\n // 向量化查询文本\n const embedResult = await embeddingOps.embedText(request.query)\n if (!embedResult.success) {\n return err(HaiAIError.RETRIEVAL_FAILED, aiM('ai_internalError', { params: { error: 'Failed to embed query' } }), embedResult.error)\n }\n\n const queryVector = embedResult.data\n\n // 并发查询所有源\n const allItems: RetrievalResultItem[] = []\n\n const searchPromises = targetSources.map(async (source) => {\n const topK = request.topK ?? source.topK ?? 5\n const minScore = request.minScore ?? source.minScore\n\n const vectorStore = getVectorStore(source.collection)\n const searchResults = await vectorStore.search(queryVector, {\n topK,\n minScore,\n filter: source.filter,\n })\n\n for (const item of searchResults) {\n // 从向量记录 metadata 构建结构化信源引用\n const citation: Citation = {\n documentId: item.metadata?.documentId as string | undefined,\n title: item.metadata?.title as string | undefined ?? source.name,\n url: item.metadata?.url as string | undefined ?? source.url,\n position: item.metadata?.position as string | undefined,\n chunkId: item.id,\n collection: source.collection,\n }\n\n allItems.push({\n id: item.id,\n content: item.content ?? '',\n score: item.score,\n sourceId: source.id,\n metadata: item.metadata,\n citation,\n })\n }\n })\n\n await Promise.all(searchPromises)\n\n // 可选:Rerank 重排序\n if (request.enableRerank && rerankOps && allItems.length > 0) {\n const rerankResult = await rerankOps.rerank({\n query: request.query,\n documents: allItems.map(item => item.content),\n model: request.rerankModel,\n topN: request.topK ?? 10,\n returnDocuments: false,\n })\n if (rerankResult.success) {\n const reranked = rerankResult.data.results\n .map(r => ({ ...allItems[r.index], score: r.relevanceScore }))\n allItems.length = 0\n allItems.push(...reranked)\n }\n else {\n logger.warn('Rerank failed, falling back to vector scores', { error: rerankResult.error })\n }\n }\n\n // 按分数降序排列\n allItems.sort((a, b) => b.score - a.score)\n\n // 限制总数(取全局 topK 或所有结果)\n const topK = request.topK ?? 10\n const limitedItems = allItems.slice(0, topK)\n\n const duration = Date.now() - startTime\n logger.trace('Retrieval completed', { query: request.query, resultCount: limitedItems.length, duration })\n\n return ok({\n items: limitedItems,\n query: request.query,\n duration,\n })\n }\n catch (error) {\n logger.error('Retrieval failed', { error })\n return err(HaiAIError.RETRIEVAL_FAILED, aiM('ai_internalError', { params: { error: String(error) } }), error)\n }\n },\n }\n}\n","/**\n * @h-ai/ai — Summary 子功能实现\n *\n * 使用 LLM 对对话消息生成摘要,支持增量摘要(传入前序摘要合并)。\n * @module ai-summary-functions\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { LLMConfig, SummaryConfig } from '../ai-config.js'\n\nimport type { ChatMessage, LLMOperations } from '../llm/ai-llm-types.js'\nimport type { TokenOperations } from '../token/ai-token-types.js'\nimport type { SummaryOperations, SummaryOptions, SummaryResult } from './ai-summary-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { resolveModelEntry } from '../ai-config.js'\nimport { aiM } from '../ai-i18n.js'\nimport { HaiAIError } from '../ai-types.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'summary' })\n\n// ─── 摘要提示词 ───\n\nconst SUMMARIZE_SYSTEM_PROMPT = `You are a conversation summarizer. Create a concise summary of the conversation that preserves:\n1. Key facts and decisions made\n2. Important context and background information\n3. User preferences or instructions mentioned\n4. Any unresolved questions or pending topics\n\nRules:\n- Be concise but comprehensive — capture all important information\n- Use third person (\"The user asked...\", \"The assistant explained...\")\n- Preserve specific details like names, numbers, dates, and technical terms\n- Structure the summary in logical paragraphs\n- Keep the summary under 500 words`\n\nconst INCREMENTAL_SUMMARIZE_SUFFIX = `You have a previous summary and new messages to incorporate.\n\nPrevious Summary:\n{previousSummary}\n\nMerge the previous summary with the new conversation messages to create an updated, comprehensive summary. Follow the same rules as above: be concise, preserve key details, use third person.`\n\n/**\n * 创建 Summary 操作接口\n *\n * @param llmConfig - LLM 配置(用于通过 resolveModelEntry 解析场景模型)\n * @param llm - LLM 操作接口(用于生成摘要)\n * @param token - Token 操作接口(用于估算摘要 Token 数)\n * @param config - Summary 配置\n * @returns SummaryOperations 实例\n */\nexport function createSummaryOperations(\n llmConfig: LLMConfig,\n llm: LLMOperations,\n token: TokenOperations,\n config: SummaryConfig,\n): SummaryOperations {\n const { systemPrompt } = config\n\n /**\n * 构建摘要用 systemPrompt\n */\n function buildSummaryPrompt(options?: SummaryOptions): string {\n const basePrompt = options?.systemPrompt ?? systemPrompt ?? SUMMARIZE_SYSTEM_PROMPT\n if (!options?.previousSummary)\n return basePrompt\n\n return `${basePrompt}\\n\\n${INCREMENTAL_SUMMARIZE_SUFFIX.replace('{previousSummary}', options.previousSummary)}`\n }\n\n /**\n * 提取场景对应的模型名称(API Key 校验由 provider 层负责)\n */\n function scenarioModel(explicit?: string): string | undefined {\n const result = resolveModelEntry(llmConfig, 'summary', explicit)\n return result.success ? result.data.model : explicit\n }\n\n /**\n * 生成摘要文本\n */\n async function generate(\n messages: ChatMessage[],\n options?: SummaryOptions,\n ): Promise<HaiResult<string>> {\n const conversationText = messages\n .filter(m => m.role !== 'system')\n .map((m) => {\n const content = m.role === 'assistant'\n ? (m.content ?? '[tool call]')\n : m.role === 'tool'\n ? `[tool result: ${m.content.slice(0, 200)}]`\n : (typeof m.content === 'string' ? m.content : '[multimodal]')\n return `${m.role}: ${content}`\n })\n .join('\\n')\n\n const prompt = buildSummaryPrompt(options)\n\n const chatResult = await llm.chat({\n model: scenarioModel(options?.model),\n messages: [\n { role: 'system', content: prompt },\n { role: 'user', content: conversationText },\n ],\n temperature: options?.temperature ?? 0.3,\n enablePersist: false,\n })\n\n if (!chatResult.success) {\n return err(HaiAIError.CONTEXT_SUMMARIZE_FAILED, aiM('ai_contextSummarizeFailed', { params: { error: String(chatResult.error.message) } }), chatResult.error)\n }\n\n return ok(chatResult.data.choices[0]?.message?.content ?? '')\n }\n\n /**\n * 生成摘要(含元数据)\n */\n async function summarize(\n messages: ChatMessage[],\n options?: SummaryOptions,\n ): Promise<HaiResult<SummaryResult>> {\n logger.trace('Summarizing messages', { messageCount: messages.length })\n\n try {\n const result = await generate(messages, options)\n if (!result.success)\n return result as HaiResult<never>\n\n const summary = result.data\n return ok({\n summary,\n tokenCount: token.estimateText(summary),\n coveredMessages: messages.filter(m => m.role !== 'system').length,\n })\n }\n catch (error) {\n logger.error('Context summarization failed', { error })\n return err(HaiAIError.CONTEXT_SUMMARIZE_FAILED, aiM('ai_contextSummarizeFailed', { params: { error: String(error) } }), error)\n }\n }\n\n return {\n generate,\n summarize,\n }\n}\n","/**\n * @h-ai/ai — Token 子功能实现\n *\n * 提供轻量级 Token 估算能力,无需外部依赖。\n * 同时导出纯函数(可指定 tokenRatio)和工厂函数(绑定配置的 tokenRatio)。\n * @module ai-token-functions\n */\n\nimport type { TokenConfig } from '../ai-config.js'\nimport type { ChatMessage } from '../llm/ai-llm-types.js'\nimport type { TokenOperations } from './ai-token-types.js'\n\n/**\n * 估算单条文本的 Token 数\n *\n * 使用字符级估算:中文约每字 1-2 token,英文约每 4 字符 1 token。\n * 这是一个保守估算,实际 token 数通常略低于此值。\n *\n * @param text - 文本内容\n * @param tokenRatio - 每字符对应的 token 数(默认 0.25)\n * @returns 估算 token 数\n */\nexport function estimateTextTokens(text: string, tokenRatio = 0.25): number {\n if (!text)\n return 0\n\n // 区分中文和非中文字符\n let cjkCount = 0\n let otherCount = 0\n\n for (const char of text) {\n const code = char.codePointAt(0) ?? 0\n // CJK 统一表意文字范围\n if (\n (code >= 0x4E00 && code <= 0x9FFF)\n || (code >= 0x3400 && code <= 0x4DBF)\n || (code >= 0x20000 && code <= 0x2A6DF)\n ) {\n cjkCount++\n }\n else {\n otherCount++\n }\n }\n\n // 中文:约 1.5 token/字;其他:按 tokenRatio 计算\n return Math.ceil(cjkCount * 1.5 + otherCount * tokenRatio)\n}\n\n/**\n * 估算消息列表的总 Token 数\n *\n * 包含消息结构开销(每条消息约 4 token 用于角色标记和分隔)。\n *\n * @param messages - 消息列表\n * @param tokenRatio - 每字符对应的 token 数\n * @returns 估算 token 总数\n */\nexport function estimateMessagesTokens(messages: ChatMessage[], tokenRatio = 0.25): number {\n let total = 0\n\n for (const msg of messages) {\n // 每条消息固定开销(角色标记 + 分隔符)\n total += 4\n\n const content = getMessageContent(msg)\n total += estimateTextTokens(content, tokenRatio)\n }\n\n // 回复开始标记\n total += 2\n\n return total\n}\n\n/**\n * 提取消息的文本内容\n */\nfunction getMessageContent(msg: ChatMessage): string {\n if (msg.role === 'assistant') {\n const c = msg.content\n if (typeof c === 'string')\n return c\n if (Array.isArray(c))\n return (c as Array<{ type: string, text?: string }>).filter(p => p.type === 'text').map(p => p.text ?? '').join(' ')\n return ''\n }\n if (msg.role === 'tool') {\n const c = msg.content\n if (typeof c === 'string')\n return c\n if (Array.isArray(c))\n return (c as Array<{ type: string, text?: string }>).filter(p => p.type === 'text').map(p => p.text ?? '').join(' ')\n return ''\n }\n // system / user\n const content = (msg as { content: string | Array<{ type: string, text?: string }> }).content\n if (typeof content === 'string')\n return content\n if (Array.isArray(content)) {\n return content\n .filter((c): c is { type: 'text', text: string } => c.type === 'text')\n .map(c => c.text)\n .join(' ')\n }\n return ''\n}\n\n/**\n * 创建 Token 操作接口\n *\n * @param config - Token 配置\n * @returns TokenOperations 实例\n */\nexport function createTokenOperations(config: TokenConfig): TokenOperations {\n const { tokenRatio } = config\n return {\n estimateText: (text: string) => estimateTextTokens(text, tokenRatio),\n estimateMessages: (messages: ChatMessage[]) => estimateMessagesTokens(messages, tokenRatio),\n }\n}\n","/**\n * @h-ai/ai — 子功能组装工厂\n *\n * 将所有子功能的创建逻辑集中在此文件,main.ts 仅做生命周期管理和 API 编排。\n * @module ai-functions\n */\n\nimport type { DatapipeFunctions } from '@h-ai/datapipe'\n\nimport type { AIConfig } from './ai-config.js'\nimport type { AudioOperations } from './audio/ai-audio-types.js'\nimport type { CompressOperations } from './compress/ai-compress-types.js'\nimport type { ContextOperations } from './context/ai-context-types.js'\nimport type { EmbeddingOperations } from './embedding/ai-embedding-types.js'\nimport type { FileOperations } from './file/ai-file-types.js'\nimport type { KnowledgeOperations } from './knowledge/ai-knowledge-types.js'\nimport type { ChatMessage, ChatRecord, LLMOperations } from './llm/ai-llm-types.js'\nimport type { MCPOperations } from './mcp/ai-mcp-types.js'\nimport type { MemoryEntry, MemoryOperations } from './memory/ai-memory-types.js'\nimport type { PersonaOperations, PersonaProfile } from './persona/ai-persona-types.js'\nimport type { RagOperations } from './rag/ai-rag-types.js'\nimport type { ReasoningOperations } from './reasoning/ai-reasoning-types.js'\nimport type { RerankOperations } from './rerank/ai-rerank-types.js'\nimport type { RetrievalOperations, RetrievalSource } from './retrieval/ai-retrieval-types.js'\nimport type { AIStoreProvider, SessionInfo } from './store/ai-store-types.js'\nimport type { SummaryOperations, SummaryResult } from './summary/ai-summary-types.js'\nimport type { TokenOperations } from './token/ai-token-types.js'\n\nimport { core } from '@h-ai/core'\n\nimport { CompressConfigSchema, KnowledgeConfigSchema, MemoryConfigSchema, RetrievalConfigSchema, SummaryConfigSchema, TokenConfigSchema } from './ai-config.js'\nimport { createAudioOperations } from './audio/ai-audio-functions.js'\nimport { createCompressOperations } from './compress/ai-compress-functions.js'\nimport { createContextOperations } from './context/ai-context-functions.js'\nimport { createEmbeddingOperations } from './embedding/ai-embedding-functions.js'\nimport { createFileOperations } from './file/ai-file-functions.js'\nimport { createKnowledgeOperations } from './knowledge/ai-knowledge-functions.js'\nimport { createAILLMFunctions } from './llm/ai-llm-functions.js'\nimport { createAIMCPFunctions } from './mcp/ai-mcp-functions.js'\nimport { createMemoryOperations } from './memory/ai-memory-facade.js'\nimport { createMem0OssMemoryOperations } from './memory/providers/ai-memory-provider-mem0-oss.js'\nimport { createNativeMemoryOperations } from './memory/providers/ai-memory-provider-native.js'\nimport { createPersonaOperations } from './persona/ai-persona-functions.js'\nimport { createRagOperations } from './rag/ai-rag-functions.js'\nimport { createReasoningOperations } from './reasoning/ai-reasoning-functions.js'\nimport { createRerankOperations } from './rerank/ai-rerank-functions.js'\nimport { createRetrievalOperations } from './retrieval/ai-retrieval-functions.js'\nimport { createSummaryOperations } from './summary/ai-summary-functions.js'\nimport { createTokenOperations } from './token/ai-token-functions.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'functions' })\n\n/** 子功能组装依赖 */\nexport interface AISubsystemDeps {\n storeProvider: AIStoreProvider\n datapipe: DatapipeFunctions\n}\n\n/** 子功能组装结果 */\nexport interface AISubsystems {\n llm: LLMOperations\n mcp: MCPOperations\n embedding: EmbeddingOperations\n reasoning: ReasoningOperations\n rerank: RerankOperations\n retrieval: RetrievalOperations\n rag: RagOperations\n knowledge: KnowledgeOperations\n memory: MemoryOperations\n persona: PersonaOperations\n token: TokenOperations\n summary: SummaryOperations\n compress: CompressOperations\n context: ContextOperations\n file: FileOperations\n audio: AudioOperations\n}\n\n/**\n * 组装所有 AI 子功能实例\n *\n * 根据 parsed config 和外部依赖创建所有子功能操作接口。\n * 与 main.ts 解耦——main 仅负责生命周期,本函数负责创建逻辑。\n */\nexport async function createAISubsystems(config: AIConfig, deps: AISubsystemDeps): Promise<AISubsystems> {\n const { storeProvider, datapipe: datapipeDep } = deps\n\n // 记忆后端:mem0 OSS 自管理存储,无需 hai 的 memoryStore / memoryVectorStore\n const memoryParsed = MemoryConfigSchema.parse(config.memory ?? {})\n const useMem0Oss = memoryParsed.provider === 'mem0'\n\n // 通过 Provider 创建存储实例\n const chatRecordStore = storeProvider.createRelStore<ChatRecord>('hai_ai_chat_records', { hasObjectId: true, hasSessionId: true })\n const sessionStore = storeProvider.createRelStore<SessionInfo>('hai_ai_sessions', { hasObjectId: true })\n const sourceStore = storeProvider.createRelStore<RetrievalSource>('hai_ai_retrieval_sources')\n const memoryStore = useMem0Oss ? null : storeProvider.createRelStore<MemoryEntry>('hai_ai_memory', { hasObjectId: true, hasScopeIndex: true })\n const contextStore = storeProvider.createRelStore<{ messages: ChatMessage[], summaries: SummaryResult[], updatedAt: number }>('hai_ai_context', { hasObjectId: true, hasSessionId: true })\n const personaStore = storeProvider.createRelStore<PersonaProfile>('hai_ai_persona', { hasObjectId: true })\n\n // 向量存储\n const memoryVectorStore = useMem0Oss ? null : storeProvider.createVectorStore('hai_ai_memory_vectors')\n\n // 统一初始化(建表等)\n await storeProvider.initialize()\n\n const llmFunctions = createAILLMFunctions(config, { recordStore: chatRecordStore, sessionStore })\n const llm = llmFunctions.llm\n\n // MCP\n const mcp = createAIMCPFunctions({ config })\n\n // Embedding\n const embedding = createEmbeddingOperations(config)\n\n // Reasoning(依赖 LLM)\n const reasoning = createReasoningOperations(config, llm)\n\n // Rerank\n const rerank = createRerankOperations(config)\n\n const retrieval = createRetrievalOperations(embedding, storeProvider, sourceStore, rerank)\n\n // 预注册配置中的检索源(幂等写入,就算其他实例已有相同数据也安全)\n if (config.retrieval?.sources?.length) {\n const configSources = RetrievalConfigSchema.parse(config.retrieval).sources ?? []\n sourceStore\n .saveMany(configSources.map(s => ({ id: s.id, data: s })))\n .catch((e: unknown) => logger.warn('Failed to pre-register retrieval sources', { error: e }))\n }\n\n // RAG(依赖 LLM + Retrieval)\n const rag = createRagOperations(llm, retrieval)\n\n // Knowledge(依赖 KnowledgeStore + LLM + Embedding + datapipe)\n const knowledgeParsed = KnowledgeConfigSchema.parse(config.knowledge ?? {})\n const knowledgeStore = storeProvider.createKnowledgeStore?.()\n const knowledge = createKnowledgeOperations(knowledgeParsed, llm, embedding, datapipeDep, knowledgeStore)\n\n const memoryCore = memoryStore && memoryVectorStore\n ? createNativeMemoryOperations(memoryParsed, llm, embedding, memoryStore, memoryVectorStore)\n : await createMem0OssMemoryOperations({\n config: memoryParsed,\n aiConfig: config,\n llm,\n collectionName: 'hai_ai_memory',\n embeddingDims: config.embedding?.dimensions,\n vectorBackend: storeProvider.getVectorBackend?.(),\n })\n // 封装出对外的公共记忆接口(作用域绑定 scoped + 管理接口 admin + clear 空过滤保护)\n const memory: MemoryOperations = createMemoryOperations(memoryCore)\n\n // Token / Summary / Compress\n const tokenParsed = TokenConfigSchema.parse(config.token ?? {})\n const summaryParsed = SummaryConfigSchema.parse(config.summary ?? {})\n const compressParsed = CompressConfigSchema.parse(config.compress ?? {})\n\n const token = createTokenOperations(tokenParsed)\n const summary = createSummaryOperations(config.llm, llm, token, summaryParsed)\n const compress = createCompressOperations(compressParsed, token, summary, config.llm.maxTokens ?? 4096)\n\n const context = createContextOperations(compressParsed, token, compress, contextStore, sessionStore, {\n llm,\n memory: memory ?? undefined,\n rag: rag ?? undefined,\n reasoning: reasoning ?? undefined,\n summary,\n })\n\n // Persona(全局共享的 AI 角色档案)\n const persona = createPersonaOperations(personaStore)\n\n // File(依赖 LLM)\n const file = createFileOperations(config, llm)\n\n // Audio(语音识别 / 语音合成,独立平台 Provider)\n const audio = createAudioOperations(config)\n\n return { llm, mcp, embedding, reasoning, rerank, retrieval, rag, knowledge, memory, persona, token, summary, compress, context, file, audio }\n}\n","/**\n * @h-ai/ai — 默认 DB 存储 Provider(reldb + vecdb)\n *\n * 基于 @h-ai/reldb 和 @h-ai/vecdb 的 AIStoreProvider 默认实现。\n * AI 默认初始化路径直接使用该实现,因此 @h-ai/reldb 与 @h-ai/vecdb 是运行时依赖。\n * @module ai-store-provider-db\n */\n\nimport type { DbType, DmlOperations, ReldbJsonOps } from '@h-ai/reldb'\nimport type { VecdbFunctions } from '@h-ai/vecdb'\nimport type { AIRelStore, AIRelStoreOptions, AIStoreProvider, AIVectorBackend, AIVectorStore, KnowledgeStore, StoreFilter, StorePage, StoreScope, WhereClause, WhereOperator } from '../ai-store-types.js'\n\nimport { core } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { vecdb } from '@h-ai/vecdb'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'store-provider-db' })\n\n/** 单条批量 SQL 的参数上限,保守低于 SQLite 默认 999 变量限制。 */\nconst MAX_BATCH_SQL_PARAMS = 900\n\n// ─── ReldbAIRelStore 实现 ───\n\n/**\n * 基于 reldb 的持久化 AIRelStore 实现\n *\n * 将记录以 JSON 格式存储在 reldb 表中,支持 SQLite / PostgreSQL / MySQL。\n * 表结构:id PK, object_id?, session_id?, status?, ref_id?, data JSON, created_at, updated_at\n */\nclass ReldbAIRelStore<T> implements AIRelStore<T> {\n private readonly sql: DmlOperations\n private readonly table: string\n private readonly jsonOps: ReldbJsonOps\n private readonly dbType: DbType\n private readonly hasObjectId: boolean\n private readonly hasSessionId: boolean\n private readonly hasStatus: boolean\n private readonly hasRefId: boolean\n private readonly hasScopeIndex: boolean\n\n constructor(sql: DmlOperations, table: string, jsonOps: ReldbJsonOps, dbType: DbType, options?: AIRelStoreOptions) {\n this.sql = sql\n this.table = table\n this.jsonOps = jsonOps\n this.dbType = dbType\n this.hasObjectId = options?.hasObjectId ?? false\n this.hasSessionId = options?.hasSessionId ?? false\n this.hasStatus = options?.hasStatus ?? false\n this.hasRefId = options?.hasRefId ?? false\n this.hasScopeIndex = options?.hasScopeIndex ?? false\n }\n\n /** 创建表及索引(幂等) */\n async createTable(): Promise<void> {\n const t = this.table\n const db = this.dbType\n const idType = db === 'mysql' ? 'VARCHAR(512)' : 'TEXT'\n const scopeType = db === 'mysql' ? 'VARCHAR(255)' : 'TEXT'\n const dataType = db === 'postgresql' ? 'JSONB' : db === 'mysql' ? 'JSON' : 'TEXT'\n\n const cols: string[] = [`id ${idType} PRIMARY KEY`]\n if (this.hasObjectId)\n cols.push(`object_id ${scopeType}`)\n if (this.hasSessionId)\n cols.push(`session_id ${scopeType}`)\n if (this.hasStatus)\n cols.push(`status ${scopeType}`)\n if (this.hasRefId)\n cols.push(`ref_id ${scopeType}`)\n cols.push(`data ${dataType} NOT NULL`, `created_at BIGINT NOT NULL`, `updated_at BIGINT NOT NULL`)\n\n await this.sql.execute(`CREATE TABLE IF NOT EXISTS ${t} (${cols.join(', ')})`)\n\n if (this.hasObjectId)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_object_id ON ${t}(object_id)`)\n if (this.hasSessionId)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_session_id ON ${t}(session_id)`)\n if (this.hasObjectId && this.hasSessionId)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_object_session ON ${t}(object_id, session_id)`)\n if (this.hasStatus)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_status ON ${t}(status)`)\n if (this.hasRefId)\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_ref_id ON ${t}(ref_id)`)\n // 业务作用域索引:仅 PostgreSQL 支持 JSONB GIN,用于加速 data @> '{\"scope\":...}' 包含查询。\n if (this.hasScopeIndex && db === 'postgresql')\n await this.sql.execute(`CREATE INDEX IF NOT EXISTS idx_${t}_data_gin ON ${t} USING GIN (data jsonb_path_ops)`)\n }\n\n async save(id: string, data: T, scope?: StoreScope): Promise<void> {\n const now = Date.now()\n const json = JSON.stringify(data)\n\n const colNames = ['id']\n const values: unknown[] = [id]\n const placeholders: string[] = ['?']\n\n if (this.hasObjectId) {\n colNames.push('object_id')\n values.push(scope?.objectId ?? null)\n placeholders.push('?')\n }\n if (this.hasSessionId) {\n colNames.push('session_id')\n values.push(scope?.sessionId ?? null)\n placeholders.push('?')\n }\n if (this.hasStatus) {\n colNames.push('status')\n values.push(scope?.status ?? null)\n placeholders.push('?')\n }\n if (this.hasRefId) {\n colNames.push('ref_id')\n values.push(scope?.refId ?? null)\n placeholders.push('?')\n }\n\n colNames.push('data', 'created_at', 'updated_at')\n values.push(json, now, now)\n placeholders.push('?', '?', '?')\n\n if (this.dbType === 'mysql') {\n const updateParts: string[] = ['data = VALUES(data)', 'updated_at = VALUES(updated_at)']\n if (this.hasObjectId)\n updateParts.push('object_id = VALUES(object_id)')\n if (this.hasSessionId)\n updateParts.push('session_id = VALUES(session_id)')\n if (this.hasStatus)\n updateParts.push('status = VALUES(status)')\n if (this.hasRefId)\n updateParts.push('ref_id = VALUES(ref_id)')\n await this.sql.execute(\n `INSERT INTO ${this.table} (${colNames.join(', ')}) VALUES (${placeholders.join(', ')}) ON DUPLICATE KEY UPDATE ${updateParts.join(', ')}`,\n values,\n )\n }\n else {\n const updateParts: string[] = ['data = excluded.data', 'updated_at = excluded.updated_at']\n if (this.hasObjectId)\n updateParts.push('object_id = excluded.object_id')\n if (this.hasSessionId)\n updateParts.push('session_id = excluded.session_id')\n if (this.hasStatus)\n updateParts.push('status = excluded.status')\n if (this.hasRefId)\n updateParts.push('ref_id = excluded.ref_id')\n await this.sql.execute(\n `INSERT INTO ${this.table} (${colNames.join(', ')}) VALUES (${placeholders.join(', ')}) ON CONFLICT(id) DO UPDATE SET ${updateParts.join(', ')}`,\n values,\n )\n }\n }\n\n async saveMany(items: Array<{ id: string, data: T, scope?: StoreScope }>): Promise<void> {\n if (items.length === 0)\n return\n\n const colNames = this.buildSaveColumnNames()\n const rowsPerBatch = Math.max(1, Math.floor(MAX_BATCH_SQL_PARAMS / colNames.length))\n\n // 大批量入库时使用多行 INSERT,减少 SQL 往返;按参数数分批避免 SQLite / MySQL 参数上限。\n for (let start = 0; start < items.length; start += rowsPerBatch) {\n // 每批都是参数化批量 SQL;顺序执行避免同一连接上并发写入争抢。\n await this.saveManyBatch(items.slice(start, start + rowsPerBatch), colNames)\n }\n }\n\n async get(id: string): Promise<T | undefined> {\n const result = await this.sql.get<{ data: string }>(`SELECT data FROM ${this.table} WHERE id = ?`, [id])\n if (!result.success || !result.data)\n return undefined\n return JSON.parse(result.data.data) as T\n }\n\n async query(filter: StoreFilter<T>): Promise<T[]> {\n const { sql, params } = this.buildQuery(filter)\n const result = await this.sql.query<{ data: string }>(sql, params)\n if (!result.success)\n return []\n return result.data.map(row => JSON.parse(row.data) as T)\n }\n\n async queryPage(filter: StoreFilter<T>, page: { offset: number, limit: number }): Promise<StorePage<T>> {\n const countParams: unknown[] = []\n const countConditions = this.buildAllConditions(filter, countParams)\n let countSql = `SELECT COUNT(*) as cnt FROM ${this.table}`\n if (countConditions.length > 0)\n countSql += ` WHERE ${countConditions.join(' AND ')}`\n const countResult = await this.sql.get<{ cnt: number }>(countSql, countParams)\n const total = countResult.success && countResult.data != null ? countResult.data.cnt : 0\n\n const { sql, params } = this.buildQuery({ ...filter, limit: undefined })\n const pagedSql = `${sql} LIMIT ? OFFSET ?`\n const result = await this.sql.query<{ data: string }>(pagedSql, [...params, page.limit, page.offset])\n const items = result.success ? result.data.map(row => JSON.parse(row.data) as T) : []\n\n return { items, total }\n }\n\n async remove(id: string): Promise<boolean> {\n await this.sql.execute(`DELETE FROM ${this.table} WHERE id = ?`, [id])\n return true\n }\n\n async removeBy(filter: StoreFilter<T>): Promise<number> {\n const params: unknown[] = []\n const conditions = this.buildAllConditions(filter, params)\n\n let countSql = `SELECT COUNT(*) as cnt FROM ${this.table}`\n if (conditions.length > 0) {\n const whereClause = ` WHERE ${conditions.join(' AND ')}`\n countSql += whereClause\n const countResult = await this.sql.get<{ cnt: number }>(countSql, [...params])\n const count = countResult.success && countResult.data != null ? countResult.data.cnt : 0\n await this.sql.execute(`DELETE FROM ${this.table}${whereClause}`, params)\n return count\n }\n\n const countResult = await this.sql.get<{ cnt: number }>(countSql)\n const count = countResult.success && countResult.data != null ? countResult.data.cnt : 0\n await this.sql.execute(`DELETE FROM ${this.table}`)\n return count\n }\n\n async count(filter?: StoreFilter<T>): Promise<number> {\n if (!filter?.where && !filter?.objectId && !filter?.sessionId && !filter?.status && !filter?.refId) {\n const result = await this.sql.get<{ cnt: number }>(`SELECT COUNT(*) as cnt FROM ${this.table}`)\n return result.success && result.data != null ? result.data.cnt : 0\n }\n const params: unknown[] = []\n const conditions = this.buildAllConditions(filter!, params)\n let sql = `SELECT COUNT(*) as cnt FROM ${this.table}`\n if (conditions.length > 0)\n sql += ` WHERE ${conditions.join(' AND ')}`\n const result = await this.sql.get<{ cnt: number }>(sql, params)\n return result.success && result.data != null ? result.data.cnt : 0\n }\n\n async clear(filter?: StoreFilter<T>): Promise<void> {\n if (!filter?.where && !filter?.objectId && !filter?.sessionId && !filter?.status && !filter?.refId) {\n await this.sql.execute(`DELETE FROM ${this.table}`)\n return\n }\n await this.removeBy(filter!)\n }\n\n /** 构造 save/saveMany 共用的列名,确保批量写入与单条写入索引列一致。 */\n private buildSaveColumnNames(): string[] {\n const colNames = ['id']\n if (this.hasObjectId)\n colNames.push('object_id')\n if (this.hasSessionId)\n colNames.push('session_id')\n if (this.hasStatus)\n colNames.push('status')\n if (this.hasRefId)\n colNames.push('ref_id')\n colNames.push('data', 'created_at', 'updated_at')\n return colNames\n }\n\n /** 构造单行 upsert 参数;动态值全部通过 params 传入,SQL 中不拼接用户输入。 */\n private buildSaveValues(id: string, data: T, scope: StoreScope | undefined, now: number): unknown[] {\n const values: unknown[] = [id]\n if (this.hasObjectId)\n values.push(scope?.objectId ?? null)\n if (this.hasSessionId)\n values.push(scope?.sessionId ?? null)\n if (this.hasStatus)\n values.push(scope?.status ?? null)\n if (this.hasRefId)\n values.push(scope?.refId ?? null)\n values.push(JSON.stringify(data), now, now)\n return values\n }\n\n /** 构造跨数据库 upsert 更新片段;列名来自内部白名单,不接受外部输入。 */\n private buildSaveUpdateParts(): string[] {\n const valueRef = (column: string) => this.dbType === 'mysql' ? `VALUES(${column})` : `excluded.${column}`\n const updateParts: string[] = [`data = ${valueRef('data')}`, `updated_at = ${valueRef('updated_at')}`]\n if (this.hasObjectId)\n updateParts.push(`object_id = ${valueRef('object_id')}`)\n if (this.hasSessionId)\n updateParts.push(`session_id = ${valueRef('session_id')}`)\n if (this.hasStatus)\n updateParts.push(`status = ${valueRef('status')}`)\n if (this.hasRefId)\n updateParts.push(`ref_id = ${valueRef('ref_id')}`)\n return updateParts\n }\n\n /** 执行一批参数化 upsert;调用方已按数据库参数上限切好 batch。 */\n private async saveManyBatch(items: Array<{ id: string, data: T, scope?: StoreScope }>, colNames: string[]): Promise<void> {\n const now = Date.now()\n const values: unknown[] = []\n const placeholders = items.map(({ id, data, scope }) => {\n const rowValues = this.buildSaveValues(id, data, scope, now)\n values.push(...rowValues)\n return `(${rowValues.map(() => '?').join(', ')})`\n })\n\n const updateParts = this.buildSaveUpdateParts()\n const conflictSql = this.dbType === 'mysql'\n ? `ON DUPLICATE KEY UPDATE ${updateParts.join(', ')}`\n : `ON CONFLICT(id) DO UPDATE SET ${updateParts.join(', ')}`\n\n await this.sql.execute(\n `INSERT INTO ${this.table} (${colNames.join(', ')}) VALUES ${placeholders.join(', ')} ${conflictSql}`,\n values,\n )\n }\n\n private buildQuery(filter: StoreFilter<T>): { sql: string, params: unknown[] } {\n let sql = `SELECT data FROM ${this.table}`\n const params: unknown[] = []\n const conditions = this.buildAllConditions(filter, params)\n if (conditions.length > 0)\n sql += ` WHERE ${conditions.join(' AND ')}`\n\n if (filter.orderBy) {\n const dir = filter.orderBy.direction === 'asc' ? 'ASC' : 'DESC'\n const field = String(filter.orderBy.field)\n if (field === 'createdAt') {\n sql += ` ORDER BY created_at ${dir}`\n }\n else if (field === 'updatedAt') {\n sql += ` ORDER BY updated_at ${dir}`\n }\n else {\n const { sql: jsonSql, params: jsonParams } = this.jsonOps.extract('data', `$.${field}`)\n params.push(...jsonParams)\n sql += ` ORDER BY ${jsonSql} ${dir}`\n }\n }\n else {\n sql += ` ORDER BY created_at DESC`\n }\n\n if (filter.limit) {\n sql += ` LIMIT ?`\n params.push(filter.limit)\n }\n return { sql, params }\n }\n\n private buildAllConditions(filter: StoreFilter<T>, params: unknown[]): string[] {\n const conditions: string[] = []\n if (filter.objectId && this.hasObjectId) {\n conditions.push('object_id = ?')\n params.push(filter.objectId)\n }\n if (filter.sessionId && this.hasSessionId) {\n conditions.push('session_id = ?')\n params.push(filter.sessionId)\n }\n if (filter.status && this.hasStatus) {\n if (Array.isArray(filter.status)) {\n conditions.push(`status IN (${filter.status.map(() => '?').join(', ')})`)\n params.push(...filter.status)\n }\n else {\n conditions.push('status = ?')\n params.push(filter.status)\n }\n }\n if (filter.refId && this.hasRefId) {\n conditions.push('ref_id = ?')\n params.push(filter.refId)\n }\n // 业务作用域下推:仅 PostgreSQL 用 JSONB 包含查询(可命中 GIN 索引)。\n // 其它后端为 no-op —— 结果不受影响,由调用方在内存中完成 scope 匹配。\n if (filter.scope && Object.keys(filter.scope).length > 0 && this.dbType === 'postgresql') {\n conditions.push('data @> ?::jsonb')\n params.push(JSON.stringify({ scope: filter.scope }))\n }\n if (filter.where)\n conditions.push(...this.buildWhereConditions(filter.where, params))\n return conditions\n }\n\n private buildWhereConditions(where: WhereClause<T>, params: unknown[]): string[] {\n const conditions: string[] = []\n for (const key of Object.keys(where)) {\n const value = (where as Record<string, unknown>)[key]\n const path = `$.${key}`\n if (this.isWhereOperator(value)) {\n const op = value as WhereOperator<unknown>\n if (op.$in !== undefined && Array.isArray(op.$in)) {\n const { sql: jsonSql, params: jsonParams } = this.jsonOps.extract('data', path)\n params.push(...jsonParams)\n conditions.push(`${jsonSql} IN (${op.$in.map(() => '?').join(', ')})`)\n params.push(...op.$in)\n }\n if (op.$gte !== undefined) {\n const { sql: j, params: p } = this.jsonOps.extract('data', path)\n params.push(...p)\n conditions.push(`${j} >= ?`)\n params.push(op.$gte)\n }\n if (op.$gt !== undefined) {\n const { sql: j, params: p } = this.jsonOps.extract('data', path)\n params.push(...p)\n conditions.push(`${j} > ?`)\n params.push(op.$gt)\n }\n if (op.$lte !== undefined) {\n const { sql: j, params: p } = this.jsonOps.extract('data', path)\n params.push(...p)\n conditions.push(`${j} <= ?`)\n params.push(op.$lte)\n }\n if (op.$lt !== undefined) {\n const { sql: j, params: p } = this.jsonOps.extract('data', path)\n params.push(...p)\n conditions.push(`${j} < ?`)\n params.push(op.$lt)\n }\n }\n else {\n const { sql: jsonSql, params: jsonParams } = this.jsonOps.extract('data', path)\n params.push(...jsonParams)\n conditions.push(`${jsonSql} = ?`)\n params.push(value)\n }\n }\n return conditions\n }\n\n private isWhereOperator<V>(value: unknown): value is WhereOperator<V> {\n if (typeof value !== 'object' || value === null || Array.isArray(value))\n return false\n const keys = Object.keys(value)\n return keys.length > 0 && keys.every(k => ['$in', '$gte', '$gt', '$lte', '$lt'].includes(k))\n }\n}\n\n// ─── VecdbAIVectorStore 实现 ───\n\n/**\n * 基于 vecdb 的持久化向量存储实现\n *\n * 使用 vecdb.vector / vecdb.collection 子对象操作向量数据。\n * 集合在首次 upsert 时按需创建(lazy),clear 时 drop 集合。\n */\nclass VecdbAIVectorStore implements AIVectorStore {\n private readonly vecdb: VecdbFunctions\n private readonly collection: string\n private collectionDimension: number | null = null\n\n constructor(vecdb: VecdbFunctions, collection: string) {\n this.vecdb = vecdb\n this.collection = collection\n }\n\n private async ensureCollection(dimension: number): Promise<void> {\n if (this.collectionDimension === dimension)\n return\n const exists = await this.vecdb.collection.exists(this.collection)\n if (exists.success && !exists.data)\n await this.vecdb.collection.create(this.collection, { dimension })\n this.collectionDimension = dimension\n }\n\n async upsert(id: string, vector: number[], metadata?: Record<string, unknown>): Promise<void> {\n await this.ensureCollection(vector.length)\n await this.vecdb.vector.upsert(this.collection, [{ id, vector, metadata }])\n }\n\n async search(vector: number[], options?: { topK?: number, minScore?: number, filter?: Record<string, unknown> }): Promise<Array<{ id: string, score: number, content?: string, metadata?: Record<string, unknown> }>> {\n const result = await this.vecdb.vector.search(this.collection, vector, options)\n return result.success ? result.data : []\n }\n\n async remove(id: string): Promise<void> {\n await this.vecdb.vector.delete(this.collection, [id])\n }\n\n async clear(_filter?: Record<string, unknown>): Promise<void> {\n const exists = await this.vecdb.collection.exists(this.collection)\n if (exists.success && exists.data) {\n await this.vecdb.collection.drop(this.collection)\n this.collectionDimension = null\n }\n }\n}\n\n// ─── DB KnowledgeStore 实现 ───\n\n/** 根据数据库类型生成 DDL 语句 */\nfunction buildKnowledgeSchemaStatements(dbType: DbType): string[] {\n const pk = dbType === 'mysql' ? 'VARCHAR(512)' : 'TEXT'\n const textCol = dbType === 'mysql' ? 'VARCHAR(255)' : 'TEXT'\n const longText = 'TEXT'\n\n return [\n `CREATE TABLE IF NOT EXISTS hai_ai_knowledge_entity (\n id ${pk} PRIMARY KEY,\n name ${textCol} NOT NULL,\n type ${textCol} NOT NULL,\n collection ${textCol} NOT NULL,\n aliases ${longText},\n description ${longText},\n created_at BIGINT DEFAULT 0,\n updated_at BIGINT DEFAULT 0\n)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_entity_name ON hai_ai_knowledge_entity(name)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_entity_type ON hai_ai_knowledge_entity(type)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_entity_collection ON hai_ai_knowledge_entity(collection)`,\n `CREATE TABLE IF NOT EXISTS hai_ai_knowledge_entity_document (\n entity_id ${pk} NOT NULL,\n document_id ${pk} NOT NULL,\n chunk_id ${pk} DEFAULT '',\n collection ${textCol} NOT NULL,\n relevance REAL DEFAULT 1.0,\n context ${longText},\n created_at BIGINT DEFAULT 0,\n PRIMARY KEY (entity_id, document_id, chunk_id)\n)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_ed_document ON hai_ai_knowledge_entity_document(document_id)`,\n `CREATE INDEX IF NOT EXISTS idx_hai_ai_knowledge_ed_collection ON hai_ai_knowledge_entity_document(collection)`,\n `CREATE TABLE IF NOT EXISTS hai_ai_knowledge_document (\n document_id ${pk} NOT NULL,\n collection ${textCol} NOT NULL,\n title ${longText},\n url ${longText},\n chunk_count INTEGER DEFAULT 0,\n created_at BIGINT DEFAULT 0,\n PRIMARY KEY (document_id, collection)\n)`,\n `CREATE TABLE IF NOT EXISTS hai_ai_knowledge_collections (\n collection ${textCol} PRIMARY KEY,\n dimension INTEGER NOT NULL,\n created_at BIGINT NOT NULL\n)`,\n ]\n}\n\n/**\n * 基于 reldb + vecdb 的 KnowledgeStore 实现\n *\n * reldb 用于实体/文档/关联的归一化存储,vecdb 用于向量存储。\n * 表结构由 buildKnowledgeSchemaStatements() 生成。\n */\nclass DbKnowledgeStore implements KnowledgeStore {\n private readonly sql: DmlOperations\n private readonly dbType: DbType\n private readonly vecdb: VecdbFunctions\n\n constructor(sql: DmlOperations, dbType: DbType, vecdb: VecdbFunctions) {\n this.sql = sql\n this.dbType = dbType\n this.vecdb = vecdb\n }\n\n async initialize(collection: string, dimension: number): Promise<void> {\n // 创建 vecdb 集合\n const exists = await this.vecdb.collection.exists(collection)\n if (exists.success && !exists.data)\n await this.vecdb.collection.create(collection, { dimension })\n\n // 创建 reldb 表\n const statements = buildKnowledgeSchemaStatements(this.dbType)\n for (const stmt of statements) {\n const result = await this.sql.execute(stmt)\n if (!result.success) {\n logger.error('Knowledge schema creation failed', { sql: stmt.trim().slice(0, 60), error: result.error })\n throw new Error(`Knowledge schema creation failed: ${String(result.error)}`)\n }\n }\n }\n\n async upsertEntity(entity: { id: string, name: string, type: string, collection: string, aliases?: string[], description?: string }): Promise<void> {\n const now = Date.now()\n const params = [entity.id, entity.name, entity.type, entity.collection, entity.aliases ? JSON.stringify(entity.aliases) : null, entity.description ?? null, now, now]\n const stmt = this.dbType === 'mysql'\n ? `INSERT INTO hai_ai_knowledge_entity (id, name, type, collection, aliases, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE name = VALUES(name), type = VALUES(type), collection = VALUES(collection), aliases = VALUES(aliases), description = VALUES(description), updated_at = VALUES(updated_at)`\n : `INSERT INTO hai_ai_knowledge_entity (id, name, type, collection, aliases, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET name = excluded.name, type = excluded.type, collection = excluded.collection, aliases = excluded.aliases, description = excluded.description, updated_at = excluded.updated_at`\n const result = await this.sql.execute(stmt, params)\n if (!result.success)\n throw new Error(`upsertEntity failed: ${String(result.error)}`)\n }\n\n async findEntitiesByName(keyword: string, collection?: string): Promise<Array<{ id: string, name: string, type: string, aliases: string[] }>> {\n const pattern = `%${keyword}%`\n let stmt = `SELECT id, name, type, aliases FROM hai_ai_knowledge_entity WHERE (name LIKE ? OR aliases LIKE ?)`\n const params: unknown[] = [pattern, pattern]\n if (collection) {\n stmt += ' AND collection = ?'\n params.push(collection)\n }\n const result = await this.sql.query<Record<string, unknown>>(stmt, params)\n if (!result.success)\n return []\n return result.data.map(row => ({\n id: row.id as string,\n name: row.name as string,\n type: row.type as string,\n aliases: row.aliases ? JSON.parse(row.aliases as string) as string[] : [],\n }))\n }\n\n async listEntities(options?: { collection?: string, type?: string, keyword?: string, limit?: number }): Promise<Array<{ id: string, name: string, type: string, aliases: string[], description: string | null, createdAt: string | null, updatedAt: string | null }>> {\n let stmt = 'SELECT id, name, type, aliases, description, created_at, updated_at FROM hai_ai_knowledge_entity WHERE 1=1'\n const params: unknown[] = []\n if (options?.collection) {\n stmt += ' AND collection = ?'\n params.push(options.collection)\n }\n if (options?.type) {\n stmt += ' AND type = ?'\n params.push(options.type)\n }\n if (options?.keyword) {\n stmt += ' AND (name LIKE ? OR aliases LIKE ?)'\n const p = `%${options.keyword}%`\n params.push(p, p)\n }\n stmt += ' ORDER BY name'\n if (options?.limit) {\n stmt += ' LIMIT ?'\n params.push(options.limit)\n }\n const result = await this.sql.query<Record<string, unknown>>(stmt, params)\n if (!result.success)\n return []\n return result.data.map(row => ({\n id: row.id as string,\n name: row.name as string,\n type: row.type as string,\n aliases: row.aliases ? JSON.parse(row.aliases as string) as string[] : [],\n description: row.description as string | null,\n createdAt: row.created_at as string | null,\n updatedAt: row.updated_at as string | null,\n }))\n }\n\n async deleteEntities(entityIds: string[]): Promise<void> {\n if (entityIds.length === 0)\n return\n const placeholders = entityIds.map(() => '?').join(', ')\n await this.sql.execute(\n `DELETE FROM hai_ai_knowledge_entity WHERE id IN (${placeholders})`,\n entityIds,\n )\n }\n\n async insertEntityDocument(relation: { entityId: string, documentId: string, chunkId?: string, collection: string, relevance?: number, context?: string }): Promise<void> {\n const now = Date.now()\n const params = [relation.entityId, relation.documentId, relation.chunkId ?? '', relation.collection, relation.relevance ?? 1.0, relation.context ?? null, now]\n const stmt = this.dbType === 'mysql'\n ? `INSERT INTO hai_ai_knowledge_entity_document (entity_id, document_id, chunk_id, collection, relevance, context, created_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE relevance = VALUES(relevance), context = VALUES(context)`\n : `INSERT INTO hai_ai_knowledge_entity_document (entity_id, document_id, chunk_id, collection, relevance, context, created_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT(entity_id, document_id, chunk_id) DO UPDATE SET relevance = excluded.relevance, context = excluded.context`\n const result = await this.sql.execute(stmt, params)\n if (!result.success)\n throw new Error(`insertEntityDocument failed: ${String(result.error)}`)\n }\n\n async findDocumentsByEntityIds(entityIds: string[], collection?: string): Promise<Array<{ entityId: string, documentId: string, chunkId: string, collection: string, relevance: number, context: string | null }>> {\n if (entityIds.length === 0)\n return []\n const placeholders = entityIds.map(() => '?').join(', ')\n let stmt = `SELECT entity_id, document_id, chunk_id, collection, relevance, context FROM hai_ai_knowledge_entity_document WHERE entity_id IN (${placeholders})`\n const params: unknown[] = [...entityIds]\n if (collection) {\n stmt += ' AND collection = ?'\n params.push(collection)\n }\n const result = await this.sql.query<Record<string, unknown>>(stmt, params)\n if (!result.success)\n return []\n return result.data.map(row => ({\n entityId: row.entity_id as string,\n documentId: row.document_id as string,\n chunkId: row.chunk_id as string,\n collection: row.collection as string,\n relevance: row.relevance as number,\n context: row.context as string | null,\n }))\n }\n\n async findByEntityName(entityName: string, options?: { collection?: string, type?: string }): Promise<Array<{ entity: { id: string, name: string, type: string, aliases: string[], description: string | null }, documents: Array<{ documentId: string, chunkId: string, collection: string, relevance: number, context: string | null }> }>> {\n const entities = await this.findEntitiesByName(entityName, options?.collection)\n let filtered = entities\n if (options?.type)\n filtered = filtered.filter(e => e.type === options.type)\n if (filtered.length === 0)\n return []\n\n const entityIds = filtered.map(e => e.id)\n const docs = await this.findDocumentsByEntityIds(entityIds, options?.collection)\n\n const docsByEntity = new Map<string, Array<{ documentId: string, chunkId: string, collection: string, relevance: number, context: string | null }>>()\n for (const doc of docs) {\n const list = docsByEntity.get(doc.entityId) ?? []\n const { entityId: _entityId, ...rest } = doc\n list.push(rest)\n docsByEntity.set(doc.entityId, list)\n }\n\n return filtered.map(entity => ({\n entity: { ...entity, description: null as string | null },\n documents: docsByEntity.get(entity.id) ?? [],\n }))\n }\n\n async deleteDocumentEntities(documentId: string, collection: string): Promise<void> {\n // 必须在 removeDocumentEntityRelations 之前调用,子查询依赖关联行尚未删除\n await this.sql.execute(\n 'DELETE FROM hai_ai_knowledge_entity WHERE collection = ? AND id IN (SELECT DISTINCT entity_id FROM hai_ai_knowledge_entity_document WHERE document_id = ? AND collection = ?)',\n [collection, documentId, collection],\n )\n }\n\n async removeDocumentEntityRelations(documentId: string, collection: string): Promise<void> {\n await this.sql.execute(\n 'DELETE FROM hai_ai_knowledge_entity_document WHERE document_id = ? AND collection = ?',\n [documentId, collection],\n )\n }\n\n async upsertDocument(doc: { documentId: string, collection: string, title?: string, url?: string, chunkCount: number, createdAt: number }): Promise<void> {\n const params = [doc.documentId, doc.collection, doc.title ?? null, doc.url ?? null, doc.chunkCount, doc.createdAt]\n const stmt = this.dbType === 'mysql'\n ? `INSERT INTO hai_ai_knowledge_document (document_id, collection, title, url, chunk_count, created_at) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE title = VALUES(title), url = VALUES(url), chunk_count = VALUES(chunk_count)`\n : `INSERT INTO hai_ai_knowledge_document (document_id, collection, title, url, chunk_count, created_at) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT(document_id, collection) DO UPDATE SET title = excluded.title, url = excluded.url, chunk_count = excluded.chunk_count`\n await this.sql.execute(stmt, params)\n }\n\n async getDocument(documentId: string, collection: string): Promise<{ documentId: string, collection: string, title: string | null, url: string | null, chunkCount: number, createdAt: number } | undefined> {\n const result = await this.sql.query<Record<string, unknown>>(\n 'SELECT document_id, collection, title, url, chunk_count, created_at FROM hai_ai_knowledge_document WHERE document_id = ? AND collection = ?',\n [documentId, collection],\n )\n if (!result.success || result.data.length === 0)\n return undefined\n const row = result.data[0]\n return {\n documentId: row.document_id as string,\n collection: row.collection as string,\n title: row.title as string | null,\n url: row.url as string | null,\n chunkCount: row.chunk_count as number,\n createdAt: row.created_at as number,\n }\n }\n\n async listDocuments(collection: string, options?: { offset?: number, limit?: number }): Promise<Array<{ documentId: string, collection: string, title: string | null, url: string | null, chunkCount: number, createdAt: number }>> {\n let stmt = 'SELECT document_id, collection, title, url, chunk_count, created_at FROM hai_ai_knowledge_document WHERE collection = ?'\n const params: unknown[] = [collection]\n stmt += ' ORDER BY created_at DESC'\n if (options?.limit) {\n stmt += ' LIMIT ?'\n params.push(options.limit)\n }\n if (options?.offset) {\n stmt += ' OFFSET ?'\n params.push(options.offset)\n }\n const result = await this.sql.query<Record<string, unknown>>(stmt, params)\n if (!result.success)\n return []\n return result.data.map(row => ({\n documentId: row.document_id as string,\n collection: row.collection as string,\n title: row.title as string | null,\n url: row.url as string | null,\n chunkCount: row.chunk_count as number,\n createdAt: row.created_at as number,\n }))\n }\n\n async listDocumentEntityCounts(documentIds: string[], collection: string): Promise<Map<string, number>> {\n if (documentIds.length === 0)\n return new Map()\n const placeholders = documentIds.map(() => '?').join(', ')\n const result = await this.sql.query<Record<string, unknown>>(\n `SELECT document_id, COUNT(DISTINCT entity_id) as cnt FROM hai_ai_knowledge_entity_document WHERE document_id IN (${placeholders}) AND collection = ? GROUP BY document_id`,\n [...documentIds, collection],\n )\n const map = new Map<string, number>()\n if (result.success) {\n for (const row of result.data) map.set(row.document_id as string, row.cnt as number)\n }\n return map\n }\n\n async removeDocument(documentId: string, collection: string): Promise<void> {\n await this.sql.execute('DELETE FROM hai_ai_knowledge_document WHERE document_id = ? AND collection = ?', [documentId, collection])\n }\n\n async upsertVectors(collection: string, vectors: Array<{ id: string, vector: number[], content?: string, metadata?: Record<string, unknown> }>): Promise<void> {\n // 确保集合存在\n if (vectors.length > 0) {\n const exists = await this.vecdb.collection.exists(collection)\n if (exists.success && !exists.data)\n await this.vecdb.collection.create(collection, { dimension: vectors[0].vector.length })\n }\n await this.vecdb.vector.upsert(collection, vectors)\n }\n\n async searchVectors(collection: string, vector: number[], options?: { topK?: number, minScore?: number, filter?: Record<string, unknown> }): Promise<Array<{ id: string, score: number, content?: string, metadata?: Record<string, unknown> }>> {\n const result = await this.vecdb.vector.search(collection, vector, options)\n return result.success ? result.data : []\n }\n\n async removeVectors(collection: string, ids: string[]): Promise<void> {\n await this.vecdb.vector.delete(collection, ids)\n }\n\n async ensureCollection(collection: string, dimension: number): Promise<void> {\n const exists = await this.vecdb.collection.exists(collection)\n if (exists.success && !exists.data)\n await this.vecdb.collection.create(collection, { dimension })\n }\n\n async registerCollection(collection: string, dimension: number): Promise<void> {\n const now = Date.now()\n const stmt = this.dbType === 'mysql'\n ? `INSERT INTO hai_ai_knowledge_collections (collection, dimension, created_at) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE dimension = VALUES(dimension)`\n : `INSERT INTO hai_ai_knowledge_collections (collection, dimension, created_at) VALUES (?, ?, ?) ON CONFLICT(collection) DO UPDATE SET dimension = excluded.dimension`\n const result = await this.sql.execute(stmt, [collection, dimension, now])\n if (!result.success)\n throw new Error(`registerCollection failed: ${String(result.error)}`)\n }\n\n async collectionExists(collection: string): Promise<boolean> {\n const result = await this.sql.get<{ cnt: number }>(\n `SELECT 1 as cnt FROM hai_ai_knowledge_collections WHERE collection = ?`,\n [collection],\n )\n return result.success && result.data != null\n }\n\n async deleteCollection(collection: string): Promise<void> {\n // ① 删除 vecdb 集合(向量数据)\n const exists = await this.vecdb.collection.exists(collection)\n if (exists.success && exists.data)\n await this.vecdb.collection.drop(collection)\n\n // ② 删除 reldb 中所有与该 collection 相关的数据(顺序:关联表先、主表后)\n await this.sql.execute('DELETE FROM hai_ai_knowledge_entity_document WHERE collection = ?', [collection])\n await this.sql.execute('DELETE FROM hai_ai_knowledge_document WHERE collection = ?', [collection])\n await this.sql.execute('DELETE FROM hai_ai_knowledge_entity WHERE collection = ?', [collection])\n await this.sql.execute('DELETE FROM hai_ai_knowledge_collections WHERE collection = ?', [collection])\n }\n}\n\n// ─── Provider 工厂 ───\n\n/** DB Provider 依赖 */\nexport interface DbStoreProviderDeps {\n sql: DmlOperations\n jsonOps: ReldbJsonOps\n dbType?: DbType\n vecdb: VecdbFunctions\n}\n\n/**\n * 创建默认 DB 存储 Provider\n *\n * 基于 reldb + vecdb 的 AIStoreProvider 实现。\n * reldb 用于关系数据存储,vecdb 用于向量存储。\n */\nexport function createDbStoreProvider(deps: DbStoreProviderDeps): AIStoreProvider {\n const { sql, jsonOps, vecdb: vecdbDep } = deps\n const dbType = deps.dbType ?? 'sqlite'\n\n /** 已创建的 RelStore 实例(用于批量建表) */\n const relStores: ReldbAIRelStore<unknown>[] = []\n\n return {\n name: 'db',\n\n createRelStore<T>(name: string, options?: AIRelStoreOptions): AIRelStore<T> {\n const store = new ReldbAIRelStore<T>(sql, name, jsonOps, dbType, options)\n relStores.push(store as ReldbAIRelStore<unknown>)\n return store\n },\n\n createVectorStore(name: string): AIVectorStore {\n return new VecdbAIVectorStore(vecdbDep, name)\n },\n\n getVectorBackend(): AIVectorBackend | undefined {\n const connection = vecdbDep.rawConnection\n return connection ? { ...connection } : undefined\n },\n\n createKnowledgeStore(): KnowledgeStore {\n return new DbKnowledgeStore(sql, dbType, vecdbDep)\n },\n\n async initialize(): Promise<void> {\n if (relStores.length > 0) {\n await Promise.all(relStores.map(s => s.createTable()))\n logger.debug('DB store provider initialized', { tableCount: relStores.length })\n }\n },\n\n async close(): Promise<void> {\n relStores.length = 0\n },\n }\n}\n\n// ─── Singleton 便捷工厂 ───\n\n/**\n * 检查 reldb + vecdb 是否已初始化\n *\n * 由 ai-main.ts 在创建默认 DB Provider 前调用。\n */\nexport function isDbStoreAvailable(): boolean {\n return reldb.isInitialized && vecdb.isInitialized\n}\n\n/**\n * 获取未初始化的依赖名称列表\n */\nexport function getUnavailableDbDeps(): string[] {\n const missing: string[] = []\n if (!reldb.isInitialized)\n missing.push('reldb')\n if (!vecdb.isInitialized)\n missing.push('vecdb')\n return missing\n}\n\n/**\n * 从已初始化的 reldb/vecdb 单例创建 DB Provider\n *\n * 用于默认 `store.type: 'db'` 场景。调用前应先用 `isDbStoreAvailable()` 检查。\n */\nexport function createDbStoreProviderFromModules(): AIStoreProvider {\n return createDbStoreProvider({\n sql: reldb.sql,\n jsonOps: reldb.json,\n dbType: reldb.config?.type,\n vecdb,\n })\n}\n","/**\n * @h-ai/ai — 进程内临时 Store Provider\n *\n * 为 LLM-only、工具和本地原型提供零外部依赖的默认体验。数据只存在于当前进程,\n * 不提供 KnowledgeStore,也不应作为多实例或需要持久化的生产存储使用。\n * @module ai-store-provider-memory\n */\n\nimport type {\n AIRelStore,\n AIStoreProvider,\n AIVectorStore,\n StoreFilter,\n StoreScope,\n WhereOperator,\n} from '../ai-store-types.js'\n\ninterface StoredValue {\n data: unknown\n scope?: StoreScope\n}\n\ninterface StoredVector {\n vector: number[]\n metadata?: Record<string, unknown>\n}\n\nfunction isWhereOperator(value: unknown): value is WhereOperator<unknown> {\n return typeof value === 'object'\n && value !== null\n && ['$in', '$gte', '$gt', '$lte', '$lt'].some(key => key in value)\n}\n\nfunction compare(left: unknown, right: unknown): number {\n if (typeof left === 'number' && typeof right === 'number')\n return left - right\n return String(left ?? '').localeCompare(String(right ?? ''))\n}\n\nfunction matchesOperator(value: unknown, operator: WhereOperator<unknown>): boolean {\n if (operator.$in && !operator.$in.some(candidate => Object.is(candidate, value)))\n return false\n if (operator.$gte !== undefined && compare(value, operator.$gte) < 0)\n return false\n if (operator.$gt !== undefined && compare(value, operator.$gt) <= 0)\n return false\n if (operator.$lte !== undefined && compare(value, operator.$lte) > 0)\n return false\n if (operator.$lt !== undefined && compare(value, operator.$lt) >= 0)\n return false\n return true\n}\n\nfunction matchesRecord<T>(record: StoredValue, filter: StoreFilter<T>): boolean {\n if (filter.objectId !== undefined && record.scope?.objectId !== filter.objectId)\n return false\n if (filter.sessionId !== undefined && record.scope?.sessionId !== filter.sessionId)\n return false\n if (filter.refId !== undefined && record.scope?.refId !== filter.refId)\n return false\n if (filter.status !== undefined) {\n const statuses = Array.isArray(filter.status) ? filter.status : [filter.status]\n if (!record.scope?.status || !statuses.includes(record.scope.status))\n return false\n }\n\n const data = record.data as Record<string, unknown>\n if (filter.where) {\n for (const [key, expected] of Object.entries(filter.where)) {\n const actual = data[key]\n if (isWhereOperator(expected)) {\n if (!matchesOperator(actual, expected))\n return false\n }\n else if (!Object.is(actual, expected)) {\n return false\n }\n }\n }\n\n if (filter.scope) {\n const dataScope = data.scope\n if (typeof dataScope !== 'object' || dataScope === null)\n return false\n for (const [key, expected] of Object.entries(filter.scope)) {\n if (!Object.is((dataScope as Record<string, unknown>)[key], expected))\n return false\n }\n }\n\n return true\n}\n\nfunction createRelStore<T>(records: Map<string, StoredValue>): AIRelStore<T> {\n function select(filter: StoreFilter<T>): T[] {\n let values = Array.from(records.values())\n .filter(record => matchesRecord(record, filter))\n .map(record => record.data as T)\n\n if (filter.orderBy) {\n const { field, direction } = filter.orderBy\n const multiplier = direction === 'asc' ? 1 : -1\n values = values.sort((left, right) => compare(left[field], right[field]) * multiplier)\n }\n if (filter.limit !== undefined)\n values = values.slice(0, Math.max(0, filter.limit))\n return values\n }\n\n return {\n async save(id, data, scope) {\n records.set(id, { data, scope })\n },\n async saveMany(items) {\n for (const item of items)\n records.set(item.id, { data: item.data, scope: item.scope })\n },\n async get(id) {\n return records.get(id)?.data as T | undefined\n },\n async query(filter) {\n return select(filter)\n },\n async queryPage(filter, page) {\n const values = select({ ...filter, limit: undefined })\n return {\n items: values.slice(page.offset, page.offset + page.limit),\n total: values.length,\n }\n },\n async remove(id) {\n return records.delete(id)\n },\n async removeBy(filter) {\n const ids = Array.from(records.entries())\n .filter(([, record]) => matchesRecord(record, filter))\n .map(([id]) => id)\n for (const id of ids)\n records.delete(id)\n return ids.length\n },\n async count(filter = {}) {\n return select({ ...filter, limit: undefined }).length\n },\n async clear(filter) {\n if (!filter) {\n records.clear()\n return\n }\n const ids = Array.from(records.entries())\n .filter(([, record]) => matchesRecord(record, filter))\n .map(([id]) => id)\n for (const id of ids)\n records.delete(id)\n },\n }\n}\n\nfunction cosineSimilarity(left: number[], right: number[]): number {\n if (left.length !== right.length || left.length === 0)\n return 0\n let dot = 0\n let leftNorm = 0\n let rightNorm = 0\n for (let index = 0; index < left.length; index += 1) {\n dot += left[index] * right[index]\n leftNorm += left[index] ** 2\n rightNorm += right[index] ** 2\n }\n if (leftNorm === 0 || rightNorm === 0)\n return 0\n return dot / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm))\n}\n\nfunction createVectorStore(vectors: Map<string, StoredVector>): AIVectorStore {\n return {\n async upsert(id, vector, metadata) {\n vectors.set(id, { vector: [...vector], metadata })\n },\n async search(vector, options = {}) {\n const matches = Array.from(vectors.entries())\n .filter(([, item]) => !options.filter || Object.entries(options.filter).every(\n ([key, expected]) => Object.is(item.metadata?.[key], expected),\n ))\n .map(([id, item]) => ({\n id,\n score: cosineSimilarity(vector, item.vector),\n content: typeof item.metadata?.content === 'string' ? item.metadata.content : undefined,\n metadata: item.metadata,\n }))\n .filter(item => item.score >= (options.minScore ?? 0))\n .sort((left, right) => right.score - left.score)\n return matches.slice(0, options.topK ?? 10)\n },\n async remove(id) {\n vectors.delete(id)\n },\n async clear(filter) {\n if (!filter) {\n vectors.clear()\n return\n }\n for (const [id, item] of vectors) {\n if (Object.entries(filter).every(([key, expected]) => Object.is(item.metadata?.[key], expected)))\n vectors.delete(id)\n }\n },\n }\n}\n\n/** 创建进程内临时 Store Provider;`close()` 会释放全部记录 */\nexport function createMemoryStoreProvider(): AIStoreProvider {\n const relStores = new Map<string, Map<string, StoredValue>>()\n const vectorStores = new Map<string, Map<string, StoredVector>>()\n\n return {\n name: 'memory',\n createRelStore<T>(name: string): AIRelStore<T> {\n let records = relStores.get(name)\n if (!records) {\n records = new Map()\n relStores.set(name, records)\n }\n return createRelStore<T>(records)\n },\n createVectorStore(name: string): AIVectorStore {\n let vectors = vectorStores.get(name)\n if (!vectors) {\n vectors = new Map()\n vectorStores.set(name, vectors)\n }\n return createVectorStore(vectors)\n },\n initialize: () => Promise.resolve(),\n async close() {\n for (const records of relStores.values())\n records.clear()\n for (const vectors of vectorStores.values())\n vectors.clear()\n relStores.clear()\n vectorStores.clear()\n },\n }\n}\n","/**\n * @h-ai/ai — AI 服务主入口\n *\n * 提供统一的 `ai` 对象,聚合所有 AI 操作功能。\n * @module ai-main\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { A2AOperations } from './a2a/ai-a2a-types.js'\nimport type { AIConfig, AIConfigInput } from './ai-config.js'\nimport type { AIFunctions, AIInitOptions } from './ai-types.js'\nimport type { AudioOperations } from './audio/ai-audio-types.js'\nimport type { CompressOperations } from './compress/ai-compress-types.js'\nimport type { ContextOperations } from './context/ai-context-types.js'\nimport type { EmbeddingOperations } from './embedding/ai-embedding-types.js'\nimport type { FileOperations } from './file/ai-file-types.js'\nimport type { KnowledgeOperations } from './knowledge/ai-knowledge-types.js'\nimport type { LLMOperations, StreamOperations, ToolsOperations } from './llm/ai-llm-types.js'\nimport type { MCPOperations } from './mcp/ai-mcp-types.js'\nimport type { MemoryOperations } from './memory/ai-memory-types.js'\nimport type { PersonaOperations } from './persona/ai-persona-types.js'\nimport type { RagOperations } from './rag/ai-rag-types.js'\nimport type { ReasoningOperations } from './reasoning/ai-reasoning-types.js'\nimport type { RerankOperations } from './rerank/ai-rerank-types.js'\nimport type { RetrievalOperations } from './retrieval/ai-retrieval-types.js'\nimport type { AIStoreProvider } from './store/ai-store-types.js'\nimport type { SummaryOperations } from './summary/ai-summary-types.js'\nimport type { TokenOperations } from './token/ai-token-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { datapipe } from '@h-ai/datapipe'\n\nimport { createA2ALazyProxy } from './a2a/ai-a2a-functions.js'\nimport { AIConfigSchema } from './ai-config.js'\nimport { createAISubsystems } from './ai-functions.js'\nimport { aiM } from './ai-i18n.js'\nimport { HaiAIError } from './ai-types.js'\nimport { collectStream, createSSEDecoder, createStreamProcessor, encodeSSE } from './llm/ai-llm-stream.js'\nimport { createToolRegistry, defineTool } from './llm/ai-llm-tool.js'\nimport { createDbStoreProviderFromModules, isDbStoreAvailable } from './store/providers/ai-store-provider-db.js'\nimport { createMemoryStoreProvider } from './store/providers/ai-store-provider-memory.js'\n\nconst logger = core.logger.child({ module: 'ai', scope: 'main' })\n\n// ─── 内部状态 ───\n\n/** 并发初始化防护 */\nlet initInProgress = false\n/** 当前配置(`null` 表示未初始化) */\nlet currentConfig: AIConfig | null = null\n/** 当前 LLM 操作实例 */\nlet currentLLM: LLMOperations | null = null\n/** 当前 MCP 操作实例 */\nlet currentMCP: MCPOperations | null = null\n/** 当前 Embedding 操作实例 */\nlet currentEmbedding: EmbeddingOperations | null = null\n/** 当前 Reasoning 操作实例 */\nlet currentReasoning: ReasoningOperations | null = null\n/** 当前 Retrieval 操作实例 */\nlet currentRetrieval: RetrievalOperations | null = null\n/** 当前 RAG 操作实例 */\nlet currentRag: RagOperations | null = null\n/** 当前 Knowledge 操作实例 */\nlet currentKnowledge: KnowledgeOperations | null = null\n/** 当前 Memory 操作实例 */\nlet currentMemory: MemoryOperations | null = null\n/** 当前 Persona 操作实例 */\nlet currentPersona: PersonaOperations | null = null\n/** 当前 Context 操作实例 */\nlet currentContext: ContextOperations | null = null\n/** 当前 Token 操作实例 */\nlet currentToken: TokenOperations | null = null\n/** 当前 Summary 操作实例 */\nlet currentSummary: SummaryOperations | null = null\n/** 当前 Compress 操作实例 */\nlet currentCompress: CompressOperations | null = null\n/** 当前 Rerank 操作实例 */\nlet currentRerank: RerankOperations | null = null\n/** 当前 File 操作实例 */\nlet currentFile: FileOperations | null = null\n/** 当前 Audio 操作实例 */\nlet currentAudio: AudioOperations | null = null\n/** A2A 配置(从 config.a2a 存储,供延迟初始化使用) */\nlet currentA2AConfig: AIConfig['a2a']\n/** A2A 内部实现(registerExecutor 成功后才有值) */\nlet currentA2AImpl: A2AOperations | null = null\n/** 当前存储 Provider(用于 A2A 延迟初始化) */\nlet currentStoreProvider: AIStoreProvider | null = null\n\n// ─── 未初始化占位 ───\n\n/** 创建未初始化错误工具(统一的 NOT_INITIALIZED 响应) */\nconst notInitialized = core.module.createNotInitializedKit(\n HaiAIError.NOT_INITIALIZED,\n () => aiM('ai_notInitialized'),\n)\n\n/**\n * LLM 未初始化占位\n *\n * 异步方法返回 NOT_INITIALIZED HaiResult。\n * chatStream 是 async generator,无法返回 HaiResult,\n * 只能在迭代时抛出异常通知调用方。\n */\nconst notInitializedLLM: LLMOperations = {\n chat: () => Promise.resolve(notInitialized.result()),\n async* chatStream() {\n throw notInitialized.error()\n },\n listModels: () => Promise.resolve(notInitialized.result()),\n getHistory: () => Promise.resolve(notInitialized.result()),\n listSessions: () => Promise.resolve(notInitialized.result()),\n ask: () => Promise.resolve(notInitialized.result()),\n async* askStream() {\n throw notInitialized.error()\n },\n generateObject: () => Promise.resolve(notInitialized.result()),\n}\n\n/** MCP 未初始化占位:所有方法返回 NOT_INITIALIZED 错误 */\nconst notInitializedMCP: MCPOperations = {\n registerTool: () => notInitialized.result(),\n registerResource: () => notInitialized.result(),\n registerPrompt: () => notInitialized.result(),\n callTool: () => Promise.resolve(notInitialized.result()),\n readResource: () => Promise.resolve(notInitialized.result()),\n getPrompt: () => Promise.resolve(notInitialized.result()),\n}\n\n/** Embedding 未初始化占位 */\nconst notInitializedEmbedding = notInitialized.proxy<EmbeddingOperations>()\n\n/** Reasoning 未初始化占位 */\nconst notInitializedReasoning: ReasoningOperations = {\n run: () => Promise.resolve(notInitialized.result()),\n async* runStream() { throw notInitialized.error() },\n}\n\n/** Retrieval 未初始化占位 */\nconst notInitializedRetrieval: RetrievalOperations = {\n addSource: () => Promise.resolve(notInitialized.result()),\n removeSource: () => Promise.resolve(notInitialized.result()),\n listSources: () => Promise.resolve([]),\n retrieve: () => Promise.resolve(notInitialized.result()),\n}\n\n/** RAG 未初始化占位 */\nconst notInitializedRag: RagOperations = {\n query: () => Promise.resolve(notInitialized.result()),\n async* queryStream() { throw notInitialized.error() },\n}\n\n/** Knowledge 未初始化占位 */\nconst notInitializedKnowledge = notInitialized.proxy<KnowledgeOperations>()\n\n/** Memory 未初始化占位 */\nconst notInitializedMemory = notInitialized.proxy<MemoryOperations>()\n\n/** Persona 未初始化占位 */\nconst notInitializedPersona = notInitialized.proxy<PersonaOperations>()\n\n/**\n * Token 未初始化占位\n *\n * Token 方法返回原始 number 而非 HaiResult,无法通过 proxy 安全拦截。\n * 未初始化时直接抛出异常,避免静默返回 0 导致下游 Token 计算错误。\n */\nconst notInitializedToken: TokenOperations = {\n estimateText: () => { throw notInitialized.error() },\n estimateMessages: () => { throw notInitialized.error() },\n}\n\n/** Summary 未初始化占位 */\nconst notInitializedSummary = notInitialized.proxy<SummaryOperations>()\n\n/** Compress 未初始化占位 */\nconst notInitializedCompress = notInitialized.proxy<CompressOperations>()\n\n/** Context 未初始化占位 */\nconst notInitializedContext: ContextOperations = {\n createManager: () => notInitialized.result(),\n restoreManager: () => Promise.resolve(notInitialized.result()),\n listSessions: () => Promise.resolve(notInitialized.result()),\n renameSession: () => Promise.resolve(notInitialized.result()),\n removeSession: () => Promise.resolve(notInitialized.result()),\n}\n\n/** Rerank 未初始化占位 */\nconst notInitializedRerank = notInitialized.proxy<RerankOperations>()\n\n/** File 未初始化占位 */\nconst notInitializedFile = notInitialized.proxy<FileOperations>()\n\n/**\n * Audio 未初始化占位\n *\n * transcribe / synthesize 返回 NOT_INITIALIZED HaiResult;\n * 流式方法是 async generator,无法返回 HaiResult,只能在迭代时抛出异常。\n */\nconst notInitializedAudio: AudioOperations = {\n transcribe: () => Promise.resolve(notInitialized.result()),\n async* transcribeStream() { throw notInitialized.error() },\n synthesize: () => Promise.resolve(notInitialized.result()),\n async* synthesizeStream() { throw notInitialized.error() },\n getCapabilities: () => notInitialized.result(),\n}\n\n/** A2A 延迟初始化代理(委托给 a2a 模块的 createA2ALazyProxy) */\nconst a2aLazyOperations: A2AOperations = createA2ALazyProxy({\n isInitialized: () => currentConfig !== null,\n getA2AConfig: () => currentA2AConfig ?? null,\n getA2AImpl: () => currentA2AImpl,\n setA2AImpl: (impl) => { currentA2AImpl = impl },\n getStoreProvider: () => currentStoreProvider,\n notInitializedResult: () => notInitialized.result(),\n})\n\n// ─── 内部辅助 ───\n\n/** 重置所有子功能引用并释放 StoreProvider(用于 close 和 init 失败清理) */\nasync function resetAllState(): Promise<void> {\n const storeProvider = currentStoreProvider\n\n currentLLM = null\n currentMCP = null\n currentEmbedding = null\n currentReasoning = null\n currentRetrieval = null\n currentRag = null\n currentKnowledge = null\n currentMemory = null\n currentPersona = null\n currentToken = null\n currentSummary = null\n currentCompress = null\n currentContext = null\n currentRerank = null\n currentFile = null\n currentAudio = null\n currentA2AConfig = undefined\n currentA2AImpl = null\n currentStoreProvider = null\n currentConfig = null\n\n if (storeProvider?.close) {\n try {\n await storeProvider.close()\n }\n catch (error) {\n logger.error('AI store provider close failed', { error })\n }\n }\n}\n\n// ─── 纯函数操作(不依赖初始化) ───\n\nconst toolsOperations: ToolsOperations = {\n define: defineTool,\n createRegistry: createToolRegistry,\n}\n\nconst streamOperations: StreamOperations = {\n createProcessor: createStreamProcessor,\n collect: collectStream,\n createSSEDecoder,\n encodeSSE,\n}\n\n// ─── 服务对象 ───\n\n/**\n * AI 服务对象,统一的 AI 访问入口\n *\n * @example\n * ```ts\n * import { ai } from '@h-ai/ai'\n *\n * // 初始化\n * await ai.init({ llm: { model: 'gpt-4o-mini', apiKey: process.env.HAI_AI_LLM_API_KEY } })\n *\n * // LLM 调用\n * const result = await ai.llm.chat({\n * messages: [{ role: 'user', content: '你好' }],\n * })\n *\n * // 关闭\n * await ai.close()\n * ```\n */\nexport const ai: AIFunctions = {\n async init(config?: AIConfigInput, options?: AIInitOptions): Promise<HaiResult<void>> {\n // 并发初始化防护:避免多次 init 同时执行导致资源泄漏\n if (initInProgress) {\n logger.warn('AI init already in progress, skipping concurrent call')\n return err(HaiAIError.INIT_IN_PROGRESS, aiM('ai_initInProgress'))\n }\n initInProgress = true\n\n try {\n // 关闭旧实例\n if (currentConfig) {\n logger.warn('AI module is already initialized, reinitializing')\n await ai.close()\n }\n\n logger.info('Initializing AI module')\n\n const parseResult = AIConfigSchema.safeParse(config ?? {})\n if (!parseResult.success) {\n logger.error('AI config validation failed', { error: parseResult.error.message })\n return err(\n HaiAIError.CONFIGURATION_ERROR,\n aiM('ai_configError', { params: { error: parseResult.error.message } }),\n parseResult.error,\n )\n }\n const parsed = parseResult.data\n\n // 注入存储 Provider:外部 Provider > 已初始化的 DB Provider > 进程内临时 Provider。\n // 临时 Provider 让 LLM-only 场景零依赖启动;生产持久化仍应显式初始化 reldb + vecdb。\n let storeProvider: AIStoreProvider\n if (options?.storeProvider) {\n storeProvider = options.storeProvider\n }\n else if (isDbStoreAvailable()) {\n storeProvider = createDbStoreProviderFromModules()\n }\n else {\n storeProvider = createMemoryStoreProvider()\n logger.warn('AI is using the ephemeral in-memory store; initialize reldb and vecdb before ai.init() for persistent data')\n }\n currentStoreProvider = storeProvider\n\n // 委托 ai-functions 组装所有子功能(含建表)\n const subs = await createAISubsystems(parsed, {\n storeProvider,\n datapipe,\n })\n\n currentLLM = subs.llm\n currentMCP = subs.mcp\n currentEmbedding = subs.embedding\n currentReasoning = subs.reasoning\n currentRerank = subs.rerank\n currentRetrieval = subs.retrieval\n currentRag = subs.rag\n currentKnowledge = subs.knowledge\n currentMemory = subs.memory\n currentPersona = subs.persona\n currentToken = subs.token\n currentSummary = subs.summary\n currentCompress = subs.compress\n currentContext = subs.context\n currentFile = subs.file\n currentAudio = subs.audio\n\n currentA2AConfig = parsed.a2a\n\n currentConfig = parsed\n logger.info('AI module initialized', { model: parsed.llm?.model })\n return ok(undefined)\n }\n catch (error) {\n // 清理部分赋值的子功能引用,避免 isInitialized=false 但 getter 返回无效实例\n await resetAllState()\n logger.error('AI module initialization failed', { error })\n return err(\n HaiAIError.CONFIGURATION_ERROR,\n aiM('ai_initFailed', {\n params: { error: String(error) },\n }),\n error,\n )\n }\n finally {\n initInProgress = false\n }\n },\n\n get llm(): LLMOperations { return currentLLM ?? notInitializedLLM },\n get mcp(): MCPOperations { return currentMCP ?? notInitializedMCP },\n get tools(): ToolsOperations { return toolsOperations },\n get stream(): StreamOperations { return streamOperations },\n get embedding(): EmbeddingOperations { return currentEmbedding ?? notInitializedEmbedding },\n get reasoning(): ReasoningOperations { return currentReasoning ?? notInitializedReasoning },\n get retrieval(): RetrievalOperations { return currentRetrieval ?? notInitializedRetrieval },\n get rag(): RagOperations { return currentRag ?? notInitializedRag },\n get knowledge(): KnowledgeOperations { return currentKnowledge ?? notInitializedKnowledge },\n get memory(): MemoryOperations { return currentMemory ?? notInitializedMemory },\n get persona(): PersonaOperations { return currentPersona ?? notInitializedPersona },\n get token(): TokenOperations { return currentToken ?? notInitializedToken },\n get summary(): SummaryOperations { return currentSummary ?? notInitializedSummary },\n get compress(): CompressOperations { return currentCompress ?? notInitializedCompress },\n get context(): ContextOperations { return currentContext ?? notInitializedContext },\n get rerank(): RerankOperations { return currentRerank ?? notInitializedRerank },\n get file(): FileOperations { return currentFile ?? notInitializedFile },\n get audio(): AudioOperations { return currentAudio ?? notInitializedAudio },\n get a2a(): A2AOperations { return a2aLazyOperations },\n get config() { return currentConfig ? core.sanitize.sanitizeSensitiveFields(currentConfig) : null },\n get isInitialized() { return currentConfig !== null },\n\n async close(): Promise<void> {\n if (!currentConfig) {\n logger.info('AI module already closed, skipping')\n return\n }\n\n logger.info('Closing AI module')\n await resetAllState()\n logger.info('AI module closed')\n },\n}\n","/**\n * @h-ai/ai — MCP Server 创建与传输层\n *\n * 基于 `@modelcontextprotocol/sdk` 封装,提供便捷的 MCP 服务器创建。\n * @module ai-mcp-server\n */\n\nimport type { McpServerOptions } from './ai-mcp-types.js'\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\n\n// ─── 核心类导出 ───\n\nexport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\n\n// ─── 传输层导出 ───\n\n/** SSE 传输层 */\nexport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js'\n\n/** Stdio 传输层 */\nexport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\n\n/** Streamable HTTP 传输层(推荐) */\nexport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'\n\n// ─── 便捷工厂 ───\n\n/**\n * 创建 MCP 服务器\n *\n * @param options - 服务器选项(名称、版本)\n * @returns McpServer 实例\n *\n * @example\n * ```ts\n * import { createMcpServer, StdioServerTransport } from '@h-ai/ai'\n *\n * const server = createMcpServer({ name: 'my-server', version: '1.0.0' })\n * // 注册工具 / 资源 ...\n * const transport = new StdioServerTransport()\n * await server.connect(transport)\n * ```\n */\nexport function createMcpServer(options: McpServerOptions): McpServer {\n return new McpServer(\n { name: options.name, version: options.version ?? '1.0.0' },\n )\n}\n"]}
|