@paymanai/payman-typescript-ask-sdk 2.0.2 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +190 -148
- package/dist/index.d.ts +190 -148
- package/dist/index.js +698 -692
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +700 -690
- package/dist/index.mjs.map +1 -1
- package/dist/index.native.js +690 -693
- package/dist/index.native.js.map +1 -1
- package/package.json +2 -2
package/dist/index.native.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/generateId.ts","../src/utils/streamingClient.native.ts","../src/utils/eventProcessor.ts","../src/utils/messageStateManager.ts","../src/utils/requestBuilder.ts","../src/utils/userActionClient.ts","../src/utils/chatStore.native.ts","../src/utils/activeStreamStore.ts","../src/utils/v2EventProcessor.ts","../src/utils/ragImageResolver.ts","../src/hooks/useStreamManagerV2.ts","../src/utils/workflowUsersClient.ts","../src/hooks/useChatV2.ts","../src/hooks/useVoice.native.ts"],"names":["createMMKV","useRef","useCallback","getStageParamName","useMemo","useState","useEffect","ExpoSpeechRecognitionModule","useSpeechRecognitionEvent"],"mappings":";;;;;;;;;AAIO,SAAS,UAAA,GAAqB;AAEpC,EAAA,OAAO,sCAAA,CAAuC,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA,KAAM;AACrE,IAAA,MAAM,CAAA,GAAK,IAAA,CAAK,MAAA,EAAO,GAAI,EAAA,GAAM,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,KAAM,GAAA,GAAM,CAAA,GAAK,IAAI,CAAA,GAAO,CAAA;AACtC,IAAA,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,EACrB,CAAC,CAAA;AACF;;;ACuBA,SAAS,gBAAgB,MAAA,EAGvB;AACD,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI,eAAA,GAAkB,EAAA;AAGtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AAErB,IAAA,IAAI,UAAA,EAAY;AACf,MAAA,UAAA,GAAa,KAAA;AACb,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,SAAS,IAAA,EAAM;AAClB,MAAA,UAAA,GAAa,IAAA;AACb,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,CAAC,UAAA,EAAY;AAChC,MAAA,QAAA,GAAW,CAAC,QAAA;AACZ,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,QAAA,EAAU;AACb,MAAA;AAAA,IACD;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AACjB,MAAA,IAAI,eAAe,CAAA,EAAG;AACrB,QAAA,UAAA,GAAa,CAAA;AAAA,MACd;AACA,MAAA,UAAA,EAAA;AAAA,IACD,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACxB,MAAA,UAAA,EAAA;AACA,MAAA,IAAI,eAAe,CAAA,EAAG;AAErB,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,SAAA,CAAU,UAAA,EAAY,IAAI,CAAC,CAAA;AAClD,QAAA,IAAI;AACH,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,UAAA,MAAM,KAAA,GAAQ,MAAA;AACd,UAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,UAAA,eAAA,GAAkB,CAAA;AAAA,QACnB,SAAS,GAAA,EAAK;AACb,UAAA,OAAA,CAAQ,KAAA,CAAM,6BAAA,EAA+B,OAAA,EAAS,GAAG,CAAA;AAAA,QAC1D;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,EAAA,MAAM,YACL,eAAA,IAAmB,CAAA,GAAI,OAAO,SAAA,CAAU,eAAA,GAAkB,CAAC,CAAA,GAAI,MAAA;AAChE,EAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAC5B;AAMA,eAAsB,qBACrB,GAAA,EACA,IAAA,EACA,OAAA,EACA,OAAA,GAAyB,EAAC,EACV;AAChB,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,YAAW,GAAI,OAAA;AAEjD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACvC,IAAA,MAAM,GAAA,GAAM,IAAI,cAAA,EAAe;AAC/B,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,kBAAA,GAAqB,CAAA;AAGzB,IAAA,MAAM,eAAe,MAAM;AAC1B,MAAA,GAAA,CAAI,KAAA,EAAM;AACV,MAAA,OAAA,EAAQ;AAAA,IACT,CAAA;AAEA,IAAA,IAAI,MAAA,EAAQ;AACX,MAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,YAAY,CAAA;AAAA,IAC9C;AAGA,IAAA,GAAA,CAAI,aAAa,MAAM;AACtB,MAAA,IAAI,GAAA,CAAI,UAAA,KAAe,CAAA,IAAK,GAAA,CAAI,eAAe,CAAA,EAAG;AAEjD,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,YAAA,CAAa,SAAA,CAAU,kBAAkB,CAAA;AAC7D,QAAA,kBAAA,GAAqB,IAAI,YAAA,CAAa,MAAA;AAEtC,QAAA,IAAI,OAAA,EAAS;AAEZ,UAAA,MAAA,IAAU,OAAA;AAGV,UAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,gBAAgB,MAAM,CAAA;AACpD,UAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC3B,YAAA,OAAA,GAAU,KAAK,CAAA;AAAA,UAChB;AAEA,UAAA,MAAA,GAAS,SAAA;AAAA,QACV;AAAA,MACD;AAAA,IACD,CAAA;AAEA,IAAA,GAAA,CAAI,SAAS,MAAM;AAClB,MAAA,IAAI,MAAA,EAAQ;AACX,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAAA,MACjD;AAEA,MAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,IAAO,GAAA,CAAI,SAAS,GAAA,EAAK;AAE1C,QAAA,IAAI,MAAA,CAAO,MAAK,EAAG;AAClB,UAAA,MAAM,EAAE,MAAA,EAAO,GAAI,eAAA,CAAgB,MAAM,CAAA;AACzC,UAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC3B,YAAA,OAAA,GAAU,KAAK,CAAA;AAAA,UAChB;AAAA,QACD;AACA,QAAA,UAAA,IAAa;AACb,QAAA,OAAA,EAAQ;AAAA,MACT,CAAA,MAAO;AACN,QAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,IAAI,MAAM,CAAA,EAAA,EAAK,GAAA,CAAI,YAAY,CAAA,CAAE,CAAA;AACjE,QAAA,OAAA,GAAU,KAAK,CAAA;AACf,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACb;AAAA,IACD,CAAA;AAEA,IAAA,GAAA,CAAI,UAAU,MAAM;AACnB,MAAA,IAAI,MAAA,EAAQ;AACX,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAAA,MACjD;AACA,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,eAAe,CAAA;AACvC,MAAA,OAAA,GAAU,KAAK,CAAA;AACf,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA,IACb,CAAA;AAEA,IAAA,GAAA,CAAI,UAAU,MAAM;AACnB,MAAA,IAAI,MAAA,EAAQ;AACX,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAAA,MACjD;AACA,MAAA,OAAA,EAAQ;AAAA,IACT,CAAA;AAGA,IAAA,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,GAAA,EAAK,IAAI,CAAA;AAC1B,IAAA,GAAA,CAAI,gBAAA,CAAiB,gBAAgB,kBAAkB,CAAA;AACvD,IAAA,GAAA,CAAI,gBAAA;AAAA,MACH,QAAA;AAAA,MACA;AAAA,KACD;AAGA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnD,MAAA,GAAA,CAAI,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAAA,IAChC;AAEA,IAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,EAC9B,CAAC,CAAA;AACF;;;AChMO,SAAS,gBAAgB,KAAA,EAA4B;AAC3D,EAAA,IAAI,KAAA,CAAM,OAAA,EAAS,IAAA,EAAK,EAAG;AAC1B,IAAA,OAAO,KAAA,CAAM,QAAQ,IAAA,EAAK;AAAA,EAC3B;AAEA,EAAA,IAAI,KAAA,CAAM,YAAA,EAAc,IAAA,EAAK,EAAG;AAC/B,IAAA,OAAO,KAAA,CAAM,aAAa,IAAA,EAAK;AAAA,EAChC;AAEA,EAAA,MAAM,YAAY,KAAA,CAAM,SAAA;AACxB,EAAA,QAAQ,SAAA;AAAW,IAClB,KAAK,SAAA;AAAA,IACL,KAAK,kBAAA;AACJ,MAAA,OAAO,sBAAA;AAAA,IACR,KAAK,uBAAA;AACJ,MAAA,OAAO,gCAAA;AAAA,IACR,KAAK,wBAAA;AACJ,MAAA,OAAO,mBAAA;AAAA,IACR,KAAK,gBAAA;AACJ,MAAA,OAAO,KAAA,CAAM,UAAA,GACV,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA,QAAA,CAAA,GACnB,sBAAA;AAAA,IACJ,KAAK,iBAAA;AACJ,MAAA,OAAO,KAAA,CAAM,UAAA,GACV,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA,YAAA,CAAA,GACnB,aAAA;AAAA,IACJ,KAAK,kBAAA;AACJ,MAAA,OAAO,KAAA,CAAM,UAAA,GACV,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA,UAAA,CAAA,GACnB,kBAAA;AAAA,IACJ,KAAK,qBAAA;AACJ,MAAA,OAAO,sBAAA;AAAA,IACR,KAAK,sBAAA;AACJ,MAAA,OAAO,kBAAA;AAAA,IACR,KAAK,WAAA;AAAA,IACL,KAAK,oBAAA;AACJ,MAAA,OAAO,iCAAA;AAAA,IACR,KAAK,OAAA;AAAA,IACL,KAAK,gBAAA;AAAA,IACL,KAAK,cAAA;AACJ,MAAA,OAAO,MAAM,YAAA,IAAgB,mBAAA;AAAA,IAC9B,KAAK,sBAAA;AACJ,MAAA,OAAO,6BAAA;AAAA,IACR,KAAK,qBAAA;AACJ,MAAA,OAAO,uBAAA;AAAA,IACR,KAAK,qBAAA;AACJ,MAAA,OAAO,sBAAA;AAAA,IACR,KAAK,qBAAA;AACJ,MAAA,OAAO,iCAAA;AAAA,IACR,KAAK,sBAAA;AACJ,MAAA,OAAO,wBAAA;AAAA,IACR,KAAK,oBAAA;AACJ,MAAA,OAAO,0BAAA;AAAA,IACR,KAAK,oBAAA;AACJ,MAAA,OAAO,qBAAA;AAAA,IACR,KAAK,iBAAA;AACJ,MAAA,OAAO,KAAA,CAAM,UAAA,GACV,CAAA,EAAG,KAAA,CAAM,UAAU,CAAA,YAAA,CAAA,GACnB,aAAA;AAAA,IACJ,KAAK,sBAAA;AACJ,MAAA,OAAO,MAAM,OAAA,IAAW,EAAA;AAAA,IACzB,KAAK,YAAA;AACJ,MAAA,OAAO,EAAA;AAAA,IACR;AACC,MAAA,OAAO,SAAA;AAAA;AAEV;AAEA,SAAS,mBAAmB,IAAA,EAAuB;AAClD,EAAA,OAAO,4BAAA,CAA6B,IAAA,CAAK,IAAI,CAAA,IAC5C,0CAAA,CAA2C,KAAK,IAAI,CAAA,IACpD,uBAAA,CAAwB,IAAA,CAAK,IAAI,CAAA;AACnC;AAOO,SAAS,2BAAA,CACf,WACA,UAAA,EACS;AACT,EAAA,MAAM,GAAA,GAAM,YAAY,IAAA,EAAK;AAC7B,EAAA,MAAM,UAAU,GAAA,IAAO,CAAC,kBAAA,CAAmB,GAAG,IAAI,GAAA,GAAM,EAAA;AAExD,EAAA,QAAQ,SAAA;AAAW,IAClB,KAAK,sBAAA;AACJ,MAAA,OAAO,GAAA,IAAO,6BAAA;AAAA,IACf,KAAK,qBAAA;AACJ,MAAA,OAAO,OAAA,IAAW,uBAAA;AAAA,IACnB,KAAK,qBAAA;AACJ,MAAA,OAAO,OAAA,IAAW,iCAAA;AAAA,IACnB,KAAK,sBAAA;AACJ,MAAA,OAAO,OAAA,IAAW,wBAAA;AAAA,IACnB,KAAK,qBAAA;AACJ,MAAA,OAAO,OAAA,IAAW,sBAAA;AAAA,IACnB,KAAK,oBAAA;AACJ,MAAA,OAAO,OAAA,IAAW,0BAAA;AAAA,IACnB,KAAK,oBAAA;AACJ,MAAA,OAAO,OAAA,IAAW,qBAAA;AAAA,IACnB;AACC,MAAA,OAAO,WAAW,GAAA,IAAO,SAAA;AAAA;AAE5B;AAKO,SAAS,6BAA6B,GAAA,EAAqB;AACjE,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,EAAA,IAAI,CAAC,GAAG,OAAO,EAAA;AACf,EAAA,IAAI,gDAAA,CAAiD,IAAA,CAAK,CAAC,CAAA,EAAG;AAC7D,IAAA,OAAO,EAAA;AAAA,EACR;AACA,EAAA,OAAO,CAAA;AACR;AAKO,SAAS,uBAAuB,QAAA,EAA2B;AAEjE,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AACjC,IAAA,OAAO,QAAA;AAAA,EACR;AAGA,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,IAAA,EAAM;AACtD,IAAA,MAAM,IAAA,GAAO,QAAA;AAGb,IAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,OAAO,IAAA,CAAK,SAAS,QAAA,EAAU;AACpD,MAAA,OAAO,IAAA,CAAK,IAAA;AAAA,IACb;AACA,IAAA,IAAI,SAAA,IAAa,IAAA,IAAQ,OAAO,IAAA,CAAK,YAAY,QAAA,EAAU;AAC1D,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IACb;AACA,IAAA,IAAI,SAAA,IAAa,IAAA,IAAQ,OAAO,IAAA,CAAK,YAAY,QAAA,EAAU;AAC1D,MAAA,OAAO,IAAA,CAAK,OAAA;AAAA,IACb;AACA,IAAA,IAAI,QAAA,IAAY,IAAA,IAAQ,OAAO,IAAA,CAAK,WAAW,QAAA,EAAU;AACxD,MAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IACb;AAGA,IAAA,OAAO,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,EAAA;AACR;;;AC3IO,SAAS,sBAAA,CACf,OACA,eAAA,EACS;AACT,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,SAAA,GAAY,SAAS,EAAC;AAK5B,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACnD,EAAA,IAAI,QAAA,EAAU;AACb,IAAA,MAAM,wBAAwB,SAAA,CAAU,IAAA;AAAA,MACvC,CAAC,CAAA,KAAM,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,aAAa,IAAA;AAAK,KAC9C;AAEA,IAAA,IAAI,CAAC,qBAAA,EAAuB;AAC3B,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IACpB,CAAA,MAAO;AACN,MAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,YAAA,CAAc,IAAA,EAAK;AAC1D,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AACrC,MAAA,IAAI,MAAM,CAAA,EAAG;AACZ,QAAA,MAAM,QAAA,GAAW,SAAS,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC9D,QAAA,IAAI,QAAA,EAAU;AACb,UAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,UAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,QACpB;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC7B,IAAA,QAAQ,KAAK,SAAA;AAAW,MACvB,KAAK,uBAAA;AACJ,QAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,QAAA,IAAI,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,KAAK,OAAO,CAAA;AACzC,QAAA;AAAA,MAED,KAAK,SAAA,EAAW;AACf,QAAA,MAAM,MAAA,GAAS,4BAAA,CAA6B,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA;AAC9D,QAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,QAAA,IAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAC7B,QAAA;AAAA,MACD;AAAA,MAEA,KAAK,gBAAA,EAAkB;AACtB,QAAA,IAAI,KAAA,GAAQ,KAAK,OAAA,IAAW,YAAA;AAC5B,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,oBAAoB,CAAA;AAChD,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,wBAAwB,CAAA;AACrD,QAAA,IAAI,OAAA,EAAS,KAAA,GAAQ,OAAA,CAAQ,CAAC,CAAA;AAAA,aAAA,IACrB,QAAA,EAAU,KAAA,GAAQ,QAAA,CAAS,CAAC,CAAA;AACrC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,CAAI,CAAA;AACzB,QAAA,IAAI,IAAA,CAAK,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,KAAK,YAAY,CAAA;AACnD,QAAA;AAAA,MACD;AAAA,MAEA,KAAK,iBAAA,EAAmB;AACvB,QAAA,IAAI,IAAA,CAAK,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,KAAK,YAAY,CAAA;AAAA,aAAA,IAC1C,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,KAAK,OAAO,CAAA;AAC9C,QAAA;AAAA,MACD;AAAA,MAEA,KAAK,qBAAA;AACJ,QAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAC3B,QAAA,IAAI,IAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,KAAK,OAAO,CAAA;AACzC,QAAA;AAAA,MAED,KAAK,sBAAA;AACJ,QAAA,KAAA,CAAM,KAAK,2BAA2B,CAAA;AACtC,QAAA,IAAI,KAAK,OAAA,EAAS;AACjB,UAAA,KAAA,CAAM,KAAK,2BAAA,CAA4B,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,QACrE;AACA,QAAA;AAAA,MAED,KAAK,qBAAA;AACJ,QAAA,KAAA,CAAM,IAAA,CAAK,UAAK,2BAAA,CAA4B,IAAA,CAAK,WAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AAC3E,QAAA;AAAA,MAED,KAAK,sBAAA;AACJ,QAAA,KAAA,CAAM,KAAK,2BAAA,CAA4B,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,OAAO,CAAC,CAAA;AACpE,QAAA;AAAA,MAED,KAAK,qBAAA;AACJ,QAAA,KAAA,CAAM,IAAA,CAAK,UAAK,2BAAA,CAA4B,IAAA,CAAK,WAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AAC3E,QAAA;AAAA,MAED,KAAK,qBAAA;AACJ,QAAA,KAAA,CAAM,IAAA,CAAK,UAAK,2BAAA,CAA4B,IAAA,CAAK,WAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AAC3E,QAAA;AAAA,MAED,KAAK,oBAAA;AACJ,QAAA,KAAA,CAAM,KAAK,2BAAA,CAA4B,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,OAAO,CAAC,CAAA;AACpE,QAAA;AAAA,MAED,KAAK,oBAAA;AACJ,QAAA,KAAA,CAAM,IAAA,CAAK,UAAK,2BAAA,CAA4B,IAAA,CAAK,WAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AAC3E,QAAA;AAGA;AACF,EACD;AAEA,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,eAAA;AAC9C;AAgIO,SAAS,4BAAA,CACf,OACA,cAAA,EAC0B;AAC1B,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACxC,IAAA,IAAI,IAAA,CAAK,WAAW,aAAA,EAAe;AAClC,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAmB;AAAA,IAC9C;AACA,IAAA,OAAO,IAAA;AAAA,EACR,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACN,WAAA,EAAa,KAAA;AAAA,IACb,WAAA,EAAa,IAAA;AAAA,IACb,KAAA,EAAO,YAAA;AAAA,IACP,sBAAA,EAAwB,MAAA;AAAA;AAAA,IAExB,gBAAgB,cAAA,IAAkB;AAAA,GACnC;AACD;;;ACzQO,SAAS,gBAAA,CACf,MAAA,EACA,WAAA,EACA,SAAA,EAC0B;AAC1B,EAAA,MAAM,KAAA,GAAQ,OAAO,OAAA,EAAS,KAAA;AAC9B,EAAA,MAAM,iBAAA,GACL,KAAA,EAAO,UAAA,IAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAE,MAAA,GAAS,CAAA,GACzD,KAAA,CAAM,UAAA,GACN,MAAA;AAEJ,EAAA,OAAO;AAAA,IACN,YAAA,EAAc,OAAO,QAAA,CAAS,IAAA;AAAA,IAC9B,SAAA,EAAW,WAAA;AAAA,IACX,SAAA;AAAA,IACA,cAAA,EAAgB,OAAO,EAAA,IAAM,EAAA;AAAA,IAC7B,iBAAA,EAAmB,OAAO,IAAA,IAAQ,EAAA;AAAA,IAClC,iBAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACR,cAAA,EAAgB,IAAA,CAAK,cAAA,EAAe,CAAE,iBAAgB,CAAE;AAAA;AACzD,GACD;AACD;AAEA,SAAS,kBAAkB,MAAA,EAAgC;AAC1D,EAAA,OAAO,MAAA,CAAO,IAAI,eAAA,IAAmB,OAAA;AACtC;AAEA,SAAS,SAAS,MAAA,EAAgC;AACjD,EAAA,OAAO,MAAA,CAAO,SAAS,KAAA,IAAS,KAAA;AACjC;AAKO,SAAS,kBAAkB,MAAA,EAAgC;AACjE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,cAAA,IAAkB,2BAAA;AAC9C,EAAA,MAAM,WAAA,GAAc,IAAI,eAAA,CAAgB;AAAA,IACvC,CAAC,iBAAA,CAAkB,MAAM,CAAC,GAAG,SAAS,MAAM;AAAA,GAC5C,CAAA;AAED,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,OAAA,KAAY,MAAA,EAAW;AAC1C,IAAA,WAAA,CAAY,OAAO,iBAAA,EAAmB,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA,EACtE;AAEA,EAAA,OAAO,CAAA,EAAG,OAAO,GAAA,CAAI,OAAO,GAAG,QAAQ,CAAA,CAAA,EAAI,WAAA,CAAY,QAAA,EAAU,CAAA,CAAA;AAClE;AAEA,SAAS,eAAe,MAAA,EAAgC;AACvD,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,cAAA,IAAkB,2BAAA;AAC9C,EAAA,MAAM,CAAC,YAAY,CAAA,GAAI,QAAA,CAAS,MAAM,GAAG,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAClD,EAAA,OAAO,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,GACjC,UAAA,CAAW,MAAM,CAAA,EAAG,CAAC,SAAA,CAAU,MAAM,CAAA,GACrC,UAAA;AACJ;AAKO,SAAS,kBAAA,CACf,MAAA,EACA,YAAA,EACA,MAAA,EACS;AACT,EAAA,MAAM,QAAA,GAAW,eAAe,MAAM,CAAA;AACtC,EAAA,MAAM,mBAAA,GAAsB,mBAAmB,YAAY,CAAA;AAC3D,EAAA,OAAO,CAAA,EAAG,OAAO,GAAA,CAAI,OAAO,GAAG,QAAQ,CAAA,aAAA,EAAgB,mBAAmB,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACrF;AAKO,SAAS,sBAAsB,MAAA,EAAgC;AACrE,EAAA,IAAI,MAAA,CAAO,IAAI,qBAAA,EAAuB;AACrC,IAAA,OAAO,GAAG,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG,MAAA,CAAO,IAAI,qBAAqB,CAAA,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,GAAG,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG,cAAA,CAAe,MAAM,CAAC,CAAA,mBAAA,CAAA;AACtD;AAKO,SAAS,oBAAoB,MAAA,EAAgD;AACnF,EAAA,MAAM,OAAA,GAAkC,EAAE,GAAG,MAAA,CAAO,IAAI,OAAA,EAAQ;AAChE,EAAA,IAAI,MAAA,CAAO,IAAI,SAAA,EAAW;AACzB,IAAA,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,OAAA;AACR;AAMO,SAAS,cAAc,MAAA,EAAgC;AAC7D,EAAA,OAAO;AAAA,IACN,MAAA,CAAO,SAAS,MAAA,IAAU,EAAA;AAAA,IAC1B,MAAA,CAAO,SAAS,EAAA,IAAM,EAAA;AAAA,IACtB,MAAA,CAAO,SAAS,OAAA,IAAW,EAAA;AAAA,IAC3B,MAAA,CAAO,SAAS,KAAA,IAAS;AAAA,GAC1B,CAAE,KAAK,GAAG,CAAA;AACX;;;AC/FA,eAAe,qBAAA,CACd,MAAA,EACA,YAAA,EACA,MAAA,EACA,IAAA,EAC8B;AAC9B,EAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,MAAA,EAAQ,YAAA,EAAc,MAAM,CAAA;AAC3D,EAAA,MAAM,WAAA,GAAc,oBAAoB,MAAM,CAAA;AAC9C,EAAA,MAAM,UAAU,IAAA,KAAS,MAAA;AACzB,EAAA,MAAM,UAAU,OAAA,GACb,EAAE,gBAAgB,kBAAA,EAAoB,GAAG,aAAY,GACrD,WAAA;AAEH,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IACjC,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA;AAAA,IACA,IAAA,EAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI;AAAA,GACvC,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACjB,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAC5B;AAKA,eAAsB,gBAAA,CACrB,MAAA,EACA,YAAA,EACA,IAAA,EAC8B;AAC9B,EAAA,OAAO,qBAAA,CAAsB,MAAA,EAAQ,YAAA,EAAc,QAAA,EAAU,IAAI,CAAA;AAClE;AAKA,eAAsB,gBAAA,CACrB,QACA,YAAA,EAC8B;AAC9B,EAAA,OAAO,qBAAA,CAAsB,MAAA,EAAQ,YAAA,EAAc,QAAQ,CAAA;AAC5D;AAKA,eAAsB,gBAAA,CACrB,QACA,YAAA,EAC8B;AAC9B,EAAA,OAAO,qBAAA,CAAsB,MAAA,EAAQ,YAAA,EAAc,QAAQ,CAAA;AAC5D;ACjEA,IAAM,OAAA,GAAUA,0BAAA,CAAW,EAAE,EAAA,EAAI,qBAAqB,CAAA;AAE/C,IAAM,SAAA,GAAY;AAAA,EACxB,IAAI,GAAA,EAA+B;AAClC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,SAAA,CAAU,GAAG,CAAA;AACjC,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,IAAA,IAAI;AACH,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACtB,CAAA,CAAA,MAAQ;AACP,MAAA,OAAO,EAAC;AAAA,IACT;AAAA,EACD,CAAA;AAAA,EACA,GAAA,CAAI,KAAa,QAAA,EAAkC;AAClD,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,EAC1C,CAAA;AAAA,EACA,OAAO,GAAA,EAAmB;AACzB,IAAA,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,EACnB;AACD,CAAA;;;ACRA,IAAM,OAAA,uBAAc,GAAA,EAAyB;AAEtC,IAAM,iBAAA,GAAoB;AAAA,EAChC,IAAI,GAAA,EAAsB;AACzB,IAAA,OAAO,OAAA,CAAQ,IAAI,GAAG,CAAA;AAAA,EACvB,CAAA;AAAA,EAEA,IAAI,GAAA,EAAwE;AAC3E,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,OAAO,EAAE,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,EAC/D,CAAA;AAAA;AAAA,EAGA,KAAA,CAAM,GAAA,EAAa,eAAA,EAAkC,eAAA,EAAyC;AAC7F,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAChC,IAAA,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,MAChB,QAAA,EAAU,eAAA;AAAA,MACV,SAAA,EAAW,IAAA;AAAA,MACX,eAAA;AAAA,MACA,SAAA,EAAW,QAAA,EAAU,SAAA,oBAAa,IAAI,GAAA;AAAI,KAC1C,CAAA;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,aAAA,CACC,KACA,OAAA,EACO;AACP,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,OAAO,OAAO,OAAA,KAAY,aAAa,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA,GAAI,OAAA;AACvE,IAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,IAAA,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,EACxD,CAAA;AAAA,EAEA,UAAA,CAAW,KAAa,OAAA,EAAwB;AAC/C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,KAAA,CAAM,SAAA,GAAY,OAAA;AAClB,IAAA,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAC,CAAA,KAAM,EAAE,KAAA,CAAM,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,EAC1D,CAAA;AAAA;AAAA,EAGA,SAAS,GAAA,EAAmB;AAC3B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,KAAA,CAAM,SAAA,GAAY,KAAA;AAClB,IAAA,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAC,CAAA,KAAM,EAAE,KAAA,CAAM,QAAA,EAAU,KAAK,CAAC,CAAA;AACvD,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,WAAW,CAAA;AAC1D,IAAA,IAAI,OAAO,MAAA,GAAS,CAAA,EAAG,SAAA,CAAU,GAAA,CAAI,KAAK,MAAM,CAAA;AAChD,IAAA,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,EACnB,CAAA;AAAA;AAAA,EAGA,SAAA,CAAU,KAAa,QAAA,EAAgC;AACtD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,MAAM;AAAA,IAAC,CAAA;AAC1B,IAAA,KAAA,CAAM,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC5B,IAAA,OAAO,MAAM;AACZ,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAC5C,CAAA;AAAA,EACD,CAAA;AAAA;AAAA,EAGA,MAAM,GAAA,EAAmB;AACxB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,KAAA,CAAM,gBAAgB,KAAA,EAAM;AAC5B,IAAA,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,EACnB;AACD,CAAA;;;ACzDA,SAAS,YAAA,CAAa,OAAoB,KAAA,EAAuB;AAChE,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AACzB,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,MAAK,GAAI,EAAA;AACnD;AAEA,SAAS,uBAAuB,KAAA,EAA6B;AAC5D,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,KAAA,EAAO,YAAY,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,EAAO,UAAU,CAAA;AAC/C,EAAA,OAAO,OAAA,CAAQ,UAAA,IAAc,QAAA,IAAY,UAAA,KAAe,QAAQ,CAAA;AACjE;AAEA,SAAS,iBAAA,CAAkB,OAA8B,MAAA,EAAgB;AACxE,EAAA,KAAA,CAAM,qBAAA,IAAA,CAA0B,KAAA,CAAM,qBAAA,GAAwB,IAAA,GAAO,EAAA,IAAM,MAAA;AAC5E;AAEA,SAAS,iBAAA,CAAkB,OAA8B,MAAA,EAAgB;AACxE,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,EAAA,IAAI,CAAC,OAAA,EAAS;AACd,EAAA,KAAA,CAAM,qBAAA,IAAA,CAA0B,KAAA,CAAM,qBAAA,GAAwB,IAAA,GAAO,EAAA,IAAM,OAAA;AAC5E;AAEA,SAAS,eAAA,CAAgB,KAAA,EAA8B,MAAA,EAAgB,MAAA,EAAgB;AACtF,EAAA,KAAA,CAAM,0BAA0B,KAAA,CAAM,qBAAA,GAAwB,IAAA,GAAO,EAAA,IAAM,SAAS,IAAA,GAAO,MAAA;AAC5F;AAEA,SAAS,kBAAA,CAAmB,OAA8B,IAAA,EAAc;AACvE,EAAA,KAAA,CAAM,qBAAA,IAAyB,IAAA;AAChC;AAEA,SAAS,2BAA2B,KAAA,EAA8B;AACjE,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3C,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,KAAW,aAAA,EAAe;AACtC,MAAA,KAAA,CAAM,CAAC,EAAE,MAAA,GAAS,WAAA;AAClB,MAAA;AAAA,IACD;AAAA,EACD;AACD;AAEO,SAAS,oBAAA,GAA8C;AAC7D,EAAA,OAAO;AAAA,IACN,qBAAA,EAAuB,EAAA;AAAA,IACvB,aAAA,EAAe,EAAA;AAAA,IACf,aAAA,EAAe,EAAA;AAAA,IACf,aAAA,EAAe,EAAA;AAAA,IACf,SAAA,EAAW,MAAA;AAAA,IACX,WAAA,EAAa,MAAA;AAAA,IACb,QAAA,EAAU,KAAA;AAAA,IACV,YAAA,EAAc,EAAA;AAAA,IACd,iBAAA,EAAmB,MAAA;AAAA,IACnB,iBAAA,EAAmB,KAAA;AAAA,IACnB,gBAAA,EAAkB,MAAA;AAAA,IAClB,SAAA,EAAW,MAAA;AAAA,IACX,OAAO,EAAC;AAAA,IACR,WAAA,EAAa,CAAA;AAAA,IACb,sBAAA,EAAwB;AAAA,GACzB;AACD;AAEO,SAAS,oBAAA,CACf,OACA,KAAA,EACwB;AACxB,EAAA,MAAM,YAAY,KAAA,CAAM,SAAA;AAExB,EAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,SAAA,CAAU,WAAA,OAAkB,YAAA,EAAc;AAC9E,IAAA,IAAI,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,WAAA;AACjD,IAAA,IAAI,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,SAAA;AAC7C,IAAA,OAAO,KAAA;AAAA,EACR;AAEA,EAAA,IAAI,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,WAAA;AACjD,EAAA,IAAI,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,SAAA;AAE7C,EAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AAErC,EAAA,QAAQ,SAAA;AAAW,IAClB,KAAK,kBAAA;AAAA,IACL,KAAK,SAAA;AACJ,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IAED,KAAK,iBAAA,EAAmB;AACvB,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,KAAA,EAAO,YAAY,CAAA,IAAK,QAAA;AACpD,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,KAAA,EAAO,SAAS,CAAA,IAAK,aAAA;AAC9C,MAAA,MAAM,UAAA,GAAa,uBAAuB,KAAK,CAAA;AAE/C,MAAA,IAAI,MAAA,KAAW,MAAM,aAAA,EAAe;AACnC,QAAA,KAAA,CAAM,aAAA,GAAgB,MAAA;AACtB,QAAA,IAAI,UAAA,IAAc,GAAA,IAAO,GAAA,KAAQ,MAAA,EAAQ;AACxC,UAAA,eAAA,CAAgB,KAAA,EAAO,CAAA,EAAA,EAAK,MAAM,CAAA,EAAA,CAAA,EAAM,GAAG,CAAA;AAAA,QAC5C,WAAW,UAAA,EAAY;AACtB,UAAA,iBAAA,CAAkB,KAAA,EAAO,CAAA,EAAA,EAAK,MAAM,CAAA,EAAA,CAAI,CAAA;AAAA,QACzC,CAAA,MAAA,IAAkB,GAAA,KAAQ,aAAA,EAAe;AACxC,UAAA,iBAAA,CAAkB,OAAO,GAAG,CAAA;AAAA,QAC7B;AAAA,MACD,CAAA,MAAA,IAAW,CAAQ,UAAA,IAAc,GAAA,KAAQ,aAAA,CAAA,EAAgB;AACxD,QAAA,kBAAA,CAAmB,KAAA,EAAO,OAAO,GAAG,CAAA;AAAA,MACrC;AAGA,MAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA;AACtF,MAAA,IAAI,cAAA,EAAgB;AACnB,QAAA,cAAA,CAAe,YAAA,GAAe,EAAA;AAC9B,QAAA,cAAA,CAAe,UAAA,GAAa,IAAA;AAAA,MAC7B;AAEA,MAAA,KAAA,CAAM,aAAA,GAAgB,iBAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,sBAAA,EAAwB;AAC5B,MAAA,MAAM,GAAA,GAAO,MAAM,OAAA,IAAsB,EAAA;AACzC,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,IAAI,KAAA,CAAM,kBAAkB,iBAAA,EAAmB;AAC9C,QAAA,kBAAA,CAAmB,KAAA,EAAO,OAAO,GAAG,CAAA;AAAA,MACrC,CAAA,MAAO;AACN,QAAA,kBAAA,CAAmB,OAAO,GAAG,CAAA;AAAA,MAC9B;AAEA,MAAA,MAAM,YAAA,GAAe,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,CAAA;AACtE,MAAA,IAAI,YAAA,EAAc;AACjB,QAAA,YAAA,CAAa,YAAA,GAAA,CAAgB,YAAA,CAAa,YAAA,IAAgB,EAAA,IAAM,GAAA;AAAA,MACjE;AAEA,MAAA,KAAA,CAAM,aAAA,GAAgB,sBAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,uBAAA,EAAyB;AAC7B,MAAA,eAAA,CAAgB,KAAA,EAAO,cAAA,EAAiB,KAAA,CAAM,OAAA,IAAsB,+BAA+B,CAAA;AAEnG,MAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAC1C,MAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,MAAA;AAAA,QACJ,SAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,aAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,KAAA,CAAM,sBAAA,GAAyB,MAAA;AAC/B,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,wBAAA,EAA0B;AAC9B,MAAA,MAAM,aAAA,GAAgB,6BAA6B,OAAO,CAAA;AAC1D,MAAA,IAAI,aAAA,EAAe;AAClB,QAAA,eAAA,CAAgB,KAAA,EAAO,eAAe,aAAa,CAAA;AAAA,MACpD,CAAA,MAAO;AACN,QAAA,iBAAA,CAAkB,OAAO,aAAa,CAAA;AAAA,MACvC;AAEA,MAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAAA,QAC/B,SAAA,EAAW,SAAA;AAAA,QACX,OAAA,EAAS,aAAA;AAAA,QACT,MAAA,EAAQ,WAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA;AAAI,OACpB,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,SAAA,KAAc,uBAAA,IAA2B,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA;AACxG,MAAA,IAAI,IAAA,EAAM;AACT,QAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,QAAA,IAAI,KAAA,CAAM,SAAA,EAAW,IAAA,CAAK,SAAA,GAAY,KAAA,CAAM,SAAA;AAC5C,QAAA,IAAI,IAAA,CAAK,EAAA,KAAO,KAAA,CAAM,sBAAA,QAA8B,sBAAA,GAAyB,MAAA;AAAA,MAC9E;AACA,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,gBAAA,EAAkB;AACtB,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,KAAA,EAAO,YAAY,CAAA,IAAK,QAAA;AACpD,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,KAAA,EAAO,SAAS,CAAA,IAAK,aAAA;AAC9C,MAAA,MAAM,UAAA,GAAa,uBAAuB,KAAK,CAAA;AAC/C,MAAA,KAAA,CAAM,aAAA,GAAgB,MAAA;AAEtB,MAAA,IAAI,UAAA,IAAc,QAAQ,MAAA,EAAQ;AACjC,QAAA,eAAA,CAAgB,KAAA,EAAO,CAAA,EAAA,EAAK,MAAM,CAAA,EAAA,CAAA,EAAM,GAAG,CAAA;AAAA,MAC5C,WAAW,UAAA,EAAY;AACtB,QAAA,iBAAA,CAAkB,KAAA,EAAO,CAAA,EAAA,EAAK,MAAM,CAAA,EAAA,CAAI,CAAA;AAAA,MACzC,CAAA,MAAO;AACN,QAAA,iBAAA,CAAkB,OAAO,GAAG,CAAA;AAAA,MAC7B;AAEA,MAAA,MAAM,eAAe,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,UAAU,CAAA;AACvD,MAAA,IAAI,YAAA,eAA2B,UAAA,GAAa,KAAA;AAE5C,MAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAC1C,MAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,MAAA;AAAA,QACJ,SAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,aAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,KAAA,CAAM,sBAAA,GAAyB,MAAA;AAC/B,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,kBAAA,EAAoB;AACxB,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,SAAA,KAAc,gBAAA,IAAoB,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA;AACvG,MAAA,IAAI,UAAA,EAAY;AACf,QAAA,UAAA,CAAW,MAAA,GAAS,WAAA;AACpB,QAAA,UAAA,CAAW,UAAA,GAAa,KAAA;AACxB,QAAA,IAAI,KAAA,CAAM,SAAA,EAAW,UAAA,CAAW,SAAA,GAAY,KAAA,CAAM,SAAA;AAClD,QAAA,IAAI,UAAA,CAAW,EAAA,KAAO,KAAA,CAAM,sBAAA,QAA8B,sBAAA,GAAyB,MAAA;AAAA,MACpF;AACA,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,qBAAA,EAAuB;AAC3B,MAAA,eAAA,CAAgB,KAAA,EAAO,gBAAA,EAAmB,KAAA,CAAM,OAAA,IAAsB,uBAAuB,CAAA;AAE7F,MAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAC1C,MAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,MAAA;AAAA,QACJ,SAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,aAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,KAAA,CAAM,sBAAA,GAAyB,MAAA;AAC/B,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,sBAAA,EAAwB;AAC5B,MAAA,kBAAA,CAAmB,KAAA,EAAO,IAAA,IAAS,KAAA,CAAM,OAAA,IAAsB,gBAAA,CAAiB,CAAA;AAEhF,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,SAAA,KAAc,qBAAA,IAAyB,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA;AACtG,MAAA,IAAI,IAAA,EAAM;AACT,QAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,QAAA,IAAI,KAAA,CAAM,SAAA,EAAW,IAAA,CAAK,SAAA,GAAY,KAAA,CAAM,SAAA;AAC5C,QAAA,IAAI,IAAA,CAAK,EAAA,KAAO,KAAA,CAAM,sBAAA,QAA8B,sBAAA,GAAyB,MAAA;AAAA,MAC9E;AACA,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,oBAAA;AAAA,IACL,KAAK,WAAA,EAAa;AACjB,MAAA,IAAI,OAAA,GAAU,sBAAA,CAAuB,KAAA,CAAM,QAAQ,CAAA;AACnD,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,OAAO,MAAM,KAAA,KAAU,QAAA,GAAY,MAAM,KAAA,GAAoC,IAAA;AAC1G,MAAA,IAAI,CAAC,OAAA,IAAW,KAAA,EAAO,eAAe,OAAO,KAAA,CAAM,gBAAgB,QAAA,EAAU;AAC5E,QAAA,OAAA,GAAU,KAAA,CAAM,WAAA;AAAA,MACjB;AACA,MAAA,IAAI,CAAC,OAAA,IAAW,KAAA,EAAO,cAAc,OAAO,KAAA,CAAM,eAAe,QAAA,EAAU;AAC1E,QAAA,MAAM,MAAM,KAAA,CAAM,UAAA;AAClB,QAAA,IAAI,OAAO,GAAA,CAAI,QAAA,KAAa,QAAA,YAAoB,GAAA,CAAI,QAAA;AAAA,aAC/C,OAAA,GAAU,sBAAA,CAAuB,GAAA,CAAI,QAAQ,CAAA;AAAA,MACnD;AAEA,MAAA,IAAI,OAAA,EAAS;AACZ,QAAA,KAAA,CAAM,aAAA,GAAgB,OAAA;AACtB,QAAA,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,KAAA;AAC1C,QAAA,KAAA,CAAM,QAAA,GAAW,KAAA;AACjB,QAAA,KAAA,CAAM,YAAA,GAAe,EAAA;AAAA,MACtB,CAAA,MAAO;AACN,QAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,QAAA,KAAA,CAAM,YAAA,GAAe,iBAAA;AAAA,MACtB;AAEA,MAAA,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,IAAA,KAAQ;AAC3B,QAAA,IAAI,IAAA,CAAK,WAAW,aAAA,EAAe;AAClC,UAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,UAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,QACnB;AAAA,MACD,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,sBAAA,EAAwB;AAC5B,MAAA,0BAAA,CAA2B,MAAM,KAAK,CAAA;AAEtC,MAAA,IAAI,MAAM,iBAAA,EAAmB;AAC5B,QAAA,KAAA,CAAM,iBAAA,GAAoB;AAAA,UACzB,YAAA,EAAc,MAAM,iBAAA,CAAkB,YAAA;AAAA,UACtC,cAAA,EAAgB,MAAM,iBAAA,CAAkB,cAAA;AAAA,UACxC,OAAA,EAAS,MAAM,iBAAA,CAAkB,OAAA;AAAA,UACjC,eAAA,EAAiB,MAAM,iBAAA,CAAkB,eAAA;AAAA,UACzC,QAAA,EAAU,MAAM,iBAAA,CAAkB;AAAA,SACnC;AAAA,MACD;AACA,MAAA,KAAA,CAAM,iBAAA,GAAoB,IAAA;AAE1B,MAAA,MAAM,MAAM,KAAA,CAAM,iBAAA;AAClB,MAAA,MAAM,cAAA,GAAiB,2BAAA;AAAA,QACtB,SAAA;AAAA,QACC,KAAK,OAAA,IAAkC;AAAA,OACzC;AACA,MAAA,IAAI,GAAA,EAAK;AACR,QAAA,eAAA,CAAgB,KAAA,EAAO,6BAA6B,cAAc,CAAA;AAAA,MACnE;AAEA,MAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAC1C,MAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,MAAA;AAAA,QACJ,SAAA;AAAA,QACA,OAAA,EAAS,cAAA;AAAA,QACT,MAAA,EAAQ,aAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,KAAA,CAAM,sBAAA,GAAyB,MAAA;AAC/B,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,qBAAA,EAAuB;AAC3B,MAAA,MAAM,cAAA,GAAiB,2BAAA,CAA4B,SAAA,EAAW,KAAA,CAAM,OAA6B,CAAA;AACjG,MAAA,kBAAA,CAAmB,KAAA,EAAO,cAAS,cAAc,CAAA;AACjD,MAAA,0BAAA,CAA2B,MAAM,KAAK,CAAA;AACtC,MAAA,KAAA,CAAM,iBAAA,GAAoB,MAAA;AAC1B,MAAA,KAAA,CAAM,iBAAA,GAAoB,KAAA;AAC1B,MAAA,KAAA,CAAM,gBAAA,GAAmB,UAAA;AAEzB,MAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAC1C,MAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,MAAA;AAAA,QACJ,SAAA;AAAA,QACA,OAAA,EAAS,cAAA;AAAA,QACT,MAAA,EAAQ,WAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,qBAAA,EAAuB;AAC3B,MAAA,MAAM,cAAA,GAAiB,2BAAA,CAA4B,SAAA,EAAW,KAAA,CAAM,OAA6B,CAAA;AACjG,MAAA,kBAAA,CAAmB,KAAA,EAAO,cAAS,cAAc,CAAA;AACjD,MAAA,0BAAA,CAA2B,MAAM,KAAK,CAAA;AAEtC,MAAA,MAAM,WAAA,GAAc,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAC/C,MAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,WAAA;AAAA,QACJ,SAAA;AAAA,QACA,OAAA,EAAS,cAAA;AAAA,QACT,MAAA,EAAQ,OAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,KAAA,CAAM;AAAA,OACjB,CAAA;AAED,MAAA,MAAM,WAAA,GAAc,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAC/C,MAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,WAAA;AAAA,QACJ,SAAA,EAAW,sBAAA;AAAA,QACX,OAAA,EAAS,6BAAA;AAAA,QACT,MAAA,EAAQ,aAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA;AAAI,OACpB,CAAA;AACD,MAAA,KAAA,CAAM,sBAAA,GAAyB,WAAA;AAC/B,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,sBAAA,EAAwB;AAC5B,MAAA,MAAM,cAAA,GAAiB,2BAAA,CAA4B,SAAA,EAAW,KAAA,CAAM,OAA6B,CAAA;AACjG,MAAA,kBAAA,CAAmB,KAAA,EAAO,OAAO,cAAc,CAAA;AAC/C,MAAA,0BAAA,CAA2B,MAAM,KAAK,CAAA;AACtC,MAAA,KAAA,CAAM,iBAAA,GAAoB,MAAA;AAC1B,MAAA,KAAA,CAAM,iBAAA,GAAoB,KAAA;AAC1B,MAAA,KAAA,CAAM,gBAAA,GAAmB,UAAA;AAEzB,MAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAC1C,MAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,MAAA;AAAA,QACJ,SAAA;AAAA,QACA,OAAA,EAAS,cAAA;AAAA,QACT,MAAA,EAAQ,WAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,qBAAA,EAAuB;AAC3B,MAAA,MAAM,cAAA,GAAiB,2BAAA,CAA4B,SAAA,EAAW,KAAA,CAAM,OAA6B,CAAA;AACjG,MAAA,kBAAA,CAAmB,KAAA,EAAO,cAAS,cAAc,CAAA;AACjD,MAAA,0BAAA,CAA2B,MAAM,KAAK,CAAA;AACtC,MAAA,KAAA,CAAM,iBAAA,GAAoB,MAAA;AAC1B,MAAA,KAAA,CAAM,iBAAA,GAAoB,KAAA;AAE1B,MAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAC1C,MAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,MAAA;AAAA,QACJ,SAAA;AAAA,QACA,OAAA,EAAS,cAAA;AAAA,QACT,MAAA,EAAQ,OAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,oBAAA,EAAsB;AAC1B,MAAA,MAAM,cAAA,GAAiB,2BAAA,CAA4B,SAAA,EAAW,KAAA,CAAM,OAA6B,CAAA;AACjG,MAAA,kBAAA,CAAmB,KAAA,EAAO,OAAO,cAAc,CAAA;AAC/C,MAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAC1C,MAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,MAAA;AAAA,QACJ,SAAA;AAAA,QACA,OAAA,EAAS,cAAA;AAAA,QACT,MAAA,EAAQ,WAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,oBAAA,EAAsB;AAC1B,MAAA,MAAM,cAAA,GAAiB,2BAAA;AAAA,QACtB,SAAA;AAAA,QACC,KAAA,CAAM,WAAmC,KAAA,CAAM;AAAA,OACjD;AACA,MAAA,kBAAA,CAAmB,KAAA,EAAO,cAAS,cAAc,CAAA;AACjD,MAAA,0BAAA,CAA2B,MAAM,KAAK,CAAA;AACtC,MAAA,KAAA,CAAM,iBAAA,GAAoB,MAAA;AAC1B,MAAA,KAAA,CAAM,iBAAA,GAAoB,KAAA;AAE1B,MAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAC1C,MAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,QAChB,EAAA,EAAI,MAAA;AAAA,QACJ,SAAA;AAAA,QACA,OAAA,EAAS,cAAA;AAAA,QACT,MAAA,EAAQ,OAAA;AAAA,QACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAW,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA,KAAK,gBAAA;AAAA,IACL,KAAK,OAAA;AACJ,MAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,MAAA,KAAA,CAAM,YAAA,GAAgB,KAAA,CAAM,YAAA,IAA4B,KAAA,CAAM,OAAA,IAAsB,gBAAA;AACpF,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IAED,KAAK,cAAA,EAAgB;AACpB,MAAA,KAAA,CAAM,YAAA,GAAe,OAAA,IAAW,KAAA,CAAM,YAAA,IAAgB,mBAAA;AAEtD,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,SAAA,KAAc,gBAAA,IAAoB,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA;AACvG,MAAA,IAAI,UAAA,EAAY;AACf,QAAA,UAAA,CAAW,MAAA,GAAS,OAAA;AACpB,QAAA,UAAA,CAAW,UAAA,GAAa,KAAA;AAAA,MACzB;AACA,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA,IACD;AAAA,IAEA;AACC,MAAA,KAAA,CAAM,aAAA,GAAgB,SAAA;AACtB,MAAA;AAAA;AAGF,EAAA,OAAO,KAAA;AACR;;;AC5eA,IAAM,eAAA,GAAkB,qCAAA;AAKjB,SAAS,aAAa,OAAA,EAA0B;AACtD,EAAA,OAAO,eAAA,CAAgB,KAAK,OAAO,CAAA;AACpC;AAMA,eAAsB,iBAAiB,MAAA,EAAqC;AAC3E,EAAA,IAAI,QAAQ,OAAA,EAAS;AAErB,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACpC,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,MAAM,SAAS,MAAM;AACpB,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,MAAA,EAAQ,mBAAA,CAAoB,SAAS,MAAM,CAAA;AAC3C,MAAA,OAAA,EAAQ;AAAA,IACT,CAAA;AAEA,IAAA,MAAA,EAAQ,iBAAiB,OAAA,EAAS,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAM,CAAA;AAExD,IAAA,IAAI,OAAO,0BAA0B,UAAA,EAAY;AAChD,MAAA,qBAAA,CAAsB,MAAM;AAC3B,QAAA,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,MACrB,CAAC,CAAA;AACD,MAAA;AAAA,IACD;AAEA,IAAA,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,EACrB,CAAC,CAAA;AACF;AAQA,eAAsB,mBAAA,CACrB,MAAA,EACA,OAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,GAAA,GAAM,sBAAsB,MAAM,CAAA;AACxC,EAAA,MAAM,WAAA,GAAc,oBAAoB,MAAM,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,WAAA,EAAY;AAErE,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IACjC,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA;AAAA,IACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,SAAS,CAAA;AAAA,IACvC;AAAA,GACA,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACjB,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAGjC,EAAA,IAAI;AACH,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,OAAO,MAAA;AACvC,IAAA,IAAI,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,SAAiB,MAAA,CAAO,MAAA;AACrD,IAAA,IAAI,OAAO,MAAA,CAAO,MAAA,KAAW,QAAA,SAAiB,MAAA,CAAO,MAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,IAAA;AACR;;;ACnEA,IAAM,sBAAA,GAAyB,+CAAA;AAQxB,SAAS,kBAAA,CACf,MAAA,EACA,SAAA,EACA,WAAA,EACA,uBAAA,EACC;AACD,EAAA,MAAM,kBAAA,GAAqBC,aAA+B,IAAI,CAAA;AAE9D,EAAA,MAAM,SAAA,GAAYA,aAAO,MAAM,CAAA;AAC/B,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,EAAA,MAAM,YAAA,GAAeA,aAAO,SAAS,CAAA;AACrC,EAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAEvB,EAAA,MAAM,WAAA,GAAcC,iBAAA;AAAA,IACnB,OACC,WAAA,EACA,WAAA,EACA,SAAA,EACA,uBAAA,KACiC;AACjC,MAAA,kBAAA,CAAmB,SAAS,KAAA,EAAM;AAClC,MAAA,MAAM,eAAA,GAAkB,uBAAA,IAA2B,IAAI,eAAA,EAAgB;AACvE,MAAA,kBAAA,CAAmB,OAAA,GAAU,eAAA;AAE7B,MAAA,MAAM,QAAQ,oBAAA,EAAqB;AACnC,MAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,EAAI;AAEjC,MAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,KAAoC;AAC1D,QAAA,IAAI,eAAA,CAAgB,OAAO,OAAA,EAAS;AACpC,QAAA,WAAA;AAAA,UAAY,CAAC,SACZ,IAAA,CAAK,GAAA;AAAA,YAAI,CAAC,GAAA,KACT,GAAA,CAAI,EAAA,KAAO,WAAA,GAAc,EAAE,GAAG,GAAA,EAAK,GAAG,MAAA,EAAO,GAAI;AAAA;AAClD,SACD;AAAA,MACD,CAAA;AAEA,MAAA,MAAM,gBAAgB,SAAA,CAAU,OAAA;AAChC,MAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,aAAA,EAAe,WAAA,EAAa,SAAS,CAAA;AAC1E,MAAA,MAAM,GAAA,GAAM,kBAAkB,aAAa,CAAA;AAC3C,MAAA,MAAM,OAAA,GAAU,oBAAoB,aAAa,CAAA;AAEjD,MAAA,IAAI;AACH,QAAA,MAAM,oBAAA,CAAqB,GAAA,EAAK,WAAA,EAAa,OAAA,EAAS;AAAA,UACrD,QAAQ,eAAA,CAAgB,MAAA;AAAA,UACxB,OAAA,EAAS,CAAC,KAAA,KAAuB;AAChC,YAAA,IAAI,eAAA,CAAgB,OAAO,OAAA,EAAS;AAEpC,YAAA,IAAI,OAAO,MAAM,SAAA,KAAc,QAAA,IAAY,MAAM,SAAA,CAAU,WAAA,OAAkB,YAAA,EAAc;AAC1F,cAAA,IAAI,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,WAAA;AACjD,cAAA,IAAI,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,SAAA;AAC7C,cAAA;AAAA,YACD;AAEA,YAAA,oBAAA,CAAqB,OAAO,KAAK,CAAA;AAEjC,YAAA,MAAM,YAAY,KAAA,CAAM,SAAA;AAGxB,YAAA,IAAI,SAAA,KAAc,sBAAA,IAA0B,KAAA,CAAM,iBAAA,EAAmB;AACpE,cAAA,YAAA,CAAa,OAAA,CAAQ,oBAAA,GAAuB,KAAA,CAAM,iBAAiB,CAAA;AAAA,YACpE,WAAW,SAAA,CAAU,UAAA,CAAW,cAAc,CAAA,IAAK,cAAc,sBAAA,EAAwB;AACxF,cAAA,MAAM,GAAA,GAAM,2BAAA;AAAA,gBACX,SAAA;AAAA,gBACA,KAAA,CAAM,SAAS,IAAA,EAAK,IACnB,MAAM,YAAA,EAAc,IAAA,EAAK,IACzB,eAAA,CAAgB,KAAK;AAAA,eACvB;AACA,cAAA,YAAA,CAAa,OAAA,CAAQ,iBAAA,GAAoB,SAAA,EAAW,GAAG,CAAA;AAAA,YACxD;AAEA,YAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,KAAA,CAAM,sBAAsB,CAAA;AAChF,YAAA,MAAM,kBAAA,GAAqB,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA,CAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,aAAa,CAAA;AAC5F,YAAA,MAAM,iBAAiB,UAAA,EAAY,OAAA,IAAW,kBAAA,EAAoB,OAAA,IAAW,gBAAgB,KAAK,CAAA;AAElG,YAAA,IAAI,MAAM,QAAA,EAAU;AACnB,cAAA,aAAA,CAAc;AAAA,gBACb,gBAAA,EAAkB,sBAAA;AAAA,gBAClB,OAAA,EAAS,sBAAA;AAAA,gBACT,cAAA,EAAgB,OAAA;AAAA,gBAChB,OAAA,EAAS,IAAA;AAAA,gBACT,cAAc,KAAA,CAAM,YAAA;AAAA,gBACpB,qBAAA,EAAuB,MAAM,qBAAA,IAAyB,KAAA,CAAA;AAAA,gBACtD,KAAA,EAAO,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA;AAAA,gBACtB,sBAAA,EAAwB,KAAA,CAAA;AAAA,gBACxB,aAAa,KAAA,CAAM,WAAA;AAAA,gBACnB,WAAW,KAAA,CAAM;AAAA,eACjB,CAAA;AAAA,YACF,CAAA,MAAO;AAEN,cAAA,aAAA,CAAc;AAAA,gBACb,gBAAA,EAAkB,EAAA;AAAA,gBAClB,OAAA,EAAS,EAAA;AAAA,gBACT,cAAA;AAAA,gBACA,cAAA,EAAgB,YAAA;AAAA,gBAChB,OAAA,EAAS,KAAA;AAAA,gBACT,qBAAA,EAAuB,MAAM,qBAAA,IAAyB,KAAA,CAAA;AAAA,gBACtD,KAAA,EAAO,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA;AAAA,gBACtB,wBAAwB,KAAA,CAAM,sBAAA;AAAA,gBAC9B,aAAa,KAAA,CAAM,WAAA;AAAA,gBACnB,WAAW,KAAA,CAAM,SAAA;AAAA,gBACjB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,gBACxB,WAAA,EAAa;AAAA,eACb,CAAA;AAAA,YACF;AAAA,UACD,CAAA;AAAA,UACA,OAAA,EAAS,CAAC,KAAA,KAAiB;AAC1B,YAAA,uBAAA,CAAwB,KAAK,CAAA;AAE7B,YAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAChC,cAAA,YAAA,CAAa,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,YACrC;AAEA,YAAA,IAAI,MAAM,iBAAA,EAAmB;AAC5B,cAAA,KAAA,CAAM,iBAAA,GAAoB,KAAA;AAC1B,cAAA,KAAA,CAAM,iBAAA,GAAoB,KAAA,CAAA;AAC1B,cAAA,YAAA,CAAa,OAAA,CAAQ,iBAAA;AAAA,gBACpB,oBAAA;AAAA,gBACA;AAAA,eACD;AAAA,YACD;AAEA,YAAA,MAAM,SAAA,GAAY,MAAM,IAAA,KAAS,YAAA;AACjC,YAAA,WAAA;AAAA,cAAY,CAAC,SACZ,IAAA,CAAK,GAAA;AAAA,gBAAI,CAAC,GAAA,KACT,GAAA,CAAI,EAAA,KAAO,WAAA,GACR;AAAA,kBACA,GAAG,GAAA;AAAA,kBACH,WAAA,EAAa,KAAA;AAAA,kBACb,cAAA,EAAgB,YAAa,YAAA,GAA0B,OAAA;AAAA,kBACvD,SAAS,CAAC,SAAA;AAAA,kBACV,WAAA,EAAa,SAAA;AAAA,kBACb,YAAA,EAAc,SAAA,GAAY,KAAA,CAAA,GAAY,KAAA,CAAM,OAAA;AAAA,kBAC5C,SAAS,SAAA,GACN,KAAA,CAAM,aAAA,IAAiB,EAAA,GACvB,MAAM,aAAA,IAAiB,sBAAA;AAAA,kBAC1B,cAAA,EAAgB,YAAY,aAAA,GAAgB,KAAA,CAAA;AAAA,kBAC5C,qBAAA,EAAuB,MAAM,qBAAA,IAAyB,KAAA,CAAA;AAAA,kBACtD,KAAA,EAAO,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AACrC,oBAAA,IAAI,IAAA,CAAK,MAAA,KAAW,aAAA,IAAiB,SAAA,EAAW;AAC/C,sBAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAmB;AAAA,oBAC9C;AACA,oBAAA,OAAO,IAAA;AAAA,kBACR,CAAC,CAAA;AAAA,kBACD,sBAAA,EAAwB,KAAA;AAAA,iBACzB,GACC;AAAA;AACJ,aACD;AAAA,UACD,CAAA;AAAA,UACA,YAAY,MAAM;AACjB,YAAA,uBAAA,CAAwB,KAAK,CAAA;AAE7B,YAAA,IAAI,MAAM,iBAAA,EAAmB;AAC5B,cAAA,KAAA,CAAM,iBAAA,GAAoB,KAAA;AAC1B,cAAA,KAAA,CAAM,iBAAA,GAAoB,KAAA,CAAA;AAC1B,cAAA,YAAA,CAAa,OAAA,CAAQ,iBAAA;AAAA,gBACpB,oBAAA;AAAA,gBACA;AAAA,eACD;AAAA,YACD;AAEA,YAAA,IAAI,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAA,KAAc,SAAA,EAAW;AACrD,cAAA,YAAA,CAAa,OAAA,CAAQ,iBAAA,GAAoB,KAAA,CAAM,SAAS,CAAA;AAAA,YACzD;AAEA,YAAA,MAAM,iBAAA,GACL,CAAC,KAAA,CAAM,QAAA,IACP,CAAC,gBAAgB,MAAA,CAAO,OAAA,IACxB,YAAA,CAAa,KAAA,CAAM,aAAa,CAAA;AAEjC,YAAA,MAAM,YAAA,GAA+B;AAAA,cACpC,EAAA,EAAI,WAAA;AAAA,cACJ,SAAA,EAAW,MAAM,SAAA,IAAa,SAAA;AAAA,cAC9B,IAAA,EAAM,WAAA;AAAA,cACN,OAAA,EAAS,KAAA,CAAM,QAAA,GAAW,sBAAA,GAAyB,MAAM,aAAA,IAAiB,EAAA;AAAA,cAC1E,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,cAClC,WAAA,EAAa,KAAA;AAAA,cACb,cAAA,EAAgB,KAAA,CAAM,QAAA,GAAW,OAAA,GAAU,WAAA;AAAA,cAC3C,SAAS,KAAA,CAAM,QAAA;AAAA,cACf,YAAA,EAAc,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,YAAA,GAAe,KAAA,CAAA;AAAA,cACpD,aAAa,KAAA,CAAM,WAAA;AAAA,cACnB,aAAa,KAAA,CAAM,SAAA;AAAA,cACnB,KAAA,EAAO,MAAM,QAAA,GAAW,KAAK,CAAC,GAAG,MAAM,KAAK,CAAA;AAAA,cAC5C,WAAA,EAAa,KAAA;AAAA,cACb,sBAAA,EAAwB,KAAA,CAAA;AAAA,cACxB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,cACxB,qBAAA,EAAuB,KAAA,CAAM,QAAA,GAAW,KAAA,CAAA,GAAY,MAAM,qBAAA,IAAyB,KAAA,CAAA;AAAA,cACnF,iBAAA,EAAmB,iBAAA;AAAA,cACnB,mBAAA,EAAqB,KAAA,CAAM,QAAA,GACxB,KAAA,CAAA,GACA,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,EAAI,GAAI,eAAA,IAAmB,GAAI,CAAC;AAAA,aACjE;AAEA,YAAA,WAAA;AAAA,cAAY,CAAC,SACZ,IAAA,CAAK,GAAA;AAAA,gBAAI,CAAC,GAAA,KACT,GAAA,CAAI,EAAA,KAAO,cAAc,YAAA,GAAe;AAAA;AACzC,aACD;AAEA,YAAA,YAAA,CAAa,OAAA,CAAQ,mBAAmB,YAAY,CAAA;AAAA,UACrD;AAAA,SACA,CAAA;AAED,QAAA,MAAM,mBAAA,GACL,CAAC,eAAA,CAAgB,MAAA,CAAO,OAAA,IACxB,CAAC,KAAA,CAAM,QAAA,IACP,YAAA,CAAa,KAAA,CAAM,aAAa,CAAA;AAEjC,QAAA,IAAI,mBAAA,EAAqB;AACxB,UAAA,MAAM,gBAAA,CAAiB,gBAAgB,MAAM,CAAA;AAAA,QAC9C;AAEA,QAAA,IAAI,mBAAA,IAAuB,CAAC,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS;AAC3D,UAAA,IAAI;AACH,YAAA,MAAM,kBAAkB,MAAM,mBAAA;AAAA,cAC7B,aAAA;AAAA,cACA,KAAA,CAAM,aAAA;AAAA,cACN,eAAA,CAAgB;AAAA,aACjB;AACA,YAAA,WAAA;AAAA,cAAY,CAAC,SACZ,IAAA,CAAK,GAAA;AAAA,gBAAI,CAAC,GAAA,KACT,GAAA,CAAI,EAAA,KAAO,WAAA,GACR,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,eAAA,EAAiB,iBAAA,EAAmB,KAAA,EAAM,GAC7D;AAAA;AACJ,aACD;AAAA,UACD,CAAA,CAAA,MAAQ;AACP,YAAA,WAAA;AAAA,cAAY,CAAC,SACZ,IAAA,CAAK,GAAA;AAAA,gBAAI,CAAC,GAAA,KACT,GAAA,CAAI,EAAA,KAAO,WAAA,GAAc,EAAE,GAAG,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAM,GAAI;AAAA;AACjE,aACD;AAAA,UACD;AAAA,QACD;AAEA,QAAA,OAAO,KAAA,CAAM,SAAA;AAAA,MACd,SAAS,KAAA,EAAO;AACf,QAAA,uBAAA,CAAwB,KAAK,CAAA;AAE7B,QAAA,IAAK,KAAA,CAAgB,SAAS,YAAA,EAAc;AAC3C,UAAA,YAAA,CAAa,OAAA,CAAQ,UAAU,KAAc,CAAA;AAAA,QAC9C;AAEA,QAAA,IAAI,MAAM,iBAAA,EAAmB;AAC5B,UAAA,KAAA,CAAM,iBAAA,GAAoB,KAAA;AAC1B,UAAA,KAAA,CAAM,iBAAA,GAAoB,MAAA;AAC1B,UAAA,YAAA,CAAa,OAAA,CAAQ,iBAAA;AAAA,YACpB,oBAAA;AAAA,YACA;AAAA,WACD;AAAA,QACD;AAEA,QAAA,MAAM,SAAA,GAAa,MAAgB,IAAA,KAAS,YAAA;AAC5C,QAAA,WAAA;AAAA,UAAY,CAAC,SACZ,IAAA,CAAK,GAAA;AAAA,YAAI,CAAC,GAAA,KACT,GAAA,CAAI,EAAA,KAAO,WAAA,GACR;AAAA,cACA,GAAG,GAAA;AAAA,cACH,WAAA,EAAa,KAAA;AAAA,cACb,cAAA,EAAgB,YAAa,YAAA,GAA0B,OAAA;AAAA,cACvD,SAAS,CAAC,SAAA;AAAA,cACV,WAAA,EAAa,SAAA;AAAA,cACb,YAAA,EAAc,SAAA,GAAY,MAAA,GAAa,KAAA,CAAgB,OAAA;AAAA,cACvD,SAAS,SAAA,GACN,KAAA,CAAM,aAAA,IAAiB,EAAA,GACvB,MAAM,aAAA,IAAiB,sBAAA;AAAA,cAC1B,qBAAA,EAAuB,MAAM,qBAAA,IAAyB,MAAA;AAAA,cACtD,KAAA,EAAO,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AACrC,gBAAA,IAAI,IAAA,CAAK,MAAA,KAAW,aAAA,IAAiB,SAAA,EAAW;AAC/C,kBAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAmB;AAAA,gBAC9C;AACA,gBAAA,OAAO,IAAA;AAAA,cACR,CAAC,CAAA;AAAA,cACD,sBAAA,EAAwB;AAAA,aACzB,GACC;AAAA;AACJ,SACD;AAEA,QAAA,OAAO,KAAA,CAAM,SAAA;AAAA,MACd;AAAA,IACD,CAAA;AAAA,IACA,CAAC,aAAa,uBAAuB;AAAA,GACtC;AAEA,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACtC,IAAA,kBAAA,CAAmB,SAAS,KAAA,EAAM;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACN,WAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD;AACD;;;ACvTA,IAAM,yBAAA,GAA4B,EAAA;AAClC,IAAM,8BAAA,GAAiC,EAAA;AAevC,SAASC,mBAAkB,MAAA,EAAgC;AAC1D,EAAA,OAAO,MAAA,CAAO,IAAI,eAAA,IAAmB,OAAA;AACtC;AAEA,SAAS,eAAe,MAAA,EAAgC;AACvD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,EAAS,KAAA,EAAO,EAAA;AACvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACT;AAAA,KACD;AAAA,EACD;AACA,EAAA,OAAO,OAAA;AACR;AAEA,SAAS,oBAAoB,MAAA,EAAgC;AAC5D,EAAA,MAAM,YAAA,GAAe,OAAO,QAAA,CAAS,IAAA;AACrC,EAAA,IAAI,CAAC,YAAA,EAAc;AAClB,IAAA,MAAM,IAAI,KAAA;AAAA,MACT;AAAA,KACD;AAAA,EACD;AACA,EAAA,OAAO,YAAA;AACR;AAEA,SAAS,kBAAkB,MAAA,EAAgC;AAC1D,EAAA,MAAM,UAAA,GAAa,OAAO,QAAA,CAAS,EAAA;AACnC,EAAA,IAAI,CAAC,UAAA,EAAY;AAChB,IAAA,MAAM,IAAI,KAAA;AAAA,MACT;AAAA,KACD;AAAA,EACD;AACA,EAAA,OAAO,UAAA;AACR;AAQA,SAAS,qBAAqB,MAAA,EAAiC;AAC9D,EAAA,IAAI,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,OAAO,KAAA;AACjC,EAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,OAAA;AAC3B,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY;AAC9B,IAAA,IAAI,KAAA,KAAU,cAAA,IAAkB,KAAA,KAAU,gBAAA,EAAkB,OAAO,IAAA;AAAA,EACpE;AACA,EAAA,OAAO,KAAA;AACR;AAEA,eAAe,SAAA,CACd,GAAA,EACA,OAAA,EACA,MAAA,EACa;AACb,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IACjC,MAAA,EAAQ,KAAA;AAAA,IACR,OAAA;AAAA,IACA;AAAA,GACA,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACjB,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,EACxD;AAEA,EAAA,OAAQ,MAAM,SAAS,IAAA,EAAK;AAC7B;AAgBA,eAAsB,YAAA,CACrB,MAAA,EACA,IAAA,GAA4B,EAAC,EACE;AAC/B,EAAA,MAAM,OAAA,GAAU,eAAe,MAAM,CAAA;AAErC,EAAA,MAAM,eAAA,GAAkB,qBAAqB,MAAM,CAAA;AAEnD,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,IAClC,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAA;AAAA,IAC3B,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,yBAAyB;AAAA,GACnD,CAAA;AACD,EAAA,IAAI,eAAA,EAAiB;AACpB,IAAA,MAAA,CAAO,GAAA,CAAI,kBAAkB,OAAO,CAAA;AACpC,IAAA,MAAA,CAAO,GAAA,CAAI,cAAA,EAAgB,mBAAA,CAAoB,MAAM,CAAC,CAAA;AAAA,EACvD,CAAA,MAAO;AACN,IAAA,MAAA,CAAO,GAAA,CAAI,YAAA,EAAc,iBAAA,CAAkB,MAAM,CAAC,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,MAAA,CAAO,SAAS,KAAA,EAAO;AAC1B,IAAA,MAAA,CAAO,IAAIA,kBAAAA,CAAkB,MAAM,CAAA,EAAG,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,GAAA,GAAM,eAAA,GACT,CAAA,EAAG,MAAA,CAAO,IAAI,OAAO,CAAA,4BAAA,EAA+B,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA,GACrE,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,oBAAA,EAAuB,kBAAA;AAAA,IAC5C;AAAA,GACA,CAAA,UAAA,EAAa,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAEjC,EAAA,OAAO,SAAA;AAAA,IACN,GAAA;AAAA,IACA,oBAAoB,MAAM,CAAA;AAAA,IAC1B,IAAA,CAAK;AAAA,GACN;AACD;AAgBA,eAAsB,iBAAA,CACrB,QACA,IAAA,EACoC;AACpC,EAAA,MAAM,OAAA,GAAU,eAAe,MAAM,CAAA;AAErC,EAAA,MAAM,eAAA,GAAkB,qBAAqB,MAAM,CAAA;AAEnD,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,IAClC,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAA;AAAA,IAC3B,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,8BAA8B;AAAA,GACxD,CAAA;AACD,EAAA,IAAI,eAAA,EAAiB;AACpB,IAAA,MAAA,CAAO,GAAA,CAAI,kBAAkB,OAAO,CAAA;AACpC,IAAA,MAAA,CAAO,GAAA,CAAI,cAAA,EAAgB,mBAAA,CAAoB,MAAM,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,MAAA,CAAO,SAAS,KAAA,EAAO;AAC1B,IAAA,MAAA,CAAO,IAAIA,kBAAAA,CAAkB,MAAM,CAAA,EAAG,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,GAAA,GAAM,eAAA,GACT,CAAA,EAAG,MAAA,CAAO,IAAI,OAAO,CAAA,iCAAA,EAAoC,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA,GAC1E,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,oBAAA,EAAuB,kBAAA;AAAA,IAC5C;AAAA,GACA,CAAA,eAAA,EAAkB,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAEtC,EAAA,OAAO,SAAA;AAAA,IACN,GAAA;AAAA,IACA,oBAAoB,MAAM,CAAA;AAAA,IAC1B,IAAA,CAAK;AAAA,GACN;AACD;;;ACxIA,SAAS,2BAAA,CAA4B,OAA0B,SAAA,EAAqC;AACnG,EAAA,OAAO;AAAA,IACN;AAAA,MACC,EAAA,EAAI,CAAA,aAAA,EAAgB,KAAA,CAAM,WAAW,CAAA,CAAA;AAAA,MACrC,SAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,SAAS,KAAA,CAAM,KAAA;AAAA,MACf,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,YAAA,EAAc;AAAA,KACf;AAAA,IACA;AAAA,MACC,EAAA,EAAI,CAAA,kBAAA,EAAqB,KAAA,CAAM,WAAW,CAAA,CAAA;AAAA,MAC1C,SAAA;AAAA,MACA,IAAA,EAAM,WAAA;AAAA,MACN,SAAS,KAAA,CAAM,QAAA;AAAA,MACf,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,YAAA,EAAc;AAAA;AACf,GACD;AACD;AAMA,SAAS,YAAA,CAAa,UAAkB,SAAA,EAAuC;AAC9E,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,KAAA,EAAQ,SAAA,IAAa,EAAE,CAAA,CAAA;AAC1C;AAEO,SAAS,SAAA,CAAU,MAAA,EAAwB,SAAA,GAA2B,EAAC,EAAoB;AACjG,EAAA,MAAM,QAAA,GAAWC,aAAA,CAAQ,MAAM,aAAA,CAAc,MAAM,CAAA,EAAG;AAAA,IACrD,OAAO,OAAA,EAAS,MAAA;AAAA,IAChB,OAAO,QAAA,EAAU,EAAA;AAAA,IACjB,OAAO,QAAA,EAAU,OAAA;AAAA,IACjB,OAAO,QAAA,EAAU;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,gBAAA,GACJ,SAAA,CAAU,GAAA,CAAI,QAAQ,EAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,EAAG,SAAA,IACnD,MAAA,CAAO,SAAS,SAAA,IAChB,MAAA;AAED,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,eAA2B,MAAM;AAChE,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AACrC,IAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA;AAC9B,IAAA,OAAO,MAAA,CAAO,OAAA,EAAS,eAAA,IAAmB,EAAC;AAAA,EAC5C,CAAC,CAAA;AACD,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAA6B,MAAS,CAAA;AAGtF,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAA6B,gBAAgB,CAAA;AAE7F,EAAA,MAAM,YAAA,GAAeJ,aAA2B,gBAAgB,CAAA;AAChE,EAAA,MAAM,eAAA,GAAkBA,aAAe,QAAQ,CAAA;AAG/C,EAAA,MAAM,sBAAA,GAAyBA,aAA2B,MAAS,CAAA;AAEnE,EAAA,MAAM,YAAA,GAAeA,aAAO,SAAS,CAAA;AACrC,EAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AACvB,EAAA,MAAM,SAAA,GAAYA,aAAO,MAAM,CAAA;AAC/B,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,EAAA,MAAM,WAAA,GAAcA,aAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,EAAA,MAAM,WAAA,GAAcA,aAAO,QAAQ,CAAA;AACnC,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAA,MAAM,qBAAA,GAAwBC,iBAAAA;AAAA,IAC7B,CAAC,OAAA,KAAY;AACZ,MAAA,MAAM,QAAQ,WAAA,CAAY,OAAA;AAC1B,MAAA,MAAM,YAAY,sBAAA,CAAuB,OAAA;AACzC,MAAA,IAAI,cAAc,MAAA,EAAW;AAC5B,QAAA,MAAM,SAAA,GAAY,YAAA,CAAa,KAAA,EAAO,SAAS,CAAA;AAC/C,QAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,SAAS,CAAA,EAAG;AACrC,UAAA,iBAAA,CAAkB,aAAA;AAAA,YACjB,SAAA;AAAA,YACA;AAAA,WACD;AAAA,QACD;AAIA,QAAA,IAAI,YAAA,CAAa,YAAY,SAAA,EAAW;AACvC,UAAA,WAAA,CAAY,OAAO,CAAA;AAAA,QACpB;AACA,QAAA;AAAA,MACD;AACA,MAAA,WAAA,CAAY,OAAO,CAAA;AAAA,IACpB,CAAA;AAAA,IACA;AAAC,GACF;AAEA,EAAA,MAAM,sBAAA,GAAyBA,iBAAAA,CAAY,CAAC,OAAA,KAAqB;AAChE,IAAA,MAAM,QAAQ,WAAA,CAAY,OAAA;AAC1B,IAAA,MAAM,YAAY,sBAAA,CAAuB,OAAA;AACzC,IAAA,IAAI,cAAc,MAAA,EAAW;AAC5B,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,KAAA,EAAO,SAAS,CAAA;AAC/C,MAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,SAAS,CAAA,EAAG;AACrC,QAAA,iBAAA,CAAkB,UAAA,CAAW,WAAW,OAAO,CAAA;AAAA,MAChD;AACA,MAAA,IAAI,YAAA,CAAa,YAAY,SAAA,EAAW;AACvC,QAAA,uBAAA,CAAwB,OAAO,CAAA;AAAA,MAChC;AACA,MAAA;AAAA,IACD;AACA,IAAA,uBAAA,CAAwB,OAAO,CAAA;AAAA,EAChC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIG,cAAA,CAA0B;AAAA,IACvE,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,IAAA;AAAA,IACR,eAAA,EAAiB;AAAA,GACjB,CAAA;AAED,EAAA,MAAM,kBAAA,GAAqBJ,aAAO,eAAe,CAAA;AACjD,EAAA,kBAAA,CAAmB,OAAA,GAAU,eAAA;AAE7B,EAAA,MAAM,gBAAA,GAAmBG,aAAA;AAAA,IACxB,OAAO;AAAA,MACN,GAAG,YAAA,CAAa,OAAA;AAAA,MAChB,eAAe,CAAC,OAAA,KAAY,YAAA,CAAa,OAAA,CAAQ,gBAAgB,OAAO,CAAA;AAAA,MACxE,aAAA,EAAe,MAAM,YAAA,CAAa,OAAA,CAAQ,aAAA,IAAgB;AAAA,MAC1D,kBAAkB,CAAC,OAAA,KAAY,YAAA,CAAa,OAAA,CAAQ,mBAAmB,OAAO,CAAA;AAAA,MAC9E,SAAS,CAAC,KAAA,KAAU,YAAA,CAAa,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,MACxD,uBAAuB,CAAC,IAAA,KAAS,YAAA,CAAa,OAAA,CAAQ,wBAAwB,IAAI,CAAA;AAAA,MAClF,mBAAmB,CAAC,SAAA,KAAc,YAAA,CAAa,OAAA,CAAQ,oBAAoB,SAAS,CAAA;AAAA,MACpF,oBAAA,EAAsB,CAAC,OAAA,KAAY;AAClC,QAAA,kBAAA,CAAmB,CAAC,UAAU,EAAE,GAAG,MAAM,OAAA,EAAS,MAAA,EAAQ,MAAK,CAAE,CAAA;AACjE,QAAA,YAAA,CAAa,OAAA,CAAQ,uBAAuB,OAAO,CAAA;AAAA,MACpD,CAAA;AAAA,MACA,iBAAA,EAAmB,CAAC,SAAA,EAAW,OAAA,KAAY;AAC1C,QAAA,QAAQ,SAAA;AAAW,UAClB,KAAK,qBAAA;AACJ,YAAA,kBAAA,CAAmB,CAAC,UAAU,EAAE,GAAG,MAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAW,CAAE,CAAA;AAC7E,YAAA;AAAA,UACD,KAAK,sBAAA;AACJ,YAAA,kBAAA,CAAmB,CAAC,UAAU,EAAE,GAAG,MAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAW,CAAE,CAAA;AAC7E,YAAA;AAAA,UACD,KAAK,qBAAA;AAAA,UACL,KAAK,oBAAA;AACJ,YAAA,kBAAA,CAAmB,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,MAAK,CAAE,CAAA;AACzD,YAAA;AAAA,UACD,KAAK,qBAAA;AACJ,YAAA,kBAAA,CAAmB,CAAC,IAAA,MAAU;AAAA,cAC7B,GAAG,IAAA;AAAA,cACH,eAAA,EAAiB,KAAK,eAAA,GAAkB;AAAA,aACzC,CAAE,CAAA;AACF,YAAA;AAAA;AAEF,QAAA,YAAA,CAAa,OAAA,CAAQ,iBAAA,GAAoB,SAAA,EAAW,OAAO,CAAA;AAAA,MAC5D;AAAA,KACD,CAAA;AAAA,IACA;AAAC,GACF;AAEA,EAAA,MAAM,EAAE,WAAA,EAAa,YAAA,EAAc,mBAAA,EAAqB,oBAAmB,GAAI,kBAAA;AAAA,IAC9E,MAAA;AAAA,IACA,gBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACD;AAEA,EAAA,MAAM,WAAA,GAAcF,iBAAAA;AAAA,IACnB,OAAO,WAAA,KAAwB;AAC9B,MAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAK,EAAG;AAEzB,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAS,cAAA;AAC3C,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA,IAAW,OAAA,KAAY,KAAA,EAAO;AAC/C,QAAA,YAAA,CAAa,UAAU,UAAA,EAAW;AAClC,QAAA,mBAAA,CAAoB,aAAa,OAAO,CAAA;AACxC,QAAA,YAAA,CAAa,OAAA,CAAQ,iBAAA,GAAoB,YAAA,CAAa,OAAO,CAAA;AAAA,MAC9D;AAEA,MAAA,MAAM,aAAA,GAAgB,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACxC,MAAA,MAAM,OAAA,GAA0B;AAAA,QAC/B,EAAA,EAAI,aAAA;AAAA,QACJ,WAAW,YAAA,CAAa,OAAA;AAAA,QACxB,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACnC;AAEA,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,OAAO,CAAC,CAAA;AACxC,MAAA,YAAA,CAAa,OAAA,CAAQ,gBAAgB,WAAW,CAAA;AAChD,MAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,MAAA,YAAA,CAAa,QAAQ,aAAA,IAAgB;AAErC,MAAA,MAAM,WAAA,GAAc,CAAA,UAAA,EAAa,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAC3C,MAAA,MAAM,YAAA,GAA+B;AAAA,QACpC,EAAA,EAAI,WAAA;AAAA,QACJ,WAAW,YAAA,CAAa,OAAA;AAAA,QACxB,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,EAAA;AAAA,QACT,gBAAA,EAAkB,EAAA;AAAA,QAClB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,WAAA,EAAa,IAAA;AAAA,QACb,cAAA,EAAgB,SAAA;AAAA,QAChB,OAAO,EAAC;AAAA,QACR,sBAAA,EAAwB,MAAA;AAAA,QACxB,WAAA,EAAa,KAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OACjB;AAEA,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,YAAY,CAAC,CAAA;AAE7C,MAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,MAAA,MAAM,QAAQ,WAAA,CAAY,OAAA;AAC1B,MAAA,MAAM,kBAAkB,YAAA,CAAa,OAAA;AACrC,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,KAAA,EAAO,eAAe,CAAA;AACrD,MAAA,sBAAA,CAAuB,OAAA,GAAU,eAAA;AAEjC,MAAA,MAAM,kBAAkB,CAAC,GAAG,WAAA,CAAY,OAAA,EAAS,SAAS,YAAY,CAAA;AACtE,MAAA,iBAAA,CAAkB,KAAA,CAAM,SAAA,EAAW,eAAA,EAAiB,eAAe,CAAA;AAEnE,MAAA,MAAM,eAAe,MAAM,WAAA;AAAA,QAC1B,WAAA;AAAA,QACA,WAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACD;AAEA,MAAA,iBAAA,CAAkB,SAAS,SAAS,CAAA;AACpC,MAAA,sBAAA,CAAuB,OAAA,GAAU,MAAA;AAKjC,MAAA,IACC,CAAC,gBAAgB,MAAA,CAAO,OAAA,IACxB,gBACA,YAAA,KAAiB,eAAA,IACjB,YAAA,CAAa,OAAA,KAAY,eAAA,EACxB;AACD,QAAA,YAAA,CAAa,OAAA,GAAU,YAAA;AACvB,QAAA,mBAAA,CAAoB,YAAY,CAAA;AAAA,MACjC;AAAA,IACD,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACb;AAEA,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAM;AACvC,IAAA,SAAA,CAAU,MAAA,CAAO,YAAY,OAAO,CAAA;AACpC,IAAA,WAAA,CAAY,EAAE,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAY,CAAC,IAAA,KAA2B;AAC/D,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,IAAI,CAAC,CAAA;AAAA,EACzC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACtC,IAAA,MAAM,QAAQ,WAAA,CAAY,OAAA;AAC1B,IAAA,MAAM,UAAU,YAAA,CAAa,OAAA;AAC7B,IAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,KAAA,EAAO,OAAO,CAAA;AACjD,IAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,aAAa,CAAA,EAAG;AACzC,MAAA,iBAAA,CAAkB,MAAM,aAAa,CAAA;AAAA,IACtC;AACA,IAAA,mBAAA,EAAoB;AACpB,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAC7B,IAAA,kBAAA,CAAmB,CAAC,UAAU,EAAE,GAAG,MAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK,CAAE,CAAA;AAEvE,IAAA,WAAA;AAAA,MAAY,CAAC,IAAA,KACZ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjB,QAAA,IAAI,IAAI,WAAA,EAAa;AACpB,UAAA,OAAO;AAAA,YACN,GAAG,GAAA;AAAA,YACH,GAAG,4BAAA,CAA6B,GAAA,CAAI,SAAS,EAAC,EAAG,IAAI,cAAc;AAAA,WACpE;AAAA,QACD;AACA,QAAA,OAAO,GAAA;AAAA,MACR,CAAC;AAAA,KACF;AAAA,EACD,CAAA,EAAG,CAAC,mBAAmB,CAAC,CAAA;AAExB,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACtC,IAAA,MAAM,QAAQ,WAAA,CAAY,OAAA;AAC1B,IAAA,MAAM,UAAU,YAAA,CAAa,OAAA;AAC7B,IAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,KAAA,EAAO,OAAO,CAAA;AACjD,IAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,aAAa,CAAA,EAAG;AACzC,MAAA,iBAAA,CAAkB,MAAM,aAAa,CAAA;AAAA,IACtC;AACA,IAAA,SAAA,CAAU,OAAO,KAAK,CAAA;AACtB,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,MAAA;AACvB,IAAA,mBAAA,CAAoB,MAAS,CAAA;AAC7B,IAAA,sBAAA,CAAuB,OAAA,GAAU,MAAA;AACjC,IAAA,kBAAA,CAAmB,SAAS,KAAA,EAAM;AAClC,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAC7B,IAAA,kBAAA,CAAmB,EAAE,OAAA,EAAS,IAAA,EAAM,QAAQ,IAAA,EAAM,eAAA,EAAiB,GAAG,CAAA;AAAA,EACvE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAeA,iBAAAA,CAAY,MAAM,YAAA,CAAa,OAAA,EAAS,EAAE,CAAA;AAC/D,EAAA,MAAM,cAAcA,iBAAAA,CAAY,MAAM,QAAA,EAAU,CAAC,QAAQ,CAAC,CAAA;AAE1D,EAAA,MAAM,iBAAA,GAAoBA,iBAAAA,CAAY,OAAO,GAAA,KAAgB;AAC5D,IAAA,MAAM,OAAA,GAAU,mBAAmB,OAAA,CAAQ,OAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI;AACH,MAAA,MAAM,iBAAoB,SAAA,CAAU,OAAA,EAAS,QAAQ,YAAA,EAAc,EAAE,KAAK,CAAA;AAAA,IAC3E,SAAS,KAAA,EAAO;AACf,MAAA,kBAAA,CAAmB,CAAC,IAAA,MAAU;AAAA,QAC7B,GAAG,IAAA;AAAA,QACH,eAAA,EAAiB,KAAK,eAAA,GAAkB;AAAA,OACzC,CAAE,CAAA;AACF,MAAA,YAAA,CAAa,OAAA,CAAQ,UAAU,KAAc,CAAA;AAC7C,MAAA,MAAM,KAAA;AAAA,IACP;AAAA,EACD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,kBAAY,YAAY;AAChD,IAAA,MAAM,OAAA,GAAU,mBAAmB,OAAA,CAAQ,OAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI;AACH,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACrB,QAAA,IAAI,gBAAA,GAAmB,CAAA,CAAA;AACvB,QAAA,KAAA,IAAS,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,UAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,KAAS,eAAe,IAAA,CAAK,CAAC,EAAE,WAAA,EAAa;AACxD,YAAA,gBAAA,GAAmB,CAAA;AACnB,YAAA;AAAA,UACD;AAAA,QACD;AACA,QAAA,IAAI,gBAAA,KAAqB,IAAI,OAAO,IAAA;AACpC,QAAA,OAAO,IAAA,CAAK,GAAA;AAAA,UAAI,CAAC,GAAA,EAAK,CAAA,KACrB,CAAA,KAAM,gBAAA,GAAmB,EAAE,GAAG,GAAA,EAAK,cAAA,EAAgB,cAAA,EAAe,GAAI;AAAA,SACvE;AAAA,MACD,CAAC,CAAA;AACD,MAAA,MAAM,gBAAA,CAAoB,SAAA,CAAU,OAAA,EAAS,OAAA,CAAQ,YAAY,CAAA;AAAA,IAClE,SAAS,KAAA,EAAO;AACf,MAAA,YAAA,CAAa,OAAA,CAAQ,UAAU,KAAc,CAAA;AAC7C,MAAA,MAAM,KAAA;AAAA,IACP;AAAA,EACD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,kBAAY,YAAY;AACzC,IAAA,MAAM,OAAA,GAAU,mBAAmB,OAAA,CAAQ,OAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI;AACH,MAAA,MAAM,gBAAA,CAAoB,SAAA,CAAU,OAAA,EAAS,OAAA,CAAQ,YAAY,CAAA;AAAA,IAClE,SAAS,KAAA,EAAO;AACf,MAAA,YAAA,CAAa,OAAA,CAAQ,UAAU,KAAc,CAAA;AAC7C,MAAA,MAAM,KAAA;AAAA,IACP;AAAA,EACD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBD,aAGd,IAAI,CAAA;AACd,EAAA,MAAM,mBAAA,GAAsBA,aAA2B,MAAS,CAAA;AAChE,EAAA,mBAAA,CAAoB,OAAA,GAAU,gBAAA;AAE9B,EAAA,MAAM,WAAA,GAAcC,iBAAAA,CAAY,OAAO,SAAA,KAAsB;AAG5D,IAAA,MAAM,WAAW,eAAA,CAAgB,OAAA;AACjC,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,SAAA,KAAc,SAAA,EAAW;AACjD,MAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IACjB;AAIA,IAAA,IACC,YAAA,CAAa,OAAA,KAAY,SAAA,IACzB,mBAAA,CAAoB,YAAY,SAAA,EAC/B;AACD,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,MAAM,YAAY;AACvB,MAAA,MAAM,QAAQ,WAAA,CAAY,OAAA;AAC1B,MAAA,kBAAA,CAAmB,EAAE,OAAA,EAAS,IAAA,EAAM,QAAQ,IAAA,EAAM,eAAA,EAAiB,GAAG,CAAA;AAEtE,MAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AACvB,MAAA,mBAAA,CAAoB,SAAS,CAAA;AAC7B,MAAA,YAAA,CAAa,OAAA,CAAQ,oBAAoB,SAAS,CAAA;AAMlD,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,KAAA,EAAO,SAAS,CAAA;AAC/C,MAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,GAAA,CAAI,SAAS,CAAA;AAC9C,MAAA,IAAI,MAAA,EAAQ;AACX,QAAA,WAAA,CAAY,OAAO,QAAQ,CAAA;AAC3B,QAAA,uBAAA,CAAwB,OAAO,SAAS,CAAA;AACxC,QAAA,mBAAA,CAAoB,MAAS,CAAA;AAC7B,QAAA;AAAA,MACD;AAEA,MAAA,uBAAA,CAAwB,KAAK,CAAA;AAC7B,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA,SAAA,CAAU,OAAO,KAAK,CAAA;AACtB,MAAA,mBAAA,CAAoB,SAAS,CAAA;AAE7B,MAAA,IAAI;AACH,QAAA,MAAM,WAAW,MAAM,iBAAA,CAAkB,UAAU,OAAA,EAAS,EAAE,WAAW,CAAA;AACzE,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,IAAQ,EAAC;AAClC,QAAA,MAAM,UAAA,GAAa,QAAQ,OAAA,CAAQ,CAAC,UAAU,2BAAA,CAA4B,KAAA,EAAO,SAAS,CAAC,CAAA;AAG3F,QAAA,IAAI,YAAA,CAAa,YAAY,SAAA,EAAW;AACvC,UAAA,WAAA,CAAY,UAAU,CAAA;AAAA,QACvB;AACA,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,UAAA,SAAA,CAAU,GAAA,CAAI,OAAO,UAAU,CAAA;AAAA,QAChC;AAAA,MACD,SAAS,KAAA,EAAO;AACf,QAAA,YAAA,CAAa,OAAA,CAAQ,UAAU,KAAc,CAAA;AAC7C,QAAA,MAAM,KAAA;AAAA,MACP,CAAA,SAAE;AACD,QAAA,mBAAA,CAAoB,CAAC,OAAA,KAAa,OAAA,KAAY,SAAA,GAAY,SAAY,OAAQ,CAAA;AAAA,MAC/E;AAAA,IACD,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,GAAA,EAAI,CAAE,OAAA,CAAQ,MAAM;AACnC,MAAA,IAAI,eAAA,CAAgB,OAAA,EAAS,SAAA,KAAc,SAAA,EAAW;AACrD,QAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,MAC3B;AAAA,IACD,CAAC,CAAA;AACD,IAAA,eAAA,CAAgB,OAAA,GAAU,EAAE,SAAA,EAAW,OAAA,EAAQ;AAC/C,IAAA,OAAO,OAAA;AAAA,EACR,CAAA,EAAG,EAAE,CAAA;AAKL,EAAAI,eAAA,CAAU,MAAM;AACf,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,QAAA,EAAU,gBAAgB,CAAA;AACnD,IAAA,MAAM,cAAc,iBAAA,CAAkB,SAAA,CAAU,GAAA,EAAK,CAAC,MAAM,SAAA,KAAc;AACzE,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,uBAAA,CAAwB,SAAS,CAAA;AAAA,IAClC,CAAC,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA;AACxC,IAAA,IAAI,MAAA,EAAQ;AACX,MAAA,WAAA,CAAY,OAAO,QAAQ,CAAA;AAC3B,MAAA,uBAAA,CAAwB,OAAO,SAAS,CAAA;AAAA,IACzC;AACA,IAAA,OAAO,WAAA;AAAA,EACR,CAAA,EAAG,CAAC,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAE/B,EAAAA,eAAA,CAAU,MAAM;AACf,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,WAAW,CAAA;AACpD,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACtB,MAAA,SAAA,CAAU,GAAA,CAAI,UAAU,MAAM,CAAA;AAAA,IAC/B;AAAA,EACD,CAAA,EAAG,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AAIvB,EAAAA,eAAA,CAAU,MAAM;AACf,IAAA,MAAM,UAAU,eAAA,CAAgB,OAAA;AAChC,IAAA,eAAA,CAAgB,OAAA,GAAU,QAAA;AAC1B,IAAA,IAAI,YAAY,QAAA,EAAU;AAE1B,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AACrC,IAAA,WAAA,CAAY,MAAM,CAAA;AAClB,IAAA,MAAM,iBAAA,GACL,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,EAAG,SAAA,IACjC,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAS,SAAA,IAC3B,MAAA;AACD,IAAA,YAAA,CAAa,OAAA,GAAU,iBAAA;AACvB,IAAA,mBAAA,CAAoB,iBAAiB,CAAA;AACrC,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAC7B,IAAA,kBAAA,CAAmB,EAAE,OAAA,EAAS,IAAA,EAAM,QAAQ,IAAA,EAAM,eAAA,EAAiB,GAAG,CAAA;AAAA,EACvE,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,OAAO;AAAA,IACN,QAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA,SAAA,EAAW,gBAAA;AAAA,IACX,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACD;AACD;ACxfO,SAAS,QAAA,GAA2B;AAC1C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAID,eAAqB,MAAM,CAAA;AAC/D,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAS,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,cAAA,GAAiBJ,aAAO,KAAK,CAAA;AAEnC,EAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAEzB,EAAAK,gBAAU,MAAM;AACf,IAAA,MAAM,YACL,OAAOC,iDAAA,CAA4B,2BAClC,UAAA,GACEA,iDAAA,CAA4B,wBAAuB,GACnD,IAAA;AACJ,IAAA,cAAA,CAAe,CAAC,CAAC,SAAS,CAAA;AAAA,EAC3B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,+CAAA,CAA0B,SAAS,MAAM;AACxC,IAAA,IAAI,cAAA,CAAe,OAAA,EAAS,aAAA,CAAc,WAAW,CAAA;AAAA,EACtD,CAAC,CAAA;AACD,EAAAA,+CAAA,CAA0B,OAAO,MAAM;AAAA,EAAC,CAAC,CAAA;AACzC,EAAAA,+CAAA,CAA0B,QAAA,EAAU,CAAC,KAAA,KAAe;AACnD,IAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC7B,IAAA,MAAM,UAAA,GAAa,KAAA,EAAO,OAAA,GAAU,CAAC,CAAA,EAAG,UAAA;AACxC,IAAA,IAAI,UAAA,EAAY,IAAA,EAAK,EAAG,kBAAA,CAAmB,UAAU,CAAA;AAAA,EACtD,CAAC,CAAA;AACD,EAAAA,+CAAA,CAA0B,OAAA,EAAS,CAAC,KAAA,KAAe;AAClD,IAAA,IAAI,eAAe,OAAA,EAAS;AAC3B,MAAA,YAAA;AAAA,QACC,KAAA,EAAO,OAAA,IAAW,KAAA,EAAO,KAAA,IAAS;AAAA,OACnC;AACA,MAAA,aAAA,CAAc,OAAO,CAAA;AAAA,IACtB;AAAA,EACD,CAAC,CAAA;AAGD,EAAA,MAAM,cAAA,GAAiBN,kBAAY,YAAY;AAC9C,IAAA,IAAI,CAAC,WAAA,EAAa;AACjB,MAAA,YAAA,CAAa,kCAAkC,CAAA;AAC/C,MAAA;AAAA,IACD;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,IAAA,IAAI;AACH,MAAA,MAAM,MAAA,GACL,MAAMK,iDAAA,CAA4B,uBAAA,EAAwB;AAC3D,MAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACrB,QAAA,YAAA,CAAa,mCAAmC,CAAA;AAChD,QAAA;AAAA,MACD;AAEA,MAAA,IACC,OAAOA,iDAAA,CACL,uCAAA,KAA4C,UAAA,EAC7C;AACD,QAAA,MAAM,YAAA,GACL,MAAMA,iDAAA,CAA4B,uCAAA,EAAwC;AAC3E,QAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAC3B,UAAA,YAAA,CAAa,2CAA2C,CAAA;AACxD,UAAA;AAAA,QACD;AAAA,MACD;AAEA,MAAA,kBAAA,CAAmB,EAAE,CAAA;AACrB,MAAA,aAAA,CAAc,WAAW,CAAA;AACzB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAEzB,MAAA,MAAMA,kDAA4B,KAAA,CAAM;AAAA,QACvC,IAAA,EAAM,OAAA;AAAA,QACN,cAAA,EAAgB,IAAA;AAAA,QAChB,UAAA,EAAY,IAAA;AAAA,QACZ,eAAA,EAAiB,CAAA;AAAA,QACjB,2BAAA,EAA6B,KAAA;AAAA,QAC7B,WAAA,EAAa;AAAA,UACZ,QAAA,EAAU,eAAA;AAAA,UACV,eAAA,EAAiB,CAAC,kBAAA,EAAoB,gBAAgB,CAAA;AAAA,UACtD,IAAA,EAAM;AAAA;AACP,OACA,CAAA;AAAA,IACF,SAAS,KAAA,EAAY;AACpB,MAAA,MAAM,OAAA,GACL,KAAA,EAAO,OAAA,IAAW,MAAA,CAAO,KAAK,CAAA,IAAK,2BAAA;AACpC,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,aAAA,CAAc,OAAO,CAAA;AACrB,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AAAA,IAC1B;AAAA,EACD,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAA,MAAM,aAAA,GAAgBL,kBAAY,MAAM;AACvC,IAAA,IAAI;AACH,MAAAK,iDAAA,CAA4B,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AAAA,IAEhB,CAAA,SAAE;AACD,MAAA,aAAA,CAAc,MAAM,CAAA;AACpB,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,cAAA,CAAe,OAAA,GAAU,KAAA;AAAA,IAC1B;AAAA,EACD,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,eAAA,GAAkBL,kBAAY,MAAM;AACzC,IAAA,kBAAA,CAAmB,EAAE,CAAA;AACrB,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC/B,IAAA,aAAA,EAAc;AACd,IAAA,kBAAA,CAAmB,EAAE,CAAA;AACrB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,aAAA,CAAc,MAAM,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAAI,gBAAU,MAAM;AACf,IAAA,OAAO,MAAM;AACZ,MAAA,IAAI,eAAe,OAAA,EAAS;AAC3B,QAAA,IAAI;AACH,UAAAC,iDAAA,CAA4B,IAAA,EAAK;AAAA,QAClC,SAAS,EAAA,EAAI;AAAA,QAAC;AAAA,MACf;AAAA,IACD,CAAA;AAAA,EACD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACN,UAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACD;AACD","file":"index.native.js","sourcesContent":["/**\n * Cross-platform UUID v4 generator\n * Works in both browser and React Native environments\n */\nexport function generateId(): string {\n\t// Simple UUID v4 implementation that doesn't rely on crypto API\n\treturn \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n\t\tconst r = (Math.random() * 16) | 0;\n\t\tconst v = c === \"x\" ? r : (r & 0x3) | 0x8;\n\t\treturn v.toString(16);\n\t});\n}\n","/**\n * Streaming client for React Native using native fetch\n */\n\nexport type StreamEvent = {\n\teventType: string;\n\tworkerName?: string;\n\tmessage?: string;\n\terrorMessage?: string;\n\tresponse?: unknown;\n\texecutionId?: string;\n\tsessionId?: string;\n\tinputTokens?: number;\n\toutputTokens?: number;\n\telapsedMs?: number;\n\tuserActionRequest?: {\n\t\tuserActionId: string;\n\t\tmessage: string;\n\t\trequestedSchema: Record<string, unknown>;\n\t};\n\t[key: string]: unknown;\n};\n\nexport type StreamOptions = {\n\tsignal?: AbortSignal;\n\tonEvent?: (event: StreamEvent) => void;\n\tonError?: (error: Error) => void;\n\tonComplete?: () => void;\n};\n\n/**\n * Parse buffer for complete JSON objects (raw JSON streaming, not SSE format)\n * Handles concatenated JSON objects without newlines between them\n */\nfunction parseJSONBuffer(buffer: string): {\n\tevents: StreamEvent[];\n\tremaining: string;\n} {\n\tconst events: StreamEvent[] = [];\n\tlet braceCount = 0;\n\tlet startIndex = 0;\n\tlet inString = false;\n\tlet escapeNext = false;\n\tlet lastParsedIndex = -1;\n\n\t// Find complete JSON objects in the buffer\n\tfor (let i = 0; i < buffer.length; i++) {\n\t\tconst char = buffer[i];\n\n\t\tif (escapeNext) {\n\t\t\tescapeNext = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"\\\\\") {\n\t\t\tescapeNext = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"' && !escapeNext) {\n\t\t\tinString = !inString;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inString) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"{\") {\n\t\t\tif (braceCount === 0) {\n\t\t\t\tstartIndex = i;\n\t\t\t}\n\t\t\tbraceCount++;\n\t\t} else if (char === \"}\") {\n\t\t\tbraceCount--;\n\t\t\tif (braceCount === 0) {\n\t\t\t\t// Found a complete JSON object\n\t\t\t\tconst jsonStr = buffer.substring(startIndex, i + 1);\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(jsonStr);\n\t\t\t\t\tconst event = parsed as StreamEvent;\n\t\t\t\t\tevents.push(event);\n\t\t\t\t\tlastParsedIndex = i;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Failed to parse JSON event:\", jsonStr, err);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return parsed events and remaining buffer\n\tconst remaining =\n\t\tlastParsedIndex >= 0 ? buffer.substring(lastParsedIndex + 1) : buffer;\n\treturn { events, remaining };\n}\n\n/**\n * Stream workflow events from the API using XMLHttpRequest (React Native)\n * XMLHttpRequest provides better streaming support in React Native than fetch\n */\nexport async function streamWorkflowEvents(\n\turl: string,\n\tbody: Record<string, unknown>,\n\theaders: Record<string, string>,\n\toptions: StreamOptions = {}\n): Promise<void> {\n\tconst { signal, onEvent, onError, onComplete } = options;\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst xhr = new XMLHttpRequest();\n\t\tlet buffer = \"\";\n\t\tlet lastProcessedIndex = 0;\n\n\t\t// Handle abort signal\n\t\tconst abortHandler = () => {\n\t\t\txhr.abort();\n\t\t\tresolve();\n\t\t};\n\n\t\tif (signal) {\n\t\t\tsignal.addEventListener(\"abort\", abortHandler);\n\t\t}\n\n\t\t// Track progress and process chunks as they arrive\n\t\txhr.onprogress = () => {\n\t\t\tif (xhr.readyState === 3 || xhr.readyState === 4) {\n\t\t\t\t// Get the new data since last check\n\t\t\t\tconst newData = xhr.responseText.substring(lastProcessedIndex);\n\t\t\t\tlastProcessedIndex = xhr.responseText.length;\n\n\t\t\t\tif (newData) {\n\t\t\t\t\t// Append to buffer\n\t\t\t\t\tbuffer += newData;\n\n\t\t\t\t\t// Try to parse complete JSON objects from buffer\n\t\t\t\t\tconst { events, remaining } = parseJSONBuffer(buffer);\n\t\t\t\t\tfor (const event of events) {\n\t\t\t\t\t\tonEvent?.(event);\n\t\t\t\t\t}\n\t\t\t\t\t// Keep only the remaining unparsed portion\n\t\t\t\t\tbuffer = remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\txhr.onload = () => {\n\t\t\tif (signal) {\n\t\t\t\tsignal.removeEventListener(\"abort\", abortHandler);\n\t\t\t}\n\n\t\t\tif (xhr.status >= 200 && xhr.status < 300) {\n\t\t\t\t// Process any remaining buffer\n\t\t\t\tif (buffer.trim()) {\n\t\t\t\t\tconst { events } = parseJSONBuffer(buffer);\n\t\t\t\t\tfor (const event of events) {\n\t\t\t\t\t\tonEvent?.(event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tonComplete?.();\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\tconst error = new Error(`HTTP ${xhr.status}: ${xhr.responseText}`);\n\t\t\t\tonError?.(error);\n\t\t\t\treject(error);\n\t\t\t}\n\t\t};\n\n\t\txhr.onerror = () => {\n\t\t\tif (signal) {\n\t\t\t\tsignal.removeEventListener(\"abort\", abortHandler);\n\t\t\t}\n\t\t\tconst error = new Error(\"Network error\");\n\t\t\tonError?.(error);\n\t\t\treject(error);\n\t\t};\n\n\t\txhr.onabort = () => {\n\t\t\tif (signal) {\n\t\t\t\tsignal.removeEventListener(\"abort\", abortHandler);\n\t\t\t}\n\t\t\tresolve();\n\t\t};\n\n\t\t// Open and send request\n\t\txhr.open(\"POST\", url, true);\n\t\txhr.setRequestHeader(\"Content-Type\", \"application/json\");\n\t\txhr.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\t\"application/x-ndjson, text/event-stream, text/plain, */*\"\n\t\t);\n\n\t\t// Set custom headers\n\t\tfor (const [key, value] of Object.entries(headers)) {\n\t\t\txhr.setRequestHeader(key, value);\n\t\t}\n\n\t\txhr.send(JSON.stringify(body));\n\t});\n}\n","import type { StreamEvent } from \"./streamingClient\";\nimport type { StreamingStep, UserActionRequest, UserActionResult, UserActionType } from \"../types\";\n\n/**\n * Extract a user-friendly message from a streaming event\n */\nexport function getEventMessage(event: StreamEvent): string {\n\tif (event.message?.trim()) {\n\t\treturn event.message.trim();\n\t}\n\n\tif (event.errorMessage?.trim()) {\n\t\treturn event.errorMessage.trim();\n\t}\n\n\tconst eventType = event.eventType;\n\tswitch (eventType) {\n\t\tcase \"STARTED\":\n\t\tcase \"WORKFLOW_STARTED\":\n\t\t\treturn \"Starting workflow...\";\n\t\tcase \"ORCHESTRATOR_THINKING\":\n\t\t\treturn \"Planning execution strategy...\";\n\t\tcase \"ORCHESTRATOR_COMPLETED\":\n\t\t\treturn \"Planning complete\";\n\t\tcase \"INTENT_STARTED\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} started`\n\t\t\t\t: \"Processing intent...\";\n\t\tcase \"INTENT_PROGRESS\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} in progress`\n\t\t\t\t: \"Thinking...\";\n\t\tcase \"INTENT_COMPLETED\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} completed`\n\t\t\t\t: \"Intent completed\";\n\t\tcase \"AGGREGATOR_THINKING\":\n\t\t\treturn \"Combining results...\";\n\t\tcase \"AGGREGATOR_COMPLETED\":\n\t\t\treturn \"Results combined\";\n\t\tcase \"COMPLETED\":\n\t\tcase \"WORKFLOW_COMPLETED\":\n\t\t\treturn \"Workflow completed successfully\";\n\t\tcase \"ERROR\":\n\t\tcase \"WORKFLOW_ERROR\":\n\t\tcase \"INTENT_ERROR\":\n\t\t\treturn event.errorMessage || \"An error occurred\";\n\t\tcase \"USER_ACTION_REQUIRED\":\n\t\t\treturn \"Waiting for verification...\";\n\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\treturn \"Verification approved\";\n\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\treturn \"Verification expired\";\n\t\tcase \"USER_ACTION_INVALID\":\n\t\t\treturn \"Invalid code. Please try again.\";\n\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\treturn \"Verification cancelled\";\n\t\tcase \"USER_ACTION_RESENT\":\n\t\t\treturn \"Verification code resent\";\n\t\tcase \"USER_ACTION_FAILED\":\n\t\t\treturn \"Verification failed\";\n\t\tcase \"INTENT_THINKING\":\n\t\t\treturn event.workerName\n\t\t\t\t? `${event.workerName} thinking...`\n\t\t\t\t: \"Thinking...\";\n\t\tcase \"INTENT_THINKING_CONT\":\n\t\t\treturn event.message || \"\";\n\t\tcase \"KEEP_ALIVE\":\n\t\t\treturn \"\";\n\t\tdefault:\n\t\t\treturn eventType;\n\t}\n}\n\nfunction isUserActionPrompt(text: string): boolean {\n\treturn /\\benter\\b.+\\b(code|otp)\\b/i.test(text) ||\n\t\t/\\b(authorization|verification)\\s+code\\b/i.test(text) ||\n\t\t/\\bsent\\s+to\\s+your\\b/i.test(text);\n}\n\n/**\n * User-action events often reuse the original verification prompt as their\n * backend message. Normalize the display copy so the thinking timeline shows\n * the action outcome, not the stale prompt.\n */\nexport function getUserActionDisplayMessage(\n\teventType: string,\n\trawMessage?: string,\n): string {\n\tconst raw = rawMessage?.trim();\n\tconst safeRaw = raw && !isUserActionPrompt(raw) ? raw : \"\";\n\n\tswitch (eventType) {\n\t\tcase \"USER_ACTION_REQUIRED\":\n\t\t\treturn raw || \"Waiting for verification...\";\n\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\treturn safeRaw || \"Verification approved\";\n\t\tcase \"USER_ACTION_INVALID\":\n\t\t\treturn safeRaw || \"Invalid code. Please try again.\";\n\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\treturn safeRaw || \"Verification cancelled\";\n\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\treturn safeRaw || \"Verification expired\";\n\t\tcase \"USER_ACTION_RESENT\":\n\t\t\treturn safeRaw || \"Verification code resent\";\n\t\tcase \"USER_ACTION_FAILED\":\n\t\t\treturn safeRaw || \"Verification failed\";\n\t\tdefault:\n\t\t\treturn safeRaw || raw || eventType;\n\t}\n}\n\n/**\n * Orchestrator completion often includes \"Identified N task(s) to execute\", which is redundant in the UI.\n */\nexport function workingPhaseDetailForDisplay(raw: string): string {\n\tconst t = raw.trim();\n\tif (!t) return \"\";\n\tif (/^Identified\\s+\\d+\\s+tasks?\\s+to\\s+execute\\.?$/i.test(t)) {\n\t\treturn \"\";\n\t}\n\treturn t;\n}\n\n/**\n * Extract final response content from the event\n */\nexport function extractResponseContent(response: unknown): string {\n\t// Handle direct string response (most common from API)\n\tif (typeof response === \"string\") {\n\t\treturn response;\n\t}\n\n\t// Handle object responses with nested content\n\tif (typeof response === \"object\" && response !== null) {\n\t\tconst resp = response as Record<string, unknown>;\n\n\t\t// Try common field names\n\t\tif (\"text\" in resp && typeof resp.text === \"string\") {\n\t\t\treturn resp.text;\n\t\t}\n\t\tif (\"content\" in resp && typeof resp.content === \"string\") {\n\t\t\treturn resp.content;\n\t\t}\n\t\tif (\"message\" in resp && typeof resp.message === \"string\") {\n\t\t\treturn resp.message;\n\t\t}\n\t\tif (\"answer\" in resp && typeof resp.answer === \"string\") {\n\t\t\treturn resp.answer;\n\t\t}\n\n\t\t// Fallback to JSON string\n\t\treturn JSON.stringify(response);\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Complete the last in-progress step (if any) by marking it as completed.\n */\nfunction completeLastInProgressStep(steps: StreamingStep[]): void {\n\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\tif (steps[i].status === \"in_progress\") {\n\t\t\tsteps[i].status = \"completed\";\n\t\t\treturn;\n\t\t}\n\t}\n}\n\n/** State shape used by processStreamEvent */\nexport type EventProcessorState = {\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\tcurrentThinkingStepId?: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\n\t/** Current thinking block text (resets each INTENT_THINKING) — shown live in bubble */\n\tactiveThinkingText?: string;\n\t/** All thinking accumulated across every block — shown after streaming ends */\n\tallThinkingText: string;\n\t/** True between ORCHESTRATOR_THINKING and ORCHESTRATOR_COMPLETED; thinking text is hidden in bubble during this phase */\n\tinOrchestratorPhase: boolean;\n\t/** True between AGGREGATOR_THINKING and AGGREGATOR_COMPLETED; thinking text is hidden in bubble during this phase */\n\tinAggregatorPhase: boolean;\n};\n\n/**\n * Process streaming event and update state\n */\nexport function processStreamEvent(\n\tevent: StreamEvent,\n\tstate: EventProcessorState,\n): EventProcessorState {\n\tconst eventType = event.eventType;\n\n\t// Ignore keep-alive events from backend — do not show or process in UI (case-insensitive for robustness)\n\tif (typeof eventType === \"string\" && eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\treturn state;\n\t}\n\n\tconst message = getEventMessage(event);\n\n\t// Close any active thinking block when a non-thinking event arrives\n\tif (eventType !== \"INTENT_THINKING\" && eventType !== \"INTENT_THINKING_CONT\") {\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst thinkingStep = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (thinkingStep) {\n\t\t\t\tthinkingStep.isThinking = false;\n\t\t\t}\n\t\t\tstate.currentThinkingStepId = undefined;\n\t\t}\n\t\t// Clear live thinking so the bubble can show the current step instead\n\t\tstate.activeThinkingText = undefined;\n\t}\n\n\t// Only extract response content from WORKFLOW_COMPLETED event.\n\t// When the workflow completes with a response (e.g. after INTENT_ERROR), use it as the message and clear intent-level error so we show the agent response, not \"Oops something went wrong\".\n\t// When there is no response/workflowMsg (e.g. preflight failed, aggregator failed), show \"Oops, something went wrong\".\n\tif (eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") {\n\t\tlet content = extractResponseContent(event.response);\n\t\tconst trace = event.trace && typeof event.trace === \"object\" ? (event.trace as Record<string, unknown>) : null;\n\t\tif (!content && trace?.workflowMsg && typeof trace.workflowMsg === \"string\") {\n\t\t\tcontent = trace.workflowMsg;\n\t\t}\n\t\tif (!content && trace?.aggregator && typeof trace.aggregator === \"object\") {\n\t\t\tconst agg = trace.aggregator as Record<string, unknown>;\n\t\t\tif (typeof agg.response === \"string\") content = agg.response;\n\t\t\telse content = extractResponseContent(agg.response);\n\t\t}\n\t\tif (content) {\n\t\t\tstate.accumulatedContent = content;\n\t\t\tstate.finalData = event.response ?? event.trace;\n\t\t\t// Subintent may have failed (INTENT_ERROR) but workflow still produced a response — show it, not the error.\n\t\t\tstate.hasError = false;\n\t\t\tstate.errorMessage = \"\";\n\t\t} else {\n\t\t\t// No workflow response (e.g. preflight failed, aggregator failed) — show \"Oops, something went wrong\"\n\t\t\tstate.hasError = true;\n\t\t\tstate.errorMessage = \"WORKFLOW_FAILED\";\n\t\t}\n\t}\n\n\t// Skip WORKFLOW_STARTED - don't show it in UI\n\tif (eventType === \"STARTED\" || eventType === \"WORKFLOW_STARTED\") {\n\t\t// Skip this event, don't add a step\n\t} else if (eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") {\n\t\t// Mark all in-progress steps as completed (for final workflow completion)\n\t\tstate.steps.forEach((step) => {\n\t\t\tif (step.status === \"in_progress\") {\n\t\t\t\tstep.status = \"completed\";\n\t\t\t}\n\t\t});\n\t} else if (eventType === \"INTENT_ERROR\") {\n\t\t// Subintent failed — do NOT set hasError. Workflow may still complete with a response (WORKFLOW_COMPLETED).\n\t\t// Only WORKFLOW_FAILED / ERROR / WORKFLOW_ERROR set hasError. Mark the step as error for UI.\n\t\tstate.errorMessage = message || event.errorMessage || \"An error occurred\";\n\n\t\t// Mark any in-progress intent step as error\n\t\tconst intentStep = state.steps.find(\n\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (intentStep) {\n\t\t\tintentStep.status = \"error\";\n\t\t}\n\t} else if (eventType === \"ERROR\" || eventType === \"WORKFLOW_ERROR\") {\n\t\t// Mark as error and store error message (don't add as step)\n\t\tstate.hasError = true;\n\t\tstate.errorMessage = message || event.errorMessage || \"An error occurred\";\n\t} else if (eventType === \"ORCHESTRATOR_COMPLETED\") {\n\t\tstate.inOrchestratorPhase = false;\n\t\t// Complete the ORCHESTRATOR_THINKING step\n\t\tconst orchestratorStep = state.steps.find(\n\t\t\t(s) =>\n\t\t\t\ts.eventType === \"ORCHESTRATOR_THINKING\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (orchestratorStep) {\n\t\t\torchestratorStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\torchestratorStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (orchestratorStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (eventType === \"INTENT_COMPLETED\") {\n\t\t// Complete the INTENT_STARTED step\n\t\tconst intentStep = state.steps.find(\n\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (intentStep) {\n\t\t\tintentStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\tintentStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (intentStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (eventType === \"AGGREGATOR_COMPLETED\") {\n\t\tstate.inAggregatorPhase = false;\n\t\t// Complete the AGGREGATOR_THINKING step\n\t\tconst aggregatorStep = state.steps.find(\n\t\t\t(s) =>\n\t\t\t\ts.eventType === \"AGGREGATOR_THINKING\" && s.status === \"in_progress\"\n\t\t);\n\t\tif (aggregatorStep) {\n\t\t\taggregatorStep.status = \"completed\";\n\t\t\tif (event.elapsedMs) {\n\t\t\t\taggregatorStep.elapsedMs = event.elapsedMs;\n\t\t\t}\n\t\t\tif (aggregatorStep.id === state.currentExecutingStepId) {\n\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t}\n\t} else if (\n\t\teventType === \"ORCHESTRATOR_THINKING\" ||\n\t\teventType === \"INTENT_STARTED\" ||\n\t\teventType === \"INTENT_PROGRESS\" ||\n\t\teventType === \"AGGREGATOR_THINKING\"\n\t) {\n\t\tif (eventType === \"ORCHESTRATOR_THINKING\") {\n\t\t\tstate.inOrchestratorPhase = true;\n\t\t}\n\t\tif (eventType === \"AGGREGATOR_THINKING\") {\n\t\t\tstate.inAggregatorPhase = true;\n\t\t}\n\t\t// Only add steps for important events\n\t\tif (eventType === \"INTENT_PROGRESS\") {\n\t\t\t// Update existing INTENT_STARTED step message if it exists\n\t\t\tconst intentStep = state.steps.find(\n\t\t\t\t(s) => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\"\n\t\t\t);\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.message = message;\n\t\t\t\tstate.currentExecutingStepId = intentStep.id;\n\t\t\t} else {\n\t\t\t\t// No existing intent step, create one\n\t\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\t\tstate.steps.push({\n\t\t\t\t\tid: stepId,\n\t\t\t\t\teventType: \"INTENT_STARTED\",\n\t\t\t\t\tmessage,\n\t\t\t\t\tstatus: \"in_progress\",\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t\t});\n\t\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\t}\n\t\t} else {\n\t\t\t// Add progress step for THINKING and STARTED events\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t}\n\t}\n\t// ============================================\n\t// USER_ACTION events\n\t// ============================================\n\telse if (eventType === \"USER_ACTION_REQUIRED\") {\n\t\t// Complete any prior in-progress step\n\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t// Store the request data from the event\n\t\tif (event.userActionRequest) {\n\t\t\tstate.userActionRequest = {\n\t\t\t\tuserActionId: event.userActionRequest.userActionId,\n\t\t\t\tuserActionType: event.userActionRequest.userActionType as UserActionType | undefined,\n\t\t\t\tmessage: event.userActionRequest.message,\n\t\t\t\trequestedSchema: event.userActionRequest.requestedSchema,\n\t\t\t\tmetadata: event.userActionRequest.metadata,\n\t\t\t};\n\t\t}\n\t\tstate.userActionPending = true;\n\t\tconst displayMessage = getUserActionDisplayMessage(\n\t\t\teventType,\n\t\t\t(event.userActionRequest?.message as string | undefined) || message,\n\t\t);\n\n\t\t// Add an in_progress step\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"in_progress\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t\tstate.currentExecutingStepId = stepId;\n\t} else if (eventType === \"USER_ACTION_SUCCESS\") {\n\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message);\n\t\tcompleteLastInProgressStep(state.steps);\n\t\tstate.userActionRequest = undefined;\n\t\tstate.userActionPending = false;\n\t\tstate.userActionResult = \"approved\";\n\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"completed\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"USER_ACTION_INVALID\") {\n\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message);\n\t\t// Complete the prior USER_ACTION step (REQUIRED or previous INVALID retry)\n\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t// Add as error step (red cross)\n\t\tconst errorStepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: errorStepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"error\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\n\t\t// Add a new in_progress step so the spinner stays visible while user retries\n\t\t// and so subsequent events (another INVALID, SUCCESS, etc.) have a step to complete\n\t\tconst retryStepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: retryStepId,\n\t\t\teventType: \"USER_ACTION_REQUIRED\",\n\t\t\tmessage: \"Waiting for verification...\",\n\t\t\tstatus: \"in_progress\",\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t\tstate.currentExecutingStepId = retryStepId;\n\t\t// userActionRequest and userActionPending stay set (modal stays open)\n\t} else if (eventType === \"USER_ACTION_EXPIRED\") {\n\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message);\n\t\tcompleteLastInProgressStep(state.steps);\n\t\tstate.userActionRequest = undefined;\n\t\tstate.userActionPending = false;\n\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"error\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"USER_ACTION_REJECTED\") {\n\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message);\n\t\tcompleteLastInProgressStep(state.steps);\n\t\tstate.userActionRequest = undefined;\n\t\tstate.userActionPending = false;\n\t\tstate.userActionResult = \"rejected\";\n\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"completed\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"USER_ACTION_RESENT\") {\n\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message);\n\t\t// Informational only -- don't complete the prior step\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"completed\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"USER_ACTION_FAILED\") {\n\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message || event.errorMessage);\n\t\tcompleteLastInProgressStep(state.steps);\n\t\tstate.userActionRequest = undefined;\n\t\tstate.userActionPending = false;\n\n\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\tstate.steps.push({\n\t\t\tid: stepId,\n\t\t\teventType,\n\t\t\tmessage: displayMessage,\n\t\t\tstatus: \"error\",\n\t\t\ttimestamp: Date.now(),\n\t\t\telapsedMs: event.elapsedMs,\n\t\t});\n\t} else if (eventType === \"INTENT_THINKING\") {\n\t\t// Close previous thinking block if a new one arrives back-to-back\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst prev = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (prev) prev.isThinking = false;\n\t\t}\n\n\t\tconst lastInProgress = [...state.steps].reverse().find(s => s.status === \"in_progress\");\n\t\tif (lastInProgress) {\n\t\t\tlastInProgress.thinkingText = \"\";\n\t\t\tlastInProgress.isThinking = true;\n\t\t\tstate.currentThinkingStepId = lastInProgress.id;\n\t\t} else {\n\t\t\tstate.currentThinkingStepId = undefined;\n\t\t}\n\n\t\tif (state.allThinkingText) state.allThinkingText += \"\\n\\n\";\n\t\t// Only show thinking in bubble when NOT in orchestrator or aggregator phase\n\t\tif (!state.inOrchestratorPhase && !state.inAggregatorPhase) {\n\t\t\tstate.activeThinkingText = \"\";\n\t\t}\n\t} else if (eventType === \"INTENT_THINKING_CONT\") {\n\t\tconst delta = event.message || \"\";\n\t\tif (!delta) return state;\n\n\t\tif (state.currentThinkingStepId) {\n\t\t\tconst step = state.steps.find(s => s.id === state.currentThinkingStepId);\n\t\t\tif (step) {\n\t\t\t\tstep.thinkingText = (step.thinkingText || \"\") + delta;\n\t\t\t}\n\t\t}\n\n\t\tstate.allThinkingText += delta;\n\t\t// Only show thinking in bubble when NOT in orchestrator or aggregator phase\n\t\tif (!state.inOrchestratorPhase && !state.inAggregatorPhase) {\n\t\t\tif (state.activeThinkingText == null) state.activeThinkingText = \"\";\n\t\t\tstate.activeThinkingText += delta;\n\t\t}\n\t}\n\t// All other events are ignored and not shown as steps\n\n\treturn state;\n}\n","import type { MessageDisplay, StreamingStep, UserActionResult } from \"../types\";\nimport {\n\tgetUserActionDisplayMessage,\n\tworkingPhaseDetailForDisplay,\n} from \"./eventProcessor\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/**\n * Build a richly-formatted thinking string from the SDK's `steps` array\n * and raw `allThinkingText`. This matches the demo's streaming format\n * so both the SDK and demo produce identical thinking output.\n *\n * The SDK's `allThinkingText` only contains raw `INTENT_THINKING_CONT`\n * deltas — no phase headers. This function reconstructs the full format\n * from the steps array, which stores every event the SDK processes.\n */\nexport function buildFormattedThinking(\n\tsteps: StreamingStep[] | undefined,\n\tallThinkingText: string,\n): string {\n\tconst parts: string[] = [];\n\tconst safeSteps = steps ?? [];\n\n\t// Detect orphaned \"preflight\" thinking:\n\t// INTENT_THINKING events that fire before any INTENT_STARTED don't\n\t// create steps, so their text lives only in allThinkingText.\n\tconst cleanAll = allThinkingText.replace(/^\\s+/, \"\");\n\tif (cleanAll) {\n\t\tconst firstStepWithThinking = safeSteps.find(\n\t\t\t(s) => s.thinkingText && s.thinkingText.trim(),\n\t\t);\n\n\t\tif (!firstStepWithThinking) {\n\t\t\tparts.push(\"**Preflight**\");\n\t\t\tparts.push(cleanAll);\n\t\t} else {\n\t\t\tconst stepText = firstStepWithThinking.thinkingText!.trim();\n\t\t\tconst idx = cleanAll.indexOf(stepText);\n\t\t\tif (idx > 0) {\n\t\t\t\tconst orphaned = cleanAll.substring(0, idx).replace(/\\s+$/, \"\");\n\t\t\t\tif (orphaned) {\n\t\t\t\t\tparts.push(\"**Preflight**\");\n\t\t\t\t\tparts.push(orphaned);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build formatted sections from steps\n\tfor (const step of safeSteps) {\n\t\tswitch (step.eventType) {\n\t\t\tcase \"ORCHESTRATOR_THINKING\":\n\t\t\t\tparts.push(\"**Planning**\");\n\t\t\t\tif (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"WORKING\": {\n\t\t\t\tconst detail = workingPhaseDetailForDisplay(step.message || \"\");\n\t\t\t\tparts.push(\"**Working**\");\n\t\t\t\tif (detail) parts.push(detail);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"INTENT_STARTED\": {\n\t\t\t\tlet label = step.message || \"Processing\";\n\t\t\t\tconst started = label.match(/^(.+?)\\s+started$/i);\n\t\t\t\tconst progress = label.match(/^(.+?)\\s+in progress$/i);\n\t\t\t\tif (started) label = started[1];\n\t\t\t\telse if (progress) label = progress[1];\n\t\t\t\tparts.push(`**${label}**`);\n\t\t\t\tif (step.thinkingText) parts.push(step.thinkingText);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"INTENT_PROGRESS\": {\n\t\t\t\tif (step.thinkingText) parts.push(step.thinkingText);\n\t\t\t\telse if (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"AGGREGATOR_THINKING\":\n\t\t\t\tparts.push(\"**Finalizing**\");\n\t\t\t\tif (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_REQUIRED\":\n\t\t\t\tparts.push(\"**Verification Required**\");\n\t\t\t\tif (step.message) {\n\t\t\t\t\tparts.push(getUserActionDisplayMessage(step.eventType, step.message));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\t\tparts.push(`✓ ${getUserActionDisplayMessage(step.eventType, step.message)}`);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\t\tparts.push(getUserActionDisplayMessage(step.eventType, step.message));\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\t\tparts.push(`✗ ${getUserActionDisplayMessage(step.eventType, step.message)}`);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_INVALID\":\n\t\t\t\tparts.push(`✗ ${getUserActionDisplayMessage(step.eventType, step.message)}`);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_RESENT\":\n\t\t\t\tparts.push(getUserActionDisplayMessage(step.eventType, step.message));\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_FAILED\":\n\t\t\t\tparts.push(`✗ ${getUserActionDisplayMessage(step.eventType, step.message)}`);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn parts.length > 0 ? parts.join(\"\\n\") : allThinkingText;\n}\n\n/**\n * Create streaming message update with error handling\n */\nexport function createStreamingMessageUpdate(state: {\n\thasError: boolean;\n\terrorMessage: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\tcurrentMessage?: string;\n\texecutionId?: string;\n\tsessionId?: string;\n\tsteps: StreamingStep[];\n\tcurrentExecutingStepId?: string;\n\tuserActionResult?: UserActionResult;\n\tactiveThinkingText?: string;\n\tallThinkingText?: string;\n}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\tconst steps = state.hasError ? [] : [...state.steps];\n\tconst allThinking = state.hasError ? undefined : state.allThinkingText;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? FRIENDLY_ERROR_MESSAGE\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : \"\",\n\t\tcurrentMessage: state.hasError ? undefined : state.currentMessage,\n\t\tstreamProgress: state.hasError ? (\"error\" as const) : (\"processing\" as const),\n\t\tisError: state.hasError,\n\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\texecutionId: state.executionId,\n\t\tsessionId: state.sessionId,\n\t\tsteps,\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\n\t\tuserActionResult: state.userActionResult,\n\t\tactiveThinkingText: state.hasError ? undefined : state.activeThinkingText,\n\t\tallThinkingText: allThinking,\n\t\tformattedThinkingText: state.hasError ? undefined : buildFormattedThinking(steps, allThinking || \"\"),\n\t};\n}\n\n/**\n * Create error message update for abort or error scenarios\n */\nexport function createErrorMessageUpdate(\n\terror: Error,\n\tstate: {\n\t\taccumulatedContent: string;\n\t\tcurrentMessage?: string;\n\t\tsteps: StreamingStep[];\n\t}\n): Partial<MessageDisplay> {\n\tconst isAborted = error.name === \"AbortError\";\n\n\treturn {\n\t\tisStreaming: false,\n\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\tisError: !isAborted,\n\t\tisCancelled: isAborted,\n\t\terrorDetails: isAborted ? undefined : error.message,\n\t\tcontent: isAborted\n\t\t\t? state.accumulatedContent || \"\"\n\t\t\t: state.accumulatedContent || FRIENDLY_ERROR_MESSAGE,\n\t\t// Preserve currentMessage when cancelled so UI can show it\n\t\tcurrentMessage: isAborted ? state.currentMessage || \"Thinking...\" : undefined,\n\t\tsteps: [...state.steps].map((step) => {\n\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t}\n\t\t\treturn step;\n\t\t}),\n\t\tcurrentExecutingStepId: undefined,\n\t};\n}\n\n/**\n * Create final completed message\n */\nexport function createFinalMessage(\n\tstreamingId: string,\n\tstate: {\n\t\thasError: boolean;\n\t\terrorMessage: string;\n\t\taccumulatedContent: string;\n\t\tsessionId?: string;\n\t\texecutionId?: string;\n\t\tfinalData?: unknown;\n\t\tsteps: StreamingStep[];\n\t\tuserActionResult?: UserActionResult;\n\t\tallThinkingText?: string;\n\t\tisResolvingImages?: boolean;\n\t}\n): MessageDisplay {\n\tconst steps = state.hasError ? [] : [...state.steps];\n\tconst allThinking = state.hasError ? undefined : state.allThinkingText;\n\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : state.accumulatedContent || \"\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tisStreaming: false,\n\t\tstreamProgress: state.hasError ? \"error\" : \"completed\",\n\t\tisError: state.hasError,\n\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\texecutionId: state.executionId,\n\t\ttracingData: state.finalData,\n\t\tsteps,\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\n\t\tuserActionResult: state.userActionResult,\n\t\tactiveThinkingText: undefined,\n\t\tallThinkingText: allThinking,\n\t\tformattedThinkingText: state.hasError ? undefined : buildFormattedThinking(steps, allThinking || \"\"),\n\t\tisResolvingImages: state.hasError ? undefined : state.isResolvingImages,\n\t};\n}\n\n/**\n * Create cancelled message update\n */\nexport function createCancelledMessageUpdate(\n\tsteps: StreamingStep[],\n\tcurrentMessage?: string\n): Partial<MessageDisplay> {\n\tconst updatedSteps = steps.map((step) => {\n\t\tif (step.status === \"in_progress\") {\n\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t}\n\t\treturn step;\n\t});\n\n\treturn {\n\t\tisStreaming: false,\n\t\tisCancelled: true,\n\t\tsteps: updatedSteps,\n\t\tcurrentExecutingStepId: undefined,\n\t\t// Preserve currentMessage so UI can show it with X icon\n\t\tcurrentMessage: currentMessage || \"Thinking...\",\n\t};\n}\n","import type { BaseChatConfig } from \"../types\";\n\n/**\n * Build request body for streaming workflow\n */\nexport function buildRequestBody(\n\tconfig: BaseChatConfig,\n\tuserMessage: string,\n\tsessionId?: string,\n): Record<string, unknown> {\n\tconst owner = config.session?.owner;\n\tconst sessionAttributes =\n\t\towner?.attributes && Object.keys(owner.attributes).length > 0\n\t\t\t? owner.attributes\n\t\t\t: undefined;\n\n\treturn {\n\t\tworkflowName: config.workflow.name,\n\t\tuserInput: userMessage,\n\t\tsessionId,\n\t\tsessionOwnerId: owner?.id || \"\",\n\t\tsessionOwnerLabel: owner?.name || \"\",\n\t\tsessionAttributes,\n\t\toptions: {\n\t\t\tclientTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\t},\n\t};\n}\n\nfunction getStageParamName(config: BaseChatConfig): string {\n\treturn config.api.stageQueryParam ?? \"stage\";\n}\n\nfunction getStage(config: BaseChatConfig): string {\n\treturn config.workflow.stage ?? \"DEV\";\n}\n\n/**\n * Build streaming URL\n */\nexport function buildStreamingUrl(config: BaseChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst queryParams = new URLSearchParams({\n\t\t[getStageParamName(config)]: getStage(config),\n\t});\n\n\tif (config.workflow.version !== undefined) {\n\t\tqueryParams.append(\"workflowVersion\", String(config.workflow.version));\n\t}\n\n\treturn `${config.api.baseUrl}${endpoint}?${queryParams.toString()}`;\n}\n\nfunction deriveBasePath(config: BaseChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst [endpointPath] = endpoint.split(\"?\");\n\tconst normalized = endpointPath.replace(/\\/+$/, \"\");\n\treturn normalized.endsWith(\"/stream\")\n\t\t? normalized.slice(0, -\"/stream\".length)\n\t\t: normalized;\n}\n\n/**\n * Build user action URL (submit / cancel / resend)\n */\nexport function buildUserActionUrl(\n\tconfig: BaseChatConfig,\n\tuserActionId: string,\n\taction: \"submit\" | \"cancel\" | \"resend\",\n): string {\n\tconst basePath = deriveBasePath(config);\n\tconst encodedUserActionId = encodeURIComponent(userActionId);\n\treturn `${config.api.baseUrl}${basePath}/user-action/${encodedUserActionId}/${action}`;\n}\n\n/**\n * Build resolve-image-urls endpoint URL.\n */\nexport function buildResolveImagesUrl(config: BaseChatConfig): string {\n\tif (config.api.resolveImagesEndpoint) {\n\t\treturn `${config.api.baseUrl}${config.api.resolveImagesEndpoint}`;\n\t}\n\treturn `${config.api.baseUrl}${deriveBasePath(config)}/resolve-image-urls`;\n}\n\n/**\n * Build request headers\n */\nexport function buildRequestHeaders(config: BaseChatConfig): Record<string, string> {\n\tconst headers: Record<string, string> = { ...config.api.headers };\n\tif (config.api.authToken) {\n\t\theaders.Authorization = `Bearer ${config.api.authToken}`;\n\t}\n\treturn headers;\n}\n\n/**\n * Composite scope key for chatStore / activeStreamStore.\n * Same (userId, workflow id, version, stage) → same state across unmount/remount.\n */\nexport function buildScopeKey(config: BaseChatConfig): string {\n\treturn [\n\t\tconfig.session?.userId ?? \"\",\n\t\tconfig.workflow.id ?? \"\",\n\t\tconfig.workflow.version ?? \"\",\n\t\tconfig.workflow.stage ?? \"\",\n\t].join(\"|\");\n}\n","import type { BaseChatConfig } from \"../types\";\nimport { buildUserActionUrl, buildRequestHeaders } from \"./requestBuilder\";\n\ntype UserActionResponse = {\n\tsuccess: boolean;\n\tmessage: string;\n};\n\n/**\n * Internal helper — sends a POST to a user-action endpoint and returns the\n * parsed JSON response. Throws on non-2xx status or JSON parse failure.\n */\nasync function sendUserActionRequest(\n\tconfig: BaseChatConfig,\n\tuserActionId: string,\n\taction: \"submit\" | \"cancel\" | \"resend\",\n\tdata?: Record<string, unknown>,\n): Promise<UserActionResponse> {\n\tconst url = buildUserActionUrl(config, userActionId, action);\n\tconst baseHeaders = buildRequestHeaders(config);\n\tconst hasBody = data !== undefined;\n\tconst headers = hasBody\n\t\t? { \"Content-Type\": \"application/json\", ...baseHeaders }\n\t\t: baseHeaders;\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: hasBody ? JSON.stringify(data) : undefined,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t}\n\n\treturn await response.json();\n}\n\n/**\n * Submit a user action (e.g. OTP verification)\n */\nexport async function submitUserAction(\n\tconfig: BaseChatConfig,\n\tuserActionId: string,\n\tdata?: Record<string, unknown>,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"submit\", data);\n}\n\n/**\n * Cancel / reject a user action\n */\nexport async function cancelUserAction(\n\tconfig: BaseChatConfig,\n\tuserActionId: string,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"cancel\");\n}\n\n/**\n * Resend a user action (e.g. request a new OTP)\n */\nexport async function resendUserAction(\n\tconfig: BaseChatConfig,\n\tuserActionId: string,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"resend\");\n}\n","import { createMMKV } from \"react-native-mmkv\";\nimport type { MessageDisplay } from \"../types\";\n\nconst storage = createMMKV({ id: \"payman-chat-store\" });\n\nexport const chatStore = {\n\tget(key: string): MessageDisplay[] {\n\t\tconst raw = storage.getString(key);\n\t\tif (!raw) return [];\n\t\ttry {\n\t\t\treturn JSON.parse(raw) as MessageDisplay[];\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t},\n\tset(key: string, messages: MessageDisplay[]): void {\n\t\tstorage.set(key, JSON.stringify(messages));\n\t},\n\tdelete(key: string): void {\n\t\tstorage.delete(key);\n\t},\n};\n","import type { MessageDisplay } from \"../types\";\nimport { chatStore } from \"./chatStore\";\n\ntype Listener = (messages: MessageDisplay[], isWaiting: boolean) => void;\n\ntype StreamEntry = {\n\tmessages: MessageDisplay[];\n\tisWaiting: boolean;\n\tabortController: AbortController;\n\tlisteners: Set<Listener>;\n};\n\n// Keyed by userId — lives at module scope so it survives component unmount/remount\nconst streams = new Map<string, StreamEntry>();\n\nexport const activeStreamStore = {\n\thas(key: string): boolean {\n\t\treturn streams.has(key);\n\t},\n\n\tget(key: string): { messages: MessageDisplay[]; isWaiting: boolean } | null {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return null;\n\t\treturn { messages: entry.messages, isWaiting: entry.isWaiting };\n\t},\n\n\t// Called before startStream — registers the controller and initial messages\n\tstart(key: string, abortController: AbortController, initialMessages: MessageDisplay[]): void {\n\t\tconst existing = streams.get(key);\n\t\tstreams.set(key, {\n\t\t\tmessages: initialMessages,\n\t\t\tisWaiting: true,\n\t\t\tabortController,\n\t\t\tlisteners: existing?.listeners ?? new Set(),\n\t\t});\n\t},\n\n\t// Called by the stream on every event — applies the same updater pattern React uses\n\tapplyMessages(\n\t\tkey: string,\n\t\tupdater: MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[])\n\t): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tconst next = typeof updater === \"function\" ? updater(entry.messages) : updater;\n\t\tentry.messages = next;\n\t\tentry.listeners.forEach((l) => l(next, entry.isWaiting));\n\t},\n\n\tsetWaiting(key: string, waiting: boolean): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.isWaiting = waiting;\n\t\tentry.listeners.forEach((l) => l(entry.messages, waiting));\n\t},\n\n\t// Called when stream completes — persists to chatStore and cleans up\n\tcomplete(key: string): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.isWaiting = false;\n\t\tentry.listeners.forEach((l) => l(entry.messages, false));\n\t\tconst toSave = entry.messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) chatStore.set(key, toSave);\n\t\tstreams.delete(key);\n\t},\n\n\t// Subscribe — returns unsubscribe fn. Component calls this on mount, cleanup on unmount.\n\tsubscribe(key: string, listener: Listener): () => void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return () => {};\n\t\tentry.listeners.add(listener);\n\t\treturn () => {\n\t\t\tstreams.get(key)?.listeners.delete(listener);\n\t\t};\n\t},\n\n\t// Explicit user cancel — aborts the controller and removes the entry\n\tabort(key: string): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.abortController.abort();\n\t\tstreams.delete(key);\n\t},\n};\n","import type { StreamEvent } from \"./streamingClient\";\nimport type { StreamingStep, UserActionRequest, UserActionResult, UserActionType } from \"../types\";\nimport {\n\textractResponseContent,\n\tgetEventMessage,\n\tgetUserActionDisplayMessage,\n\tworkingPhaseDetailForDisplay,\n} from \"./eventProcessor\";\n\nexport type V2EventProcessorState = {\n\tformattedThinkingText: string;\n\tfinalResponse: string;\n\tcurrentWorker: string;\n\tlastEventType: string;\n\tsessionId?: string;\n\texecutionId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n};\n\nfunction getEventText(event: StreamEvent, field: string): string {\n\tconst value = event[field];\n\treturn typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction shouldShowIntentHeader(event: StreamEvent): boolean {\n\tconst workerName = getEventText(event, \"workerName\");\n\tconst intentId = getEventText(event, \"intentId\");\n\treturn Boolean(workerName && intentId && workerName === intentId);\n}\n\nfunction addThinkingHeader(state: V2EventProcessorState, header: string) {\n\tstate.formattedThinkingText += (state.formattedThinkingText ? \"\\n\" : \"\") + header;\n}\n\nfunction addThinkingDetail(state: V2EventProcessorState, detail: string) {\n\tconst trimmed = detail.trim();\n\tif (!trimmed) return;\n\tstate.formattedThinkingText += (state.formattedThinkingText ? \"\\n\" : \"\") + trimmed;\n}\n\nfunction addThinkingLine(state: V2EventProcessorState, header: string, detail: string) {\n\tstate.formattedThinkingText += (state.formattedThinkingText ? \"\\n\" : \"\") + header + \"\\n\" + detail;\n}\n\nfunction appendThinkingText(state: V2EventProcessorState, text: string) {\n\tstate.formattedThinkingText += text;\n}\n\nfunction completeLastInProgressStep(steps: StreamingStep[]): void {\n\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\tif (steps[i].status === \"in_progress\") {\n\t\t\tsteps[i].status = \"completed\";\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport function createInitialV2State(): V2EventProcessorState {\n\treturn {\n\t\tformattedThinkingText: \"\",\n\t\tfinalResponse: \"\",\n\t\tcurrentWorker: \"\",\n\t\tlastEventType: \"\",\n\t\tsessionId: undefined,\n\t\texecutionId: undefined,\n\t\thasError: false,\n\t\terrorMessage: \"\",\n\t\tuserActionRequest: undefined,\n\t\tuserActionPending: false,\n\t\tuserActionResult: undefined,\n\t\tfinalData: undefined,\n\t\tsteps: [],\n\t\tstepCounter: 0,\n\t\tcurrentExecutingStepId: undefined,\n\t};\n}\n\nexport function processStreamEventV2(\n\tevent: StreamEvent,\n\tstate: V2EventProcessorState,\n): V2EventProcessorState {\n\tconst eventType = event.eventType;\n\n\tif (typeof eventType === \"string\" && eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\tif (event.executionId) state.executionId = event.executionId;\n\t\tif (event.sessionId) state.sessionId = event.sessionId;\n\t\treturn state;\n\t}\n\n\tif (event.executionId) state.executionId = event.executionId;\n\tif (event.sessionId) state.sessionId = event.sessionId;\n\n\tconst message = getEventMessage(event);\n\n\tswitch (eventType) {\n\t\tcase \"WORKFLOW_STARTED\":\n\t\tcase \"STARTED\":\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\n\t\tcase \"INTENT_THINKING\": {\n\t\t\tconst worker = getEventText(event, \"workerName\") || \"Worker\";\n\t\t\tconst msg = getEventText(event, \"message\") || \"Thinking...\";\n\t\t\tconst showHeader = shouldShowIntentHeader(event);\n\n\t\t\tif (worker !== state.currentWorker) {\n\t\t\t\tstate.currentWorker = worker;\n\t\t\t\tif (showHeader && msg && msg !== worker) {\n\t\t\t\t\taddThinkingLine(state, `**${worker}**`, msg);\n\t\t\t\t} else if (showHeader) {\n\t\t\t\t\taddThinkingHeader(state, `**${worker}**`);\n\t\t\t\t} else if (msg && msg !== \"Thinking...\") {\n\t\t\t\t\taddThinkingDetail(state, msg);\n\t\t\t\t}\n\t\t\t} else if (msg && (showHeader || msg !== \"Thinking...\")) {\n\t\t\t\tappendThinkingText(state, \"\\n\" + msg);\n\t\t\t}\n\n\t\t\t// Backward-compat step tracking\n\t\t\tconst lastInProgress = [...state.steps].reverse().find(s => s.status === \"in_progress\");\n\t\t\tif (lastInProgress) {\n\t\t\t\tlastInProgress.thinkingText = \"\";\n\t\t\t\tlastInProgress.isThinking = true;\n\t\t\t}\n\n\t\t\tstate.lastEventType = \"INTENT_THINKING\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_THINKING_CONT\": {\n\t\t\tconst msg = (event.message as string) || \"\";\n\t\t\tif (!msg) break;\n\n\t\t\tif (state.lastEventType === \"INTENT_THINKING\") {\n\t\t\t\tappendThinkingText(state, \"\\n\" + msg);\n\t\t\t} else {\n\t\t\t\tappendThinkingText(state, msg);\n\t\t\t}\n\n\t\t\tconst thinkingStep = [...state.steps].reverse().find(s => s.isThinking);\n\t\t\tif (thinkingStep) {\n\t\t\t\tthinkingStep.thinkingText = (thinkingStep.thinkingText || \"\") + msg;\n\t\t\t}\n\n\t\t\tstate.lastEventType = \"INTENT_THINKING_CONT\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"ORCHESTRATOR_THINKING\": {\n\t\t\taddThinkingLine(state, \"**Planning**\", (event.message as string) || \"Understanding your request...\");\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"ORCHESTRATOR_COMPLETED\": {\n\t\t\tconst workingDetail = workingPhaseDetailForDisplay(message);\n\t\t\tif (workingDetail) {\n\t\t\t\taddThinkingLine(state, \"**Working**\", workingDetail);\n\t\t\t} else {\n\t\t\t\taddThinkingHeader(state, \"**Working**\");\n\t\t\t}\n\n\t\t\tstate.steps.push({\n\t\t\t\tid: `step-${state.stepCounter++}`,\n\t\t\t\teventType: \"WORKING\",\n\t\t\t\tmessage: workingDetail,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\n\t\t\tconst step = state.steps.find(s => s.eventType === \"ORCHESTRATOR_THINKING\" && s.status === \"in_progress\");\n\t\t\tif (step) {\n\t\t\t\tstep.status = \"completed\";\n\t\t\t\tif (event.elapsedMs) step.elapsedMs = event.elapsedMs;\n\t\t\t\tif (step.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_STARTED\": {\n\t\t\tconst worker = getEventText(event, \"workerName\") || \"Worker\";\n\t\t\tconst msg = getEventText(event, \"message\") || \"Starting...\";\n\t\t\tconst showHeader = shouldShowIntentHeader(event);\n\t\t\tstate.currentWorker = worker;\n\n\t\t\tif (showHeader && msg !== worker) {\n\t\t\t\taddThinkingLine(state, `**${worker}**`, msg);\n\t\t\t} else if (showHeader) {\n\t\t\t\taddThinkingHeader(state, `**${worker}**`);\n\t\t\t} else {\n\t\t\t\taddThinkingDetail(state, msg);\n\t\t\t}\n\n\t\t\tconst thinkingStep = state.steps.find(s => s.isThinking);\n\t\t\tif (thinkingStep) thinkingStep.isThinking = false;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_COMPLETED\": {\n\t\t\tconst intentStep = state.steps.find(s => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\");\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.status = \"completed\";\n\t\t\t\tintentStep.isThinking = false;\n\t\t\t\tif (event.elapsedMs) intentStep.elapsedMs = event.elapsedMs;\n\t\t\t\tif (intentStep.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"AGGREGATOR_THINKING\": {\n\t\t\taddThinkingLine(state, \"**Finalizing**\", (event.message as string) || \"Preparing response...\");\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"AGGREGATOR_COMPLETED\": {\n\t\t\tappendThinkingText(state, \"\\n\" + ((event.message as string) || \"Response ready\"));\n\n\t\t\tconst step = state.steps.find(s => s.eventType === \"AGGREGATOR_THINKING\" && s.status === \"in_progress\");\n\t\t\tif (step) {\n\t\t\t\tstep.status = \"completed\";\n\t\t\t\tif (event.elapsedMs) step.elapsedMs = event.elapsedMs;\n\t\t\t\tif (step.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"WORKFLOW_COMPLETED\":\n\t\tcase \"COMPLETED\": {\n\t\t\tlet content = extractResponseContent(event.response);\n\t\t\tconst trace = event.trace && typeof event.trace === \"object\" ? (event.trace as Record<string, unknown>) : null;\n\t\t\tif (!content && trace?.workflowMsg && typeof trace.workflowMsg === \"string\") {\n\t\t\t\tcontent = trace.workflowMsg;\n\t\t\t}\n\t\t\tif (!content && trace?.aggregator && typeof trace.aggregator === \"object\") {\n\t\t\t\tconst agg = trace.aggregator as Record<string, unknown>;\n\t\t\t\tif (typeof agg.response === \"string\") content = agg.response;\n\t\t\t\telse content = extractResponseContent(agg.response);\n\t\t\t}\n\n\t\t\tif (content) {\n\t\t\t\tstate.finalResponse = content;\n\t\t\t\tstate.finalData = event.response ?? event.trace;\n\t\t\t\tstate.hasError = false;\n\t\t\t\tstate.errorMessage = \"\";\n\t\t\t} else {\n\t\t\t\tstate.hasError = true;\n\t\t\t\tstate.errorMessage = \"WORKFLOW_FAILED\";\n\t\t\t}\n\n\t\t\tstate.steps.forEach(step => {\n\t\t\t\tif (step.status === \"in_progress\") {\n\t\t\t\t\tstep.status = \"completed\";\n\t\t\t\t\tstep.isThinking = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_REQUIRED\": {\n\t\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t\tif (event.userActionRequest) {\n\t\t\t\tstate.userActionRequest = {\n\t\t\t\t\tuserActionId: event.userActionRequest.userActionId,\n\t\t\t\t\tuserActionType: event.userActionRequest.userActionType as UserActionType | undefined,\n\t\t\t\t\tmessage: event.userActionRequest.message,\n\t\t\t\t\trequestedSchema: event.userActionRequest.requestedSchema,\n\t\t\t\t\tmetadata: event.userActionRequest.metadata,\n\t\t\t\t};\n\t\t\t}\n\t\t\tstate.userActionPending = true;\n\n\t\t\tconst req = event.userActionRequest;\n\t\t\tconst displayMessage = getUserActionDisplayMessage(\n\t\t\t\teventType,\n\t\t\t\t(req?.message as string | undefined) || message,\n\t\t\t);\n\t\t\tif (req) {\n\t\t\t\taddThinkingLine(state, \"**Verification Required**\", displayMessage);\n\t\t\t}\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_SUCCESS\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n✓ \" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\t\t\tstate.userActionResult = \"approved\";\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_INVALID\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n✗ \" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t\tconst errorStepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: errorStepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"error\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\n\t\t\tconst retryStepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: retryStepId,\n\t\t\t\teventType: \"USER_ACTION_REQUIRED\",\n\t\t\t\tmessage: \"Waiting for verification...\",\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = retryStepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_REJECTED\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n\" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\t\t\tstate.userActionResult = \"rejected\";\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_EXPIRED\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n✗ \" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"error\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_RESENT\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n\" + displayMessage);\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_FAILED\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(\n\t\t\t\teventType,\n\t\t\t\t(event.message as string | undefined) || (event.errorMessage as string | undefined),\n\t\t\t);\n\t\t\tappendThinkingText(state, \"\\n✗ \" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"error\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"WORKFLOW_ERROR\":\n\t\tcase \"ERROR\":\n\t\t\tstate.hasError = true;\n\t\t\tstate.errorMessage = (event.errorMessage as string) || (event.message as string) || \"Workflow error\";\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\n\t\tcase \"INTENT_ERROR\": {\n\t\t\tstate.errorMessage = message || event.errorMessage || \"An error occurred\";\n\n\t\t\tconst intentStep = state.steps.find(s => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\");\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.status = \"error\";\n\t\t\t\tintentStep.isThinking = false;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t}\n\n\treturn state;\n}\n","import type { BaseChatConfig } from \"../types\";\nimport { buildResolveImagesUrl, buildRequestHeaders } from \"./requestBuilder\";\n\n/** Matches the RAG image path pattern: /api/rag/chunks/<id>/<version>/<chunk>/image */\nconst RAG_IMAGE_REGEX = /\\/api\\/rag\\/chunks\\/[^\"'\\s]+\\/image/;\n\n/**\n * Returns true if the content contains any unresolved RAG image URLs.\n */\nexport function hasRagImages(content: string): boolean {\n\treturn RAG_IMAGE_REGEX.test(content);\n}\n\n/**\n * Wait one paint before starting the resolve request so the final response\n * can render first and image placeholders can appear in the UI.\n */\nexport async function waitForNextPaint(signal?: AbortSignal): Promise<void> {\n\tif (signal?.aborted) return;\n\n\tawait new Promise<void>((resolve) => {\n\t\tlet isSettled = false;\n\n\t\tconst finish = () => {\n\t\t\tif (isSettled) return;\n\t\t\tisSettled = true;\n\t\t\tsignal?.removeEventListener(\"abort\", finish);\n\t\t\tresolve();\n\t\t};\n\n\t\tsignal?.addEventListener(\"abort\", finish, { once: true });\n\n\t\tif (typeof requestAnimationFrame === \"function\") {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tsetTimeout(finish, 0);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tsetTimeout(finish, 0);\n\t});\n}\n\n/**\n * Calls the resolve-image-urls API to replace RAG image paths with\n * real signed Azure Blob Storage URLs.\n *\n * @throws on non-2xx HTTP status\n */\nexport async function resolveRagImageUrls(\n\tconfig: BaseChatConfig,\n\tcontent: string,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst url = buildResolveImagesUrl(config);\n\tconst baseHeaders = buildRequestHeaders(config);\n\tconst headers = { \"Content-Type\": \"application/json\", ...baseHeaders };\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: JSON.stringify({ input: content }),\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t}\n\n\tconst text = await response.text();\n\n\t// Handle both plain-text and JSON-wrapped responses\n\ttry {\n\t\tconst parsed = JSON.parse(text);\n\t\tif (typeof parsed === \"string\") return parsed;\n\t\tif (typeof parsed.output === \"string\") return parsed.output;\n\t\tif (typeof parsed.result === \"string\") return parsed.result;\n\t} catch {\n\t\t// Not JSON — treat as plain text\n\t}\n\n\treturn text;\n}\n","import { useCallback, useRef } from \"react\";\nimport type { BaseChatConfig, ChatCallbacks, MessageDisplay } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport { processStreamEventV2, createInitialV2State } from \"../utils/v2EventProcessor\";\nimport { getEventMessage, getUserActionDisplayMessage } from \"../utils/eventProcessor\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n} from \"../utils/requestBuilder\";\nimport {\n\thasRagImages,\n\tresolveRagImageUrls,\n\twaitForNextPaint,\n} from \"../utils/ragImageResolver\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/**\n * V2 stream manager that mirrors the demo's streaming approach:\n * - Builds `formattedThinkingText` incrementally during events (with headers/sections)\n * - Buffers the final response until WORKFLOW_COMPLETED\n * - No throttle interval — UI-side `useTypingEffect` handles animation\n */\nexport function useStreamManagerV2(\n\tconfig: BaseChatConfig,\n\tcallbacks: ChatCallbacks,\n\tsetMessages: React.Dispatch<React.SetStateAction<MessageDisplay[]>>,\n\tsetIsWaitingForResponse: (waiting: boolean) => void,\n) {\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\n\tconst startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string,\n\t\t\texternalAbortController?: AbortController,\n\t\t): Promise<string | undefined> => {\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = externalAbortController ?? new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\tconst state = createInitialV2State();\n\t\t\tconst streamStartedAt = Date.now();\n\n\t\t\tconst updateMessage = (update: Partial<MessageDisplay>) => {\n\t\t\t\tif (abortController.signal.aborted) return;\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, ...update } : msg,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tconst currentConfig = configRef.current;\n\t\t\tconst requestBody = buildRequestBody(currentConfig, userMessage, sessionId);\n\t\t\tconst url = buildStreamingUrl(currentConfig);\n\t\t\tconst headers = buildRequestHeaders(currentConfig);\n\n\t\t\ttry {\n\t\t\t\tawait streamWorkflowEvents(url, requestBody, headers, {\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t\tonEvent: (event: StreamEvent) => {\n\t\t\t\t\t\tif (abortController.signal.aborted) return;\n\n\t\t\t\t\t\tif (typeof event.eventType === \"string\" && event.eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\t\tif (event.sessionId) state.sessionId = event.sessionId;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tprocessStreamEventV2(event, state);\n\n\t\t\t\t\t\tconst eventType = event.eventType;\n\n\t\t\t\t\t\t// Dispatch user action callbacks\n\t\t\t\t\t\tif (eventType === \"USER_ACTION_REQUIRED\" && state.userActionRequest) {\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionRequired?.(state.userActionRequest);\n\t\t\t\t\t\t} else if (eventType.startsWith(\"USER_ACTION_\") && eventType !== \"USER_ACTION_REQUIRED\") {\n\t\t\t\t\t\t\tconst msg = getUserActionDisplayMessage(\n\t\t\t\t\t\t\t\teventType,\n\t\t\t\t\t\t\t\tevent.message?.trim() ||\n\t\t\t\t\t\t\t\t\tevent.errorMessage?.trim() ||\n\t\t\t\t\t\t\t\t\tgetEventMessage(event),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(eventType, msg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst activeStep = state.steps.find((s) => s.id === state.currentExecutingStepId);\n\t\t\t\t\t\tconst lastInProgressStep = [...state.steps].reverse().find((s) => s.status === \"in_progress\");\n\t\t\t\t\t\tconst currentMessage = activeStep?.message || lastInProgressStep?.message || getEventMessage(event);\n\n\t\t\t\t\t\tif (state.hasError) {\n\t\t\t\t\t\t\tupdateMessage({\n\t\t\t\t\t\t\t\tstreamingContent: FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\tcontent: FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\tstreamProgress: \"error\",\n\t\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\t\terrorDetails: state.errorMessage,\n\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\tsteps: [...state.steps],\n\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t\tsessionId: state.sessionId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Response is buffered until onComplete — only thinking text updates during streaming\n\t\t\t\t\t\t\tupdateMessage({\n\t\t\t\t\t\t\t\tstreamingContent: \"\",\n\t\t\t\t\t\t\t\tcontent: \"\",\n\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\tstreamProgress: \"processing\",\n\t\t\t\t\t\t\t\tisError: false,\n\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\tsteps: [...state.steps],\n\t\t\t\t\t\t\t\tcurrentExecutingStepId: state.currentExecutingStepId,\n\t\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t\tsessionId: state.sessionId,\n\t\t\t\t\t\t\t\tuserActionResult: state.userActionResult,\n\t\t\t\t\t\t\t\tisCancelled: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error: Error) => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacksRef.current.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAborted = error.name === \"AbortError\";\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\t\t\t\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\t\t\t\t\t\t\t\t\t\tisError: !isAborted,\n\t\t\t\t\t\t\t\t\t\t\tisCancelled: isAborted,\n\t\t\t\t\t\t\t\t\t\t\terrorDetails: isAborted ? undefined : error.message,\n\t\t\t\t\t\t\t\t\t\t\tcontent: isAborted\n\t\t\t\t\t\t\t\t\t\t\t\t? state.finalResponse || \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t: state.finalResponse || FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\t\t\t\tcurrentMessage: isAborted ? \"Thinking...\" : undefined,\n\t\t\t\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\t\t\t\tsteps: [...state.steps].map((step) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn step;\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tonComplete: () => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Verification could not be completed.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (state.sessionId && state.sessionId !== sessionId) {\n\t\t\t\t\t\t\tcallbacksRef.current.onSessionIdChange?.(state.sessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst needsImageResolve =\n\t\t\t\t\t\t\t!state.hasError &&\n\t\t\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t\t\thasRagImages(state.finalResponse);\n\n\t\t\t\t\t\tconst finalMessage: MessageDisplay = {\n\t\t\t\t\t\t\tid: streamingId,\n\t\t\t\t\t\t\tsessionId: state.sessionId || sessionId,\n\t\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : state.finalResponse || \"\",\n\t\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\tstreamProgress: state.hasError ? \"error\" : \"completed\",\n\t\t\t\t\t\t\tisError: state.hasError,\n\t\t\t\t\t\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\ttracingData: state.finalData,\n\t\t\t\t\t\t\tsteps: state.hasError ? [] : [...state.steps],\n\t\t\t\t\t\t\tisCancelled: false,\n\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\tuserActionResult: state.userActionResult,\n\t\t\t\t\t\t\tformattedThinkingText: state.hasError ? undefined : state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\tisResolvingImages: needsImageResolve,\n\t\t\t\t\t\t\tthinkingDurationSec: state.hasError\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: Math.max(0, Math.round((Date.now() - streamStartedAt) / 1000)),\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? finalMessage : msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tcallbacksRef.current.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst shouldResolveImages =\n\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t!state.hasError &&\n\t\t\t\t\thasRagImages(state.finalResponse);\n\n\t\t\t\tif (shouldResolveImages) {\n\t\t\t\t\tawait waitForNextPaint(abortController.signal);\n\t\t\t\t}\n\n\t\t\t\tif (shouldResolveImages && !abortController.signal.aborted) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst resolvedContent = await resolveRagImageUrls(\n\t\t\t\t\t\t\tcurrentConfig,\n\t\t\t\t\t\t\tstate.finalResponse,\n\t\t\t\t\t\t\tabortController.signal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? { ...msg, content: resolvedContent, isResolvingImages: false }\n\t\t\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, isResolvingImages: false } : msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn state.sessionId;\n\t\t\t} catch (error) {\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst isAborted = (error as Error).name === \"AbortError\";\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\t\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\t\t\t\t\t\t\t\tisError: !isAborted,\n\t\t\t\t\t\t\t\t\tisCancelled: isAborted,\n\t\t\t\t\t\t\t\t\terrorDetails: isAborted ? undefined : (error as Error).message,\n\t\t\t\t\t\t\t\t\tcontent: isAborted\n\t\t\t\t\t\t\t\t\t\t? state.finalResponse || \"\"\n\t\t\t\t\t\t\t\t\t\t: state.finalResponse || FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\t\tsteps: [...state.steps].map((step) => {\n\t\t\t\t\t\t\t\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\t\t\t\t\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn step;\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\treturn state.sessionId;\n\t\t\t}\n\t\t},\n\t\t[setMessages, setIsWaitingForResponse],\n\t);\n\n\tconst cancelStream = useCallback(() => {\n\t\tabortControllerRef.current?.abort();\n\t}, []);\n\n\treturn {\n\t\tstartStream,\n\t\tcancelStream,\n\t\tabortControllerRef,\n\t};\n}\n","import type {\n\tBaseChatConfig,\n\tSessionListResponse,\n\tConversationListResponse,\n} from \"../types\";\nimport { buildRequestHeaders } from \"./requestBuilder\";\n\nconst DEFAULT_SESSION_PAGE_SIZE = 20;\nconst DEFAULT_CONVERSATION_PAGE_SIZE = 50;\n\ntype ListSessionsOptions = {\n\tpage?: number;\n\tsize?: number;\n\tsignal?: AbortSignal;\n};\n\ntype ListConversationsOptions = {\n\tsessionId: string;\n\tpage?: number;\n\tsize?: number;\n\tsignal?: AbortSignal;\n};\n\nfunction getStageParamName(config: BaseChatConfig): string {\n\treturn config.api.stageQueryParam ?? \"stage\";\n}\n\nfunction requireOwnerId(config: BaseChatConfig): string {\n\tconst ownerId = config.session?.owner?.id;\n\tif (!ownerId) {\n\t\tthrow new Error(\n\t\t\t\"workflowUsersClient: session.owner.id is required to call this endpoint.\",\n\t\t);\n\t}\n\treturn ownerId;\n}\n\nfunction requireWorkflowName(config: BaseChatConfig): string {\n\tconst workflowName = config.workflow.name;\n\tif (!workflowName) {\n\t\tthrow new Error(\n\t\t\t\"workflowUsersClient: workflow.name is required to call this endpoint.\",\n\t\t);\n\t}\n\treturn workflowName;\n}\n\nfunction requireWorkflowId(config: BaseChatConfig): string {\n\tconst workflowId = config.workflow.id;\n\tif (!workflowId) {\n\t\tthrow new Error(\n\t\t\t\"workflowUsersClient: workflow.id is required to call this endpoint.\",\n\t\t);\n\t}\n\treturn workflowId;\n}\n\n/**\n * Playground-style auth: no authToken, but a yaak-api-key header is present.\n * In that case we must hit the workflow-scoped endpoint instead of the\n * workflow-user-scoped endpoint, since the caller isn't authenticated as a\n * Payman user.\n */\nfunction isPlaygroundYaakAuth(config: BaseChatConfig): boolean {\n\tif (config.api.authToken) return false;\n\tconst headers = config.api.headers;\n\tif (!headers) return false;\n\tfor (const key of Object.keys(headers)) {\n\t\tconst lower = key.toLowerCase();\n\t\tif (lower === \"yaak-api-key\" || lower === \"x-yaak-api-key\") return true;\n\t}\n\treturn false;\n}\n\nasync function fetchJson<T>(\n\turl: string,\n\theaders: Record<string, string>,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\tconst response = await fetch(url, {\n\t\tmethod: \"GET\",\n\t\theaders,\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t}\n\n\treturn (await response.json()) as T;\n}\n\n/**\n * List the recent sessions for the current `session.owner.id` within a workflow.\n *\n * Two variants, selected by auth mode:\n *\n * 1. Authenticated user (api.authToken present, or any auth mode that isn't\n * yaak-api-key playground):\n * GET {baseUrl}/api/workflow-users/{ownerId}/sessions\n * ?workflowId={workflow.id}&{stageParam}={stage}&page=&size=\n *\n * 2. Playground / yaak-api-key (no authToken, yaak-api-key header present):\n * GET {baseUrl}/api/workflows/ask/sessions\n * ?workflowUserId={ownerId}&workflowName={workflow.name}&{stageParam}={stage}&page=&size=\n */\nexport async function listSessions(\n\tconfig: BaseChatConfig,\n\topts: ListSessionsOptions = {},\n): Promise<SessionListResponse> {\n\tconst ownerId = requireOwnerId(config);\n\n\tconst useYaakEndpoint = isPlaygroundYaakAuth(config);\n\n\tconst params = new URLSearchParams({\n\t\tpage: String(opts.page ?? 0),\n\t\tsize: String(opts.size ?? DEFAULT_SESSION_PAGE_SIZE),\n\t});\n\tif (useYaakEndpoint) {\n\t\tparams.set(\"workflowUserId\", ownerId);\n\t\tparams.set(\"workflowName\", requireWorkflowName(config));\n\t} else {\n\t\tparams.set(\"workflowId\", requireWorkflowId(config));\n\t}\n\tif (config.workflow.stage) {\n\t\tparams.set(getStageParamName(config), config.workflow.stage);\n\t}\n\n\tconst url = useYaakEndpoint\n\t\t? `${config.api.baseUrl}/api/workflows/ask/sessions?${params.toString()}`\n\t\t: `${config.api.baseUrl}/api/workflow-users/${encodeURIComponent(\n\t\t\t\townerId,\n\t\t\t)}/sessions?${params.toString()}`;\n\n\treturn fetchJson<SessionListResponse>(\n\t\turl,\n\t\tbuildRequestHeaders(config),\n\t\topts.signal,\n\t);\n}\n\n/**\n * List the conversation history for a single session.\n *\n * Two variants, selected by auth mode (mirrors `listSessions`):\n *\n * 1. Authenticated user (api.authToken present, or no yaak-api-key header):\n * GET {baseUrl}/api/workflow-users/{ownerId}/conversations\n * ?sessionId={sessionId}&{stageParam}={stage}&page=&size=\n *\n * 2. Playground / yaak-api-key (no authToken, x-yaak-api-key header present):\n * GET {baseUrl}/api/workflows/ask/conversations\n * ?workflowUserId={ownerId}&workflowName={workflow.name}&sessionId={sessionId}\n * &{stageParam}={stage}&page=&size=\n */\nexport async function listConversations(\n\tconfig: BaseChatConfig,\n\topts: ListConversationsOptions,\n): Promise<ConversationListResponse> {\n\tconst ownerId = requireOwnerId(config);\n\n\tconst useYaakEndpoint = isPlaygroundYaakAuth(config);\n\n\tconst params = new URLSearchParams({\n\t\tsessionId: opts.sessionId,\n\t\tpage: String(opts.page ?? 0),\n\t\tsize: String(opts.size ?? DEFAULT_CONVERSATION_PAGE_SIZE),\n\t});\n\tif (useYaakEndpoint) {\n\t\tparams.set(\"workflowUserId\", ownerId);\n\t\tparams.set(\"workflowName\", requireWorkflowName(config));\n\t}\n\tif (config.workflow.stage) {\n\t\tparams.set(getStageParamName(config), config.workflow.stage);\n\t}\n\n\tconst url = useYaakEndpoint\n\t\t? `${config.api.baseUrl}/api/workflows/ask/conversations?${params.toString()}`\n\t\t: `${config.api.baseUrl}/api/workflow-users/${encodeURIComponent(\n\t\t\t\townerId,\n\t\t\t)}/conversations?${params.toString()}`;\n\n\treturn fetchJson<ConversationListResponse>(\n\t\turl,\n\t\tbuildRequestHeaders(config),\n\t\topts.signal,\n\t);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type {\n\tBaseChatConfig,\n\tChatCallbacks,\n\tConversationEntry,\n\tMessageDisplay,\n\tUserActionState,\n} from \"../types\";\nimport { generateId } from \"../utils\";\nimport { chatStore } from \"../utils/chatStore\";\nimport { activeStreamStore } from \"../utils/activeStreamStore\";\nimport { useStreamManagerV2 } from \"./useStreamManagerV2\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\nimport {\n\tsubmitUserAction as submitUserActionApi,\n\tcancelUserAction as cancelUserActionApi,\n\tresendUserAction as resendUserActionApi,\n} from \"../utils/userActionClient\";\nimport { listConversations } from \"../utils/workflowUsersClient\";\nimport { buildScopeKey } from \"../utils/requestBuilder\";\n\nexport type UseChatV2Return = {\n\tmessages: MessageDisplay[];\n\tsendMessage: (userMessage: string) => Promise<void>;\n\tclearMessages: () => void;\n\t/** Prepend older messages (e.g. loaded from history pagination). */\n\tprependMessages: (messages: MessageDisplay[]) => void;\n\tcancelStream: () => void;\n\tresetSession: () => void;\n\tgetSessionId: () => string | undefined;\n\tgetMessages: () => MessageDisplay[];\n\tisWaitingForResponse: boolean;\n\tsessionId: string | undefined;\n\tuserActionState: UserActionState;\n\tapproveUserAction: (otp: string) => Promise<void>;\n\trejectUserAction: () => Promise<void>;\n\tresendOtp: () => Promise<void>;\n\t/**\n\t * Replace the active chat with a prior session's conversation history.\n\t * Cancels any in-flight stream, clears current messages, fetches page 0 of\n\t * conversations for `sessionId`, and renders them as historical rows.\n\t */\n\tloadSession: (sessionId: string) => Promise<void>;\n\t/**\n\t * The session id whose conversation history is currently being fetched\n\t * via `loadSession`. `undefined` while idle. Use to render an activity\n\t * indicator in the messages area / on the matching sidebar row.\n\t */\n\tloadingSessionId: string | undefined;\n};\n\n/** Expand one conversation entry into a user + assistant pair of historical rows. */\nfunction conversationEntryToMessages(entry: ConversationEntry, sessionId: string): MessageDisplay[] {\n\treturn [\n\t\t{\n\t\t\tid: `history-user-${entry.executionId}`,\n\t\t\tsessionId,\n\t\t\trole: \"user\",\n\t\t\tcontent: entry.query,\n\t\t\ttimestamp: entry.createdAt,\n\t\t\tisHistorical: true,\n\t\t},\n\t\t{\n\t\t\tid: `history-assistant-${entry.executionId}`,\n\t\t\tsessionId,\n\t\t\trole: \"assistant\",\n\t\t\tcontent: entry.response,\n\t\t\ttimestamp: entry.createdAt,\n\t\t\texecutionId: entry.executionId,\n\t\t\tisHistorical: true,\n\t\t},\n\t];\n}\n\n/**\n * activeStreamStore is keyed per (scope, sessionId) so that an in-flight\n * stream for session A survives the user switching to session B and back.\n */\nfunction streamKeyFor(scopeKey: string, sessionId: string | undefined): string {\n\treturn `${scopeKey}|sid:${sessionId ?? \"\"}`;\n}\n\nexport function useChatV2(config: BaseChatConfig, callbacks: ChatCallbacks = {}): UseChatV2Return {\n\tconst scopeKey = useMemo(() => buildScopeKey(config), [\n\t\tconfig.session?.userId,\n\t\tconfig.workflow?.id,\n\t\tconfig.workflow?.version,\n\t\tconfig.workflow?.stage,\n\t]);\n\n\tconst initialSessionId =\n\t\t(chatStore.get(scopeKey).find((m) => m.sessionId)?.sessionId) ??\n\t\tconfig.session?.initialId ??\n\t\tundefined;\n\n\tconst [messages, setMessages] = useState<MessageDisplay[]>(() => {\n\t\tconst stored = chatStore.get(scopeKey);\n\t\tif (stored.length > 0) return stored;\n\t\treturn config.session?.initialMessages ?? [];\n\t});\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst [loadingSessionId, setLoadingSessionId] = useState<string | undefined>(undefined);\n\t// Currently-viewed session id. Drives the subscription to activeStreamStore\n\t// so that switching sessions switches which live stream we mirror.\n\tconst [currentSessionId, setCurrentSessionId] = useState<string | undefined>(initialSessionId);\n\n\tconst sessionIdRef = useRef<string | undefined>(initialSessionId);\n\tconst prevScopeKeyRef = useRef<string>(scopeKey);\n\t// The session id that any in-flight stream belongs to. May differ from the\n\t// currently-viewed session while the user is browsing other sessions.\n\tconst activeStreamSessionRef = useRef<string | undefined>(undefined);\n\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst scopeKeyRef = useRef(scopeKey);\n\tscopeKeyRef.current = scopeKey;\n\tconst messagesRef = useRef(messages);\n\tmessagesRef.current = messages;\n\n\tconst storeAwareSetMessages = useCallback<React.Dispatch<React.SetStateAction<MessageDisplay[]>>>(\n\t\t(updater) => {\n\t\t\tconst scope = scopeKeyRef.current;\n\t\t\tconst streamSid = activeStreamSessionRef.current;\n\t\t\tif (streamSid !== undefined) {\n\t\t\t\tconst streamKey = streamKeyFor(scope, streamSid);\n\t\t\t\tif (activeStreamStore.has(streamKey)) {\n\t\t\t\t\tactiveStreamStore.applyMessages(\n\t\t\t\t\t\tstreamKey,\n\t\t\t\t\t\tupdater as MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[]),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// Only reflect into React state when we're still viewing the\n\t\t\t\t// session the stream belongs to. Otherwise the user is on a\n\t\t\t\t// different session and must not see the in-flight updates.\n\t\t\t\tif (sessionIdRef.current === streamSid) {\n\t\t\t\t\tsetMessages(updater);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetMessages(updater);\n\t\t},\n\t\t[],\n\t);\n\n\tconst storeAwareSetIsWaiting = useCallback((waiting: boolean) => {\n\t\tconst scope = scopeKeyRef.current;\n\t\tconst streamSid = activeStreamSessionRef.current;\n\t\tif (streamSid !== undefined) {\n\t\t\tconst streamKey = streamKeyFor(scope, streamSid);\n\t\t\tif (activeStreamStore.has(streamKey)) {\n\t\t\t\tactiveStreamStore.setWaiting(streamKey, waiting);\n\t\t\t}\n\t\t\tif (sessionIdRef.current === streamSid) {\n\t\t\t\tsetIsWaitingForResponse(waiting);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tsetIsWaitingForResponse(waiting);\n\t}, []);\n\n\tconst [userActionState, setUserActionState] = useState<UserActionState>({\n\t\trequest: null,\n\t\tresult: null,\n\t\tclearOtpTrigger: 0,\n\t});\n\n\tconst userActionStateRef = useRef(userActionState);\n\tuserActionStateRef.current = userActionState;\n\n\tconst wrappedCallbacks = useMemo<ChatCallbacks>(\n\t\t() => ({\n\t\t\t...callbacksRef.current,\n\t\t\tonMessageSent: (message) => callbacksRef.current.onMessageSent?.(message),\n\t\t\tonStreamStart: () => callbacksRef.current.onStreamStart?.(),\n\t\t\tonStreamComplete: (message) => callbacksRef.current.onStreamComplete?.(message),\n\t\t\tonError: (error) => callbacksRef.current.onError?.(error),\n\t\t\tonExecutionTraceClick: (data) => callbacksRef.current.onExecutionTraceClick?.(data),\n\t\t\tonSessionIdChange: (sessionId) => callbacksRef.current.onSessionIdChange?.(sessionId),\n\t\t\tonUserActionRequired: (request) => {\n\t\t\t\tsetUserActionState((prev) => ({ ...prev, request, result: null }));\n\t\t\t\tcallbacksRef.current.onUserActionRequired?.(request);\n\t\t\t},\n\t\t\tonUserActionEvent: (eventType, message) => {\n\t\t\t\tswitch (eventType) {\n\t\t\t\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: \"approved\" }));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: \"rejected\" }));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\t\t\tcase \"USER_ACTION_FAILED\":\n\t\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null }));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"USER_ACTION_INVALID\":\n\t\t\t\t\t\tsetUserActionState((prev) => ({\n\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\tclearOtpTrigger: prev.clearOtpTrigger + 1,\n\t\t\t\t\t\t}));\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcallbacksRef.current.onUserActionEvent?.(eventType, message);\n\t\t\t},\n\t\t}),\n\t\t[],\n\t);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManagerV2(\n\t\tconfig,\n\t\twrappedCallbacks,\n\t\tstoreAwareSetMessages,\n\t\tstoreAwareSetIsWaiting,\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string) => {\n\t\t\tif (!userMessage.trim()) return;\n\n\t\t\tconst autoGen = configRef.current.session?.autoGenerateId;\n\t\t\tif (!sessionIdRef.current && autoGen !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tsetCurrentSessionId(sessionIdRef.current);\n\t\t\t\tcallbacksRef.current.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\tconst userMessageId = `user-${Date.now()}`;\n\t\t\tconst userMsg: MessageDisplay = {\n\t\t\t\tid: userMessageId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: userMessage,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, userMsg]);\n\t\t\tcallbacksRef.current.onMessageSent?.(userMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacksRef.current.onStreamStart?.();\n\n\t\t\tconst streamingId = `assistant-${Date.now()}`;\n\t\t\tconst streamingMsg: MessageDisplay = {\n\t\t\t\tid: streamingId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: \"\",\n\t\t\t\tstreamingContent: \"\",\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tisStreaming: true,\n\t\t\t\tstreamProgress: \"started\",\n\t\t\t\tsteps: [],\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\tisCancelled: false,\n\t\t\t\tcurrentMessage: undefined,\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, streamingMsg]);\n\n\t\t\tconst abortController = new AbortController();\n\t\t\tconst scope = scopeKeyRef.current;\n\t\t\tconst streamSessionId = sessionIdRef.current;\n\t\t\tconst streamKey = streamKeyFor(scope, streamSessionId);\n\t\t\tactiveStreamSessionRef.current = streamSessionId;\n\n\t\t\tconst initialMessages = [...messagesRef.current, userMsg, streamingMsg];\n\t\t\tactiveStreamStore.start(streamKey, abortController, initialMessages);\n\n\t\t\tconst newSessionId = await startStream(\n\t\t\t\tuserMessage,\n\t\t\t\tstreamingId,\n\t\t\t\tstreamSessionId,\n\t\t\t\tabortController,\n\t\t\t);\n\n\t\t\tactiveStreamStore.complete(streamKey);\n\t\t\tactiveStreamSessionRef.current = undefined;\n\n\t\t\t// Only update sessionIdRef / currentSessionId from the server if the\n\t\t\t// user is still viewing the stream's session; otherwise leave their\n\t\t\t// current selection alone.\n\t\t\tif (\n\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\tnewSessionId &&\n\t\t\t\tnewSessionId !== streamSessionId &&\n\t\t\t\tsessionIdRef.current === streamSessionId\n\t\t\t) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t\tsetCurrentSessionId(newSessionId);\n\t\t\t}\n\t\t},\n\t\t[startStream],\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tchatStore.delete(scopeKeyRef.current);\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst prependMessages = useCallback((msgs: MessageDisplay[]) => {\n\t\tsetMessages((prev) => [...msgs, ...prev]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tconst scope = scopeKeyRef.current;\n\t\tconst viewSid = sessionIdRef.current;\n\t\tconst viewStreamKey = streamKeyFor(scope, viewSid);\n\t\tif (activeStreamStore.has(viewStreamKey)) {\n\t\t\tactiveStreamStore.abort(viewStreamKey);\n\t\t}\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: null }));\n\n\t\tsetMessages((prev) =>\n\t\t\tprev.map((msg) => {\n\t\t\t\tif (msg.isStreaming) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t...createCancelledMessageUpdate(msg.steps || [], msg.currentMessage),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t}),\n\t\t);\n\t}, [cancelStreamManager]);\n\n\tconst resetSession = useCallback(() => {\n\t\tconst scope = scopeKeyRef.current;\n\t\tconst viewSid = sessionIdRef.current;\n\t\tconst viewStreamKey = streamKeyFor(scope, viewSid);\n\t\tif (activeStreamStore.has(viewStreamKey)) {\n\t\t\tactiveStreamStore.abort(viewStreamKey);\n\t\t}\n\t\tchatStore.delete(scope);\n\t\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tsetCurrentSessionId(undefined);\n\t\tactiveStreamSessionRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState({ request: null, result: null, clearOtpTrigger: 0 });\n\t}, []);\n\n\tconst getSessionId = useCallback(() => sessionIdRef.current, []);\n\tconst getMessages = useCallback(() => messages, [messages]);\n\n\tconst approveUserAction = useCallback(async (otp: string) => {\n\t\tconst request = userActionStateRef.current.request;\n\t\tif (!request) return;\n\t\ttry {\n\t\t\tawait submitUserActionApi(configRef.current, request.userActionId, { otp });\n\t\t} catch (error) {\n\t\t\tsetUserActionState((prev) => ({\n\t\t\t\t...prev,\n\t\t\t\tclearOtpTrigger: prev.clearOtpTrigger + 1,\n\t\t\t}));\n\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t}, []);\n\n\tconst rejectUserAction = useCallback(async () => {\n\t\tconst request = userActionStateRef.current.request;\n\t\tif (!request) return;\n\t\ttry {\n\t\t\tsetMessages((prev) => {\n\t\t\t\tlet lastStreamingIdx = -1;\n\t\t\t\tfor (let i = prev.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (prev[i].role === \"assistant\" && prev[i].isStreaming) {\n\t\t\t\t\t\tlastStreamingIdx = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (lastStreamingIdx === -1) return prev;\n\t\t\t\treturn prev.map((msg, i) =>\n\t\t\t\t\ti === lastStreamingIdx ? { ...msg, currentMessage: \"Rejecting...\" } : msg,\n\t\t\t\t);\n\t\t\t});\n\t\t\tawait cancelUserActionApi(configRef.current, request.userActionId);\n\t\t} catch (error) {\n\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t}, []);\n\n\tconst resendOtp = useCallback(async () => {\n\t\tconst request = userActionStateRef.current.request;\n\t\tif (!request) return;\n\t\ttry {\n\t\t\tawait resendUserActionApi(configRef.current, request.userActionId);\n\t\t} catch (error) {\n\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t}, []);\n\n\tconst inFlightLoadRef = useRef<{\n\t\tsessionId: string;\n\t\tpromise: Promise<void>;\n\t} | null>(null);\n\tconst loadingSessionIdRef = useRef<string | undefined>(undefined);\n\tloadingSessionIdRef.current = loadingSessionId;\n\n\tconst loadSession = useCallback(async (sessionId: string) => {\n\t\t// Dedupe: if this exact session is already being loaded, return the\n\t\t// in-flight promise instead of firing another conversations request.\n\t\tconst inFlight = inFlightLoadRef.current;\n\t\tif (inFlight && inFlight.sessionId === sessionId) {\n\t\t\treturn inFlight.promise;\n\t\t}\n\t\t// If the user is already viewing this session and nothing is loading\n\t\t// (or being loaded for it), it's a no-op — no need to wipe state and\n\t\t// re-fetch the conversations.\n\t\tif (\n\t\t\tsessionIdRef.current === sessionId &&\n\t\t\tloadingSessionIdRef.current !== sessionId\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst run = async () => {\n\t\t\tconst scope = scopeKeyRef.current;\n\t\t\tsetUserActionState({ request: null, result: null, clearOtpTrigger: 0 });\n\n\t\t\tsessionIdRef.current = sessionId;\n\t\t\tsetCurrentSessionId(sessionId);\n\t\t\tcallbacksRef.current.onSessionIdChange?.(sessionId);\n\n\t\t\t// If an in-flight stream exists for the selected session, restore\n\t\t\t// it live instead of wiping state or re-fetching history. The\n\t\t\t// subscription effect (below) will continue mirroring further\n\t\t\t// updates into state.\n\t\t\tconst streamKey = streamKeyFor(scope, sessionId);\n\t\t\tconst active = activeStreamStore.get(streamKey);\n\t\t\tif (active) {\n\t\t\t\tsetMessages(active.messages);\n\t\t\t\tsetIsWaitingForResponse(active.isWaiting);\n\t\t\t\tsetLoadingSessionId(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetIsWaitingForResponse(false);\n\t\t\tsetMessages([]);\n\t\t\tchatStore.delete(scope);\n\t\t\tsetLoadingSessionId(sessionId);\n\n\t\t\ttry {\n\t\t\t\tconst response = await listConversations(configRef.current, { sessionId });\n\t\t\t\tconst entries = response.data ?? [];\n\t\t\t\tconst historical = entries.flatMap((entry) => conversationEntryToMessages(entry, sessionId));\n\t\t\t\t// Only apply if the user is still on this session (they may\n\t\t\t\t// have switched away while the request was in flight).\n\t\t\t\tif (sessionIdRef.current === sessionId) {\n\t\t\t\t\tsetMessages(historical);\n\t\t\t\t}\n\t\t\t\tif (historical.length > 0) {\n\t\t\t\t\tchatStore.set(scope, historical);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tsetLoadingSessionId((current) => (current === sessionId ? undefined : current));\n\t\t\t}\n\t\t};\n\n\t\tconst promise = run().finally(() => {\n\t\t\tif (inFlightLoadRef.current?.sessionId === sessionId) {\n\t\t\t\tinFlightLoadRef.current = null;\n\t\t\t}\n\t\t});\n\t\tinFlightLoadRef.current = { sessionId, promise };\n\t\treturn promise;\n\t}, []);\n\n\t// Subscribe to the live stream store for the currently-viewed session.\n\t// Re-runs when either scope or the viewed session changes so that\n\t// switching sessions switches which in-flight stream (if any) we mirror.\n\tuseEffect(() => {\n\t\tconst key = streamKeyFor(scopeKey, currentSessionId);\n\t\tconst unsubscribe = activeStreamStore.subscribe(key, (msgs, isWaiting) => {\n\t\t\tsetMessages(msgs);\n\t\t\tsetIsWaitingForResponse(isWaiting);\n\t\t});\n\t\tconst active = activeStreamStore.get(key);\n\t\tif (active) {\n\t\t\tsetMessages(active.messages);\n\t\t\tsetIsWaitingForResponse(active.isWaiting);\n\t\t}\n\t\treturn unsubscribe;\n\t}, [scopeKey, currentSessionId]);\n\n\tuseEffect(() => {\n\t\tconst toSave = messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) {\n\t\t\tchatStore.set(scopeKey, toSave);\n\t\t}\n\t}, [messages, scopeKey]);\n\n\t// Scope-key change (e.g. user logged out, workflow/version/stage switched):\n\t// rehydrate from the new scope's stored messages and session.\n\tuseEffect(() => {\n\t\tconst prevKey = prevScopeKeyRef.current;\n\t\tprevScopeKeyRef.current = scopeKey;\n\t\tif (prevKey === scopeKey) return;\n\n\t\tconst stored = chatStore.get(scopeKey);\n\t\tsetMessages(stored);\n\t\tconst restoredSessionId =\n\t\t\tstored.find((m) => m.sessionId)?.sessionId ??\n\t\t\tconfigRef.current.session?.initialId ??\n\t\t\tundefined;\n\t\tsessionIdRef.current = restoredSessionId;\n\t\tsetCurrentSessionId(restoredSessionId);\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState({ request: null, result: null, clearOtpTrigger: 0 });\n\t}, [scopeKey]);\n\n\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tprependMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tsessionId: currentSessionId,\n\t\tuserActionState,\n\t\tapproveUserAction,\n\t\trejectUserAction,\n\t\tresendOtp,\n\t\tloadSession,\n\t\tloadingSessionId,\n\t};\n}\n","// ============================================\n// Voice Hook - React Native Implementation\n// ============================================\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n\tExpoSpeechRecognitionModule,\n\tuseSpeechRecognitionEvent,\n} from \"expo-speech-recognition\";\n\n// ============================================\n// Types\n// ============================================\n\nexport type VoiceState = \"idle\" | \"listening\" | \"processing\" | \"error\";\n\nexport interface UseVoiceReturn {\n\tvoiceState: VoiceState;\n\ttranscribedText: string;\n\tisAvailable: boolean;\n\tisRecording: boolean;\n\t/** Last error message (e.g. \"audio not available\") – set from recognition error event */\n\tlastError: string | null;\n\tstartRecording: () => Promise<void>;\n\tstopRecording: () => void;\n\tclearTranscript: () => void;\n\treset: () => void;\n}\n\n// ============================================\n// Hook Implementation\n// ============================================\n\nexport function useVoice(): UseVoiceReturn {\n\tconst [voiceState, setVoiceState] = useState<VoiceState>(\"idle\");\n\tconst [transcribedText, setTranscribedText] = useState(\"\");\n\tconst [isAvailable, setIsAvailable] = useState(false);\n\tconst [isRecording, setIsRecording] = useState(false);\n\tconst [lastError, setLastError] = useState<string | null>(null);\n\tconst isRecordingRef = useRef(false);\n\n\tisRecordingRef.current = isRecording;\n\n\tuseEffect(() => {\n\t\tconst available =\n\t\t\ttypeof ExpoSpeechRecognitionModule.isRecognitionAvailable ===\n\t\t\t\t\"function\"\n\t\t\t\t? ExpoSpeechRecognitionModule.isRecognitionAvailable()\n\t\t\t\t: true;\n\t\tsetIsAvailable(!!available);\n\t}, []);\n\n\tuseSpeechRecognitionEvent(\"start\", () => {\n\t\tif (isRecordingRef.current) setVoiceState(\"listening\");\n\t});\n\tuseSpeechRecognitionEvent(\"end\", () => {});\n\tuseSpeechRecognitionEvent(\"result\", (event: any) => {\n\t\tif (!isRecordingRef.current) return;\n\t\tconst transcript = event?.results?.[0]?.transcript;\n\t\tif (transcript?.trim()) setTranscribedText(transcript);\n\t});\n\tuseSpeechRecognitionEvent(\"error\", (event: any) => {\n\t\tif (isRecordingRef.current) {\n\t\t\tsetLastError(\n\t\t\t\tevent?.message ?? event?.error ?? \"Speech recognition error\"\n\t\t\t);\n\t\t\tsetVoiceState(\"error\");\n\t\t}\n\t});\n\n\t// Start recording\n\tconst startRecording = useCallback(async () => {\n\t\tif (!isAvailable) {\n\t\t\tsetLastError(\"Speech recognition not available\");\n\t\t\treturn;\n\t\t}\n\n\t\tsetLastError(null);\n\n\t\ttry {\n\t\t\tconst result =\n\t\t\t\tawait ExpoSpeechRecognitionModule.requestPermissionsAsync();\n\t\t\tif (!result?.granted) {\n\t\t\t\tsetLastError(\"Microphone permission not granted\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\ttypeof ExpoSpeechRecognitionModule\n\t\t\t\t\t.requestSpeechRecognizerPermissionsAsync === \"function\"\n\t\t\t) {\n\t\t\t\tconst speechResult =\n\t\t\t\t\tawait ExpoSpeechRecognitionModule.requestSpeechRecognizerPermissionsAsync();\n\t\t\t\tif (!speechResult?.granted) {\n\t\t\t\t\tsetLastError(\"Speech recognition permission not granted\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetTranscribedText(\"\");\n\t\t\tsetVoiceState(\"listening\");\n\t\t\tsetIsRecording(true);\n\t\t\tisRecordingRef.current = true;\n\n\t\t\tawait ExpoSpeechRecognitionModule.start({\n\t\t\t\tlang: \"en-US\",\n\t\t\t\tinterimResults: true,\n\t\t\t\tcontinuous: true,\n\t\t\t\tmaxAlternatives: 1,\n\t\t\t\trequiresOnDeviceRecognition: false,\n\t\t\t\tiosCategory: {\n\t\t\t\t\tcategory: \"playAndRecord\",\n\t\t\t\t\tcategoryOptions: [\"defaultToSpeaker\", \"allowBluetooth\"],\n\t\t\t\t\tmode: \"measurement\",\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error: any) {\n\t\t\tconst message =\n\t\t\t\terror?.message ?? String(error) ?? \"Failed to start recording\";\n\t\t\tsetLastError(message);\n\t\t\tsetVoiceState(\"error\");\n\t\t\tsetIsRecording(false);\n\t\t\tisRecordingRef.current = false;\n\t\t}\n\t}, [isAvailable]);\n\n\t// Stop recording\n\tconst stopRecording = useCallback(() => {\n\t\ttry {\n\t\t\tExpoSpeechRecognitionModule.stop();\n\t\t} catch (error) {\n\t\t\t// ignore\n\t\t} finally {\n\t\t\tsetVoiceState(\"idle\");\n\t\t\tsetIsRecording(false);\n\t\t\tisRecordingRef.current = false;\n\t\t}\n\t}, []);\n\n\t// Clear transcript\n\tconst clearTranscript = useCallback(() => {\n\t\tsetTranscribedText(\"\");\n\t\tsetLastError(null);\n\t}, []);\n\n\t// Reset\n\tconst reset = useCallback(() => {\n\t\tstopRecording();\n\t\tsetTranscribedText(\"\");\n\t\tsetLastError(null);\n\t\tsetVoiceState(\"idle\");\n\t}, [stopRecording]);\n\n\t// Cleanup on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (isRecordingRef.current) {\n\t\t\t\ttry {\n\t\t\t\t\tExpoSpeechRecognitionModule.stop();\n\t\t\t\t} catch (_e) {}\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn {\n\t\tvoiceState,\n\t\ttranscribedText,\n\t\tisAvailable,\n\t\tisRecording,\n\t\tlastError,\n\t\tstartRecording,\n\t\tstopRecording,\n\t\tclearTranscript,\n\t\treset,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/generateId.ts","../src/utils/streamingClient.native.ts","../src/utils/stageLabels.ts","../src/utils/v2EventProcessor.ts","../src/utils/messageStateManager.ts","../src/utils/requestBuilder.ts","../src/utils/userActionClient.ts","../src/utils/chatStore.native.ts","../src/utils/activeStreamStore.ts","../src/utils/ragImageResolver.ts","../src/hooks/useStreamManagerV2.ts","../src/hooks/useChatV2.ts","../src/hooks/useVoice.native.ts"],"names":["createMMKV","useRef","useCallback","useState","useMemo","useEffect","ExpoSpeechRecognitionModule","useSpeechRecognitionEvent"],"mappings":"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","file":"index.native.js","sourcesContent":["/**\n * Cross-platform UUID v4 generator\n * Works in both browser and React Native environments\n */\nexport function generateId(): string {\n\t// Simple UUID v4 implementation that doesn't rely on crypto API\n\treturn \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n\t\tconst r = (Math.random() * 16) | 0;\n\t\tconst v = c === \"x\" ? r : (r & 0x3) | 0x8;\n\t\treturn v.toString(16);\n\t});\n}\n","/**\n * Streaming client for React Native using native fetch\n */\n\nexport type StreamEvent = {\n\teventType: string;\n\tworkerName?: string;\n\tmessage?: string;\n\terrorMessage?: string;\n\tresponse?: unknown;\n\texecutionId?: string;\n\tsessionId?: string;\n\tinputTokens?: number;\n\toutputTokens?: number;\n\telapsedMs?: number;\n\t/**\n\t * Server-computed wall-clock duration from RunStarted to RunCompleted.\n\t * Carried on RUN_COMPLETED only.\n\t */\n\ttotalTimeMs?: number;\n\t/**\n\t * User-facing progress label attached to TOOL_CALL_STARTED /\n\t * TOOL_CALL_COMPLETED events by k2-server — e.g. \"Pulling your\n\t * transactions\" / \"Got 437 transactions\". Clients should prefer\n\t * this over the raw `toolName` identifier when rendering a row.\n\t */\n\tdescription?: string;\n\tuserActionRequest?: {\n\t\tuserActionId: string;\n\t\tmessage: string;\n\t\trequestedSchema: Record<string, unknown>;\n\t};\n\t[key: string]: unknown;\n};\n\nexport type StreamOptions = {\n\tsignal?: AbortSignal;\n\tonEvent?: (event: StreamEvent) => void;\n\tonError?: (error: Error) => void;\n\tonComplete?: () => void;\n};\n\n/**\n * Parse buffer for complete JSON objects (raw JSON streaming, not SSE format)\n * Handles concatenated JSON objects without newlines between them\n */\nfunction parseJSONBuffer(buffer: string): {\n\tevents: StreamEvent[];\n\tremaining: string;\n} {\n\tconst events: StreamEvent[] = [];\n\tlet braceCount = 0;\n\tlet startIndex = 0;\n\tlet inString = false;\n\tlet escapeNext = false;\n\tlet lastParsedIndex = -1;\n\n\t// Find complete JSON objects in the buffer\n\tfor (let i = 0; i < buffer.length; i++) {\n\t\tconst char = buffer[i];\n\n\t\tif (escapeNext) {\n\t\t\tescapeNext = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"\\\\\") {\n\t\t\tescapeNext = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"' && !escapeNext) {\n\t\t\tinString = !inString;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inString) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === \"{\") {\n\t\t\tif (braceCount === 0) {\n\t\t\t\tstartIndex = i;\n\t\t\t}\n\t\t\tbraceCount++;\n\t\t} else if (char === \"}\") {\n\t\t\tbraceCount--;\n\t\t\tif (braceCount === 0) {\n\t\t\t\t// Found a complete JSON object\n\t\t\t\tconst jsonStr = buffer.substring(startIndex, i + 1);\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(jsonStr);\n\t\t\t\t\tconst event = parsed as StreamEvent;\n\t\t\t\t\tevents.push(event);\n\t\t\t\t\tlastParsedIndex = i;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Failed to parse JSON event:\", jsonStr, err);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return parsed events and remaining buffer\n\tconst remaining =\n\t\tlastParsedIndex >= 0 ? buffer.substring(lastParsedIndex + 1) : buffer;\n\treturn { events, remaining };\n}\n\n/**\n * Stream workflow events from the API using XMLHttpRequest (React Native)\n * XMLHttpRequest provides better streaming support in React Native than fetch\n */\nexport async function streamWorkflowEvents(\n\turl: string,\n\tbody: Record<string, unknown>,\n\theaders: Record<string, string>,\n\toptions: StreamOptions = {}\n): Promise<void> {\n\tconst { signal, onEvent, onError, onComplete } = options;\n\n\treturn new Promise((resolve, reject) => {\n\t\tconst xhr = new XMLHttpRequest();\n\t\tlet buffer = \"\";\n\t\tlet lastProcessedIndex = 0;\n\n\t\t// Handle abort signal\n\t\tconst abortHandler = () => {\n\t\t\txhr.abort();\n\t\t\tresolve();\n\t\t};\n\n\t\tif (signal) {\n\t\t\tsignal.addEventListener(\"abort\", abortHandler);\n\t\t}\n\n\t\t// Track progress and process chunks as they arrive\n\t\txhr.onprogress = () => {\n\t\t\tif (xhr.readyState === 3 || xhr.readyState === 4) {\n\t\t\t\t// Get the new data since last check\n\t\t\t\tconst newData = xhr.responseText.substring(lastProcessedIndex);\n\t\t\t\tlastProcessedIndex = xhr.responseText.length;\n\n\t\t\t\tif (newData) {\n\t\t\t\t\t// Append to buffer\n\t\t\t\t\tbuffer += newData;\n\n\t\t\t\t\t// Try to parse complete JSON objects from buffer\n\t\t\t\t\tconst { events, remaining } = parseJSONBuffer(buffer);\n\t\t\t\t\tfor (const event of events) {\n\t\t\t\t\t\tonEvent?.(event);\n\t\t\t\t\t}\n\t\t\t\t\t// Keep only the remaining unparsed portion\n\t\t\t\t\tbuffer = remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\txhr.onload = () => {\n\t\t\tif (signal) {\n\t\t\t\tsignal.removeEventListener(\"abort\", abortHandler);\n\t\t\t}\n\n\t\t\tif (xhr.status >= 200 && xhr.status < 300) {\n\t\t\t\t// Process any remaining buffer\n\t\t\t\tif (buffer.trim()) {\n\t\t\t\t\tconst { events } = parseJSONBuffer(buffer);\n\t\t\t\t\tfor (const event of events) {\n\t\t\t\t\t\tonEvent?.(event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tonComplete?.();\n\t\t\t\tresolve();\n\t\t\t} else {\n\t\t\t\tconst error = new Error(`HTTP ${xhr.status}: ${xhr.responseText}`);\n\t\t\t\tonError?.(error);\n\t\t\t\treject(error);\n\t\t\t}\n\t\t};\n\n\t\txhr.onerror = () => {\n\t\t\tif (signal) {\n\t\t\t\tsignal.removeEventListener(\"abort\", abortHandler);\n\t\t\t}\n\t\t\tconst error = new Error(\"Network error\");\n\t\t\tonError?.(error);\n\t\t\treject(error);\n\t\t};\n\n\t\txhr.onabort = () => {\n\t\t\tif (signal) {\n\t\t\t\tsignal.removeEventListener(\"abort\", abortHandler);\n\t\t\t}\n\t\t\tresolve();\n\t\t};\n\n\t\t// Open and send request\n\t\txhr.open(\"POST\", url, true);\n\t\txhr.setRequestHeader(\"Content-Type\", \"application/json\");\n\t\txhr.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\t\"application/x-ndjson, text/event-stream, text/plain, */*\"\n\t\t);\n\n\t\t// Set custom headers\n\t\tfor (const [key, value] of Object.entries(headers)) {\n\t\t\txhr.setRequestHeader(key, value);\n\t\t}\n\n\t\txhr.send(JSON.stringify(body));\n\t});\n}\n","/**\n * User-facing labels for the K2 pipeline stages, used by the event\n * processor to turn machine `stage` keys on STAGE_* events into the\n * text the UI shows in its \"Thought\" / streaming-step list.\n *\n * One label per stage — no completed / failed variants. The previous\n * version had three strings per stage (\"Checking your request\" →\n * \"Request OK\" → \"Couldn't process that request\") and flashed the\n * completed label for a few milliseconds between stages, which read\n * as noise rather than signal (\"Request OK\" and \"Got it\" don't\n * inspire trust in a banking product). The simpler model:\n *\n * - When a stage starts, the cursor shows the stage label.\n * - When the stage completes, the cursor moves on to the NEXT\n * stage's label (via a new STAGE_STARTED event). There is no\n * in-between \"completed\" flash.\n * - When the stage fails, the step is marked status=error but the\n * label stays — the expanded Thought view renders failed steps\n * differently via CSS, not by rewriting the text.\n *\n * The mapping lives in the SDK (not on the server) so copy changes\n * don't require a k2-server deploy. Future i18n replaces this table\n * with a lookup by key + locale without touching the server.\n *\n * Stage keys come from k2-server's `Pipeline.toStepKey()`:\n * sanitizer | analyzer | prefetcher | planner | execution | formatter\n */\n\nconst STAGE_LABELS: Record<string, string> = {\n\tsanitizer: \"Checking your request\",\n\tanalyzer: \"Understanding what you're asking\",\n\tprefetcher: \"Gathering context\",\n\tplanner: \"Planning how to handle this\",\n\texecution: \"Working on it\",\n\tformatter: \"Writing the response\",\n};\n\n/**\n * Map a pipeline stage key to a user-facing label. Returns a\n * sensible generic fallback (\"Running <stage>\") if the stage key is\n * unknown — a future k2-server stage that the SDK doesn't know\n * about yet still renders something in the UI instead of breaking\n * the stream.\n */\nexport function stageLabel(stage: string): string {\n\tconst label = STAGE_LABELS[stage];\n\tif (label) return label;\n\tconst pretty = stage.replace(/[_-]/g, \" \");\n\treturn `Running ${pretty}`;\n}\n","import type { StreamEvent } from \"./streamingClient\";\nimport type { StreamingStep, UserActionRequest, UserActionResult, UserActionType } from \"../types\";\nimport { stageLabel } from \"./stageLabels\";\n\n// ============================================================\n// Shared stream-event utilities\n// ============================================================\n//\n// These used to live in a separate `eventProcessor.ts` (the legacy\n// v1 processor file). The v1 processor + its stream manager + its\n// useChat hook have all been deleted — the v2 processor below is\n// the only one the SDK ships now — so the utilities moved here\n// rather than into a standalone shared file. They're exported\n// because `useStreamManagerV2` also imports `getEventMessage`\n// and `getUserActionDisplayMessage`.\n\n/**\n * Bland default-start labels every pipeline stage emits as\n * `defaultStartMessage` on the server when nothing more specific\n * has happened yet — `\"Executing…\"`, `\"Working on it…\"`, etc. The\n * stream manager filters these out of the chat-bubble status so\n * they don't replace useful messages (Analyzer's dynamic\n * \"Pulling those up for you now.\", a tool call's \"Got 437\n * transactions\") with a generic placeholder for the brief moment\n * between a stage starting and its first interesting event.\n *\n * Comparison is case-insensitive and trailing punctuation\n * (ellipsis `…` / `...` / period) is stripped so the same label\n * matches whether the server emits it with or without the\n * trailing dots.\n */\nexport function isBlandStatus(message: string | undefined | null): boolean {\n\tif (!message) return true;\n\tconst normalized = message\n\t\t.trim()\n\t\t.toLowerCase()\n\t\t.replace(/[…\\.]+$/, \"\")\n\t\t.trim();\n\treturn BLAND_STATUS_LABELS.has(normalized);\n}\n\nconst BLAND_STATUS_LABELS: Set<string> = new Set([\n\t\"executing\",\n\t\"working on it\",\n\t\"thinking\",\n\t\"processing\",\n\t\"reviewing your request\",\n\t\"composing response\",\n\t\"checking your request\",\n\t\"polishing the response\",\n]);\n\n/**\n * Extract a user-friendly message string from a raw stream event.\n * Used by `useStreamManagerV2` when the streaming client needs a\n * label to attach to an intermediate event (e.g. for logging).\n */\nexport function getEventMessage(event: StreamEvent): string {\n\tif (event.message?.trim()) {\n\t\treturn event.message.trim();\n\t}\n\n\tif (event.errorMessage?.trim()) {\n\t\treturn event.errorMessage.trim();\n\t}\n\n\tconst eventType = event.eventType;\n\tswitch (eventType) {\n\t\tcase \"RUN_STARTED\":\n\t\t\treturn \"Starting agent run...\";\n\t\tcase \"TOOL_CALL_STARTED\": {\n\t\t\t// Prefer the server's human-readable `description` (e.g.\n\t\t\t// \"Pulling your transactions\") over the raw snake_case\n\t\t\t// tool identifier. Older k2-server builds don't populate\n\t\t\t// it, so we fall back to the tool name.\n\t\t\tconst description = typeof event.description === \"string\" ? event.description.trim() : \"\";\n\t\t\tif (description) return description;\n\t\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : \"\";\n\t\t\treturn toolName ? `Calling ${toolName}...` : \"Calling tool...\";\n\t\t}\n\t\tcase \"TOOL_CALL_COMPLETED\": {\n\t\t\tconst description = typeof event.description === \"string\" ? event.description.trim() : \"\";\n\t\t\tif (description) return description;\n\t\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : \"\";\n\t\t\treturn toolName ? `${toolName} completed` : \"Tool call completed\";\n\t\t}\n\t\tcase \"RUN_IN_PROGRESS\":\n\t\t\treturn (event.partialText as string) || \"Thinking...\";\n\t\tcase \"RUN_COMPLETED\":\n\t\t\treturn \"Agent run completed\";\n\t\tcase \"RUN_FAILED\":\n\t\t\treturn (event.errorMessage as string) || \"Agent run failed\";\n\t\tcase \"KEEP_ALIVE\":\n\t\t\t// k2-server attaches a rotating K2-voice phrase as `description`\n\t\t\t// during silent-think gaps so the chat-bubble status line has\n\t\t\t// something visibly changing instead of a frozen \"Thinking\".\n\t\t\t// Empty when the heartbeat is generic (legacy server builds).\n\t\t\treturn (event.description as string) || \"\";\n\t\tcase \"THINKING_DELTA\":\n\t\t\t// Anthropic extended-thinking content. Routed into the thinking\n\t\t\t// panel via processStreamEventV2; here we just contribute the\n\t\t\t// text to the bubble fallback in case the host UI doesn't\n\t\t\t// render the dedicated panel yet.\n\t\t\treturn (event.text as string) || \"\";\n\t\tdefault:\n\t\t\treturn eventType;\n\t}\n}\n\n/**\n * Pull the final assistant reply out of whatever shape the server\n * decided to send it in. Handles the common cases (direct string,\n * nested object with `text`/`content`/`message`/`answer`) and falls\n * back to a JSON stringification for anything else.\n */\nexport function extractResponseContent(response: unknown): string {\n\t// Handle direct string response (most common from API)\n\tif (typeof response === \"string\") {\n\t\treturn response;\n\t}\n\n\t// Handle object responses with nested content\n\tif (typeof response === \"object\" && response !== null) {\n\t\tconst resp = response as Record<string, unknown>;\n\n\t\t// Try common field names\n\t\tif (\"text\" in resp && typeof resp.text === \"string\") {\n\t\t\treturn resp.text;\n\t\t}\n\t\tif (\"content\" in resp && typeof resp.content === \"string\") {\n\t\t\treturn resp.content;\n\t\t}\n\t\tif (\"message\" in resp && typeof resp.message === \"string\") {\n\t\t\treturn resp.message;\n\t\t}\n\t\tif (\"answer\" in resp && typeof resp.answer === \"string\") {\n\t\t\treturn resp.answer;\n\t\t}\n\n\t\t// Fallback to JSON string\n\t\treturn JSON.stringify(response);\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Translate the clean K2 playground event types (RUN_STARTED,\n * TOOL_CALL_*, RUN_IN_PROGRESS, RUN_COMPLETED, RUN_FAILED) to the\n * internal event vocabulary that the state machine below already\n * understands (WORKFLOW_STARTED, INTENT_STARTED, INTENT_COMPLETED,\n * INTENT_PROGRESS, WORKFLOW_COMPLETED, WORKFLOW_ERROR).\n *\n * STAGE_* events are deliberately NOT normalized — they're handled\n * directly by the processStreamEventV2 state machine further down,\n * since they map onto real pipeline stages instead of the legacy\n * workflow/intent vocabulary.\n *\n * Unknown event types pass through unchanged so the state machine\n * can ignore them safely.\n */\nexport function normalizeEvent(event: StreamEvent): StreamEvent {\n\tconst type = event.eventType;\n\tswitch (type) {\n\t\tcase \"RUN_STARTED\":\n\t\t\treturn { ...event, eventType: \"WORKFLOW_STARTED\" };\n\t\tcase \"TOOL_CALL_STARTED\": {\n\t\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : undefined;\n\t\t\t// The server now ships a human-readable `description`\n\t\t\t// (\"Pulling your transactions\") on tool events. Surface it\n\t\t\t// as the normalized `message` so the INTENT_STARTED\n\t\t\t// handler below renders it in the thinking-block label\n\t\t\t// instead of the raw tool identifier. Falls back to the\n\t\t\t// existing `message` field when description is absent\n\t\t\t// (older k2-server builds).\n\t\t\tconst description = typeof event.description === \"string\" ? event.description.trim() : \"\";\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"INTENT_STARTED\",\n\t\t\t\tworkerName: toolName ?? event.workerName,\n\t\t\t\tmessage: description || (event.message as string | undefined),\n\t\t\t};\n\t\t}\n\t\tcase \"TOOL_CALL_COMPLETED\": {\n\t\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : undefined;\n\t\t\tconst description = typeof event.description === \"string\" ? event.description.trim() : \"\";\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"INTENT_COMPLETED\",\n\t\t\t\tworkerName: toolName ?? event.workerName,\n\t\t\t\tmessage: description || (event.message as string | undefined),\n\t\t\t};\n\t\t}\n\t\tcase \"RUN_IN_PROGRESS\":\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"INTENT_PROGRESS\",\n\t\t\t\tmessage: (event.partialText as string | undefined) ?? event.message,\n\t\t\t};\n\t\tcase \"RUN_COMPLETED\":\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"WORKFLOW_COMPLETED\",\n\t\t\t\t// state machine reads event.response for the final content\n\t\t\t\tresponse: event.response ?? event.message,\n\t\t\t};\n\t\tcase \"RUN_FAILED\":\n\t\t\treturn {\n\t\t\t\t...event,\n\t\t\t\teventType: \"WORKFLOW_ERROR\",\n\t\t\t\terrorMessage: (event.errorMessage as string | undefined) ?? (event.message as string | undefined),\n\t\t\t};\n\t\tdefault:\n\t\t\treturn event;\n\t}\n}\n\n/**\n * Match an OTP/verification prompt the server may send as a USER_ACTION\n * payload's `message`. Used to suppress the prompt body from being\n * surfaced as a status label — the dedicated USER_ACTION renderer\n * already shows it in a verification card, so the bubble fallback\n * stays focused on succinct status labels instead.\n */\nfunction isUserActionPrompt(text: string): boolean {\n\treturn /\\benter\\b.+\\b(code|otp)\\b/i.test(text) ||\n\t\t/\\b(authorization|verification)\\s+code\\b/i.test(text) ||\n\t\t/\\bsent\\s+to\\s+your\\b/i.test(text);\n}\n\n/**\n * Translate a USER_ACTION_* event into a short, status-line-friendly\n * message. Falls back to a generic per-state default when the server\n * didn't supply a meaningful `message` (or supplied one that's just\n * the OTP prompt body).\n */\nexport function getUserActionDisplayMessage(\n\teventType: string,\n\trawMessage?: string,\n): string {\n\tconst raw = rawMessage?.trim();\n\tconst safeRaw = raw && !isUserActionPrompt(raw) ? raw : \"\";\n\n\tswitch (eventType) {\n\t\tcase \"USER_ACTION_REQUIRED\":\n\t\t\treturn raw || \"Waiting for verification...\";\n\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\treturn safeRaw || \"Verification approved\";\n\t\tcase \"USER_ACTION_INVALID\":\n\t\t\treturn safeRaw || \"Invalid code. Please try again.\";\n\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\treturn safeRaw || \"Verification cancelled\";\n\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\treturn safeRaw || \"Verification expired\";\n\t\tcase \"USER_ACTION_RESENT\":\n\t\t\treturn safeRaw || \"Verification code resent\";\n\t\tcase \"USER_ACTION_FAILED\":\n\t\t\treturn safeRaw || \"Verification failed\";\n\t\tdefault:\n\t\t\treturn safeRaw || raw || eventType;\n\t}\n}\n\n/**\n * Strip noisy \"Identified N tasks to execute\" preambles from the\n * working-phase detail line — they pad the chat-bubble status with\n * a generic placeholder when the substantive label is the next event.\n */\nexport function workingPhaseDetailForDisplay(raw: string): string {\n\tconst t = raw.trim();\n\tif (!t) return \"\";\n\tif (/^Identified\\s+\\d+\\s+tasks?\\s+to\\s+execute\\.?$/i.test(t)) {\n\t\treturn \"\";\n\t}\n\treturn t;\n}\n\nexport type V2EventProcessorState = {\n\tformattedThinkingText: string;\n\tfinalResponse: string;\n\tcurrentWorker: string;\n\tlastEventType: string;\n\tsessionId?: string;\n\texecutionId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n\tuserActionRequest?: UserActionRequest;\n\tuserActionPending: boolean;\n\tuserActionResult?: UserActionResult;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\t/** Server-computed wall-clock duration captured from RUN_COMPLETED's `totalTimeMs`. */\n\ttotalElapsedMs?: number;\n};\n\nfunction getEventText(event: StreamEvent, field: string): string {\n\tconst value = event[field];\n\treturn typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction shouldShowIntentHeader(event: StreamEvent): boolean {\n\tconst workerName = getEventText(event, \"workerName\");\n\tconst intentId = getEventText(event, \"intentId\");\n\treturn Boolean(workerName && intentId && workerName === intentId);\n}\n\nfunction addThinkingHeader(state: V2EventProcessorState, header: string) {\n\tstate.formattedThinkingText += (state.formattedThinkingText ? \"\\n\" : \"\") + header;\n}\n\nfunction addThinkingDetail(state: V2EventProcessorState, detail: string) {\n\tconst trimmed = detail.trim();\n\tif (!trimmed) return;\n\tstate.formattedThinkingText += (state.formattedThinkingText ? \"\\n\" : \"\") + trimmed;\n}\n\nfunction addThinkingLine(state: V2EventProcessorState, header: string, detail: string) {\n\tstate.formattedThinkingText += (state.formattedThinkingText ? \"\\n\" : \"\") + header + \"\\n\" + detail;\n}\n\nfunction appendThinkingText(state: V2EventProcessorState, text: string) {\n\tstate.formattedThinkingText += text;\n}\n\n/**\n * Mirror the current tool-call START label onto the enclosing\n * in-progress STAGE_STARTED(\"execution\") step.\n *\n * Called on INTENT_STARTED only (not INTENT_COMPLETED). AGENTIC runs\n * fire many back-to-back tools (especially long query_engine chains),\n * so alternating start→end labels on every call produced a rapid\n * flicker of \"Crunching the numbers\" → \"Got 20 rows\" → \"Crunching\n * the numbers\" → \"Got 16 rows\" during a 60-120s run. Mirroring only\n * the start label means back-to-back same-type calls read as one\n * stable label (\"Crunching the numbers\" throughout the chain), with\n * transitions only when the tool *kind* actually changes.\n *\n * Why the mirror is needed at all: the chat-bubble label picker\n * walks steps in reverse and returns the most recent in-progress\n * step's message. Between tool calls the tool-level INTENT_STARTED\n * step is completed, so the picker falls back to the still-in-progress\n * execution-stage step — whose message is the static \"Executing…\"\n * default from the server. Mirroring the tool label onto that stage\n * step keeps the fallback dynamic and meaningful.\n *\n * No-op when `msg` is empty (older k2-server builds without\n * descriptions) or when no execution-stage step is in progress (run\n * hasn't reached the execution stage yet).\n */\nfunction updateExecutionStageMessage(state: V2EventProcessorState, msg: string): void {\n\tif (!msg) return;\n\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\tconst s = state.steps[i];\n\t\t// Match BOTH \"executor\" (current k2-server) and \"execution\"\n\t\t// (legacy ExecutionEngine). Without the \"executor\" match, the\n\t\t// tool-label mirror never landed on modern server builds and\n\t\t// the chat bubble was stuck on bland \"Executing…\" while the\n\t\t// pipeline panel showed live \"Crunching the numbers\"-style\n\t\t// labels — visible chat/pipeline desync.\n\t\tif (\n\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t(s.stage === \"executor\" || s.stage === \"execution\") &&\n\t\t\ts.status === \"in_progress\"\n\t\t) {\n\t\t\ts.message = msg;\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nfunction completeLastInProgressStep(steps: StreamingStep[]): void {\n\tfor (let i = steps.length - 1; i >= 0; i--) {\n\t\tif (steps[i].status === \"in_progress\") {\n\t\t\tsteps[i].status = \"completed\";\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport function createInitialV2State(): V2EventProcessorState {\n\treturn {\n\t\tformattedThinkingText: \"\",\n\t\tfinalResponse: \"\",\n\t\tcurrentWorker: \"\",\n\t\tlastEventType: \"\",\n\t\tsessionId: undefined,\n\t\texecutionId: undefined,\n\t\thasError: false,\n\t\terrorMessage: \"\",\n\t\tuserActionRequest: undefined,\n\t\tuserActionPending: false,\n\t\tuserActionResult: undefined,\n\t\tfinalData: undefined,\n\t\tsteps: [],\n\t\tstepCounter: 0,\n\t\tcurrentExecutingStepId: undefined,\n\t};\n}\n\nexport function processStreamEventV2(\n\trawEvent: StreamEvent,\n\tstate: V2EventProcessorState,\n): V2EventProcessorState {\n\tconst event = normalizeEvent(rawEvent);\n\tconst eventType = event.eventType;\n\n\tif (typeof eventType === \"string\" && eventType.toUpperCase() === \"KEEP_ALIVE\") {\n\t\tif (event.executionId) state.executionId = event.executionId;\n\t\tif (event.sessionId) state.sessionId = event.sessionId;\n\t\t// k2-server attaches a rotating K2-voice phrase as `description` so\n\t\t// the chat-bubble status line changes during silent-think gaps\n\t\t// instead of staying pinned to \"Thinking\" for tens of seconds.\n\t\t// Mirror it onto the most-recent in-progress step's message so the\n\t\t// stream manager's `currentMessage` picker (which walks\n\t\t// state.steps for the latest substantive label) surfaces it.\n\t\tconst description = typeof event.description === \"string\" ? event.description : \"\";\n\t\tif (description) {\n\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\tif (state.steps[i].status === \"in_progress\") {\n\t\t\t\t\tstate.steps[i].message = description;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn state;\n\t}\n\n\tif (typeof eventType === \"string\" && eventType.toUpperCase() === \"THINKING_DELTA\") {\n\t\t// Anthropic extended-thinking content streamed live. Append to the\n\t\t// formatted thinking buffer so it lands in the same panel as the\n\t\t// step-by-step thinking lines built from INTENT_THINKING events.\n\t\t// Leading newline only when there's existing content and the buffer\n\t\t// doesn't already end with one — keeps deltas mid-sentence flowing\n\t\t// without injecting paragraph breaks.\n\t\tconst text = typeof event.text === \"string\" ? event.text : \"\";\n\t\tif (text) {\n\t\t\tappendThinkingText(state, text);\n\t\t}\n\t\tif (event.executionId) state.executionId = event.executionId;\n\t\tif (event.sessionId) state.sessionId = event.sessionId;\n\t\tstate.lastEventType = \"THINKING_DELTA\";\n\t\treturn state;\n\t}\n\n\tif (event.executionId) state.executionId = event.executionId;\n\tif (event.sessionId) state.sessionId = event.sessionId;\n\n\tconst message = getEventMessage(event);\n\n\tswitch (eventType) {\n\t\tcase \"WORKFLOW_STARTED\":\n\t\tcase \"STARTED\":\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\n\t\tcase \"INTENT_PROGRESS\": {\n\t\t\t// Streaming delta from the Formatter stage — each event\n\t\t\t// carries `partialText` (the new chunk) which the legacy\n\t\t\t// translator surfaces as `event.message`. Accumulate into\n\t\t\t// state.finalResponse so the stream manager can mirror it\n\t\t\t// into streamingContent in real time. The WORKFLOW_COMPLETED\n\t\t\t// event at the end still lands with the authoritative full\n\t\t\t// text; this just lets us show the answer building up.\n\t\t\t//\n\t\t\t// IMPORTANT: read raw values, do NOT `getEventText()` here.\n\t\t\t// getEventText() calls .trim(), which strips the leading\n\t\t\t// and trailing whitespace that providers include in each\n\t\t\t// token delta (\" bank\", \"accounts \", \"with\"). Trimming at\n\t\t\t// this layer destroys inter-word spacing and produces\n\t\t\t// \"Hereareallyourbankaccounts\" once deltas are concatenated.\n\t\t\tconst rawMessage = typeof event.message === \"string\" ? event.message : \"\";\n\t\t\tconst rawPartial = typeof event.partialText === \"string\" ? event.partialText : \"\";\n\t\t\tconst delta = rawMessage || rawPartial;\n\t\t\tif (delta.length > 0) {\n\t\t\t\tstate.finalResponse += delta;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_THINKING\": {\n\t\t\tconst worker = getEventText(event, \"workerName\") || \"Worker\";\n\t\t\tconst msg = getEventText(event, \"message\") || \"Thinking...\";\n\t\t\tconst showHeader = shouldShowIntentHeader(event);\n\n\t\t\tif (worker !== state.currentWorker) {\n\t\t\t\tstate.currentWorker = worker;\n\t\t\t\tif (showHeader && msg && msg !== worker) {\n\t\t\t\t\taddThinkingLine(state, `**${worker}**`, msg);\n\t\t\t\t} else if (showHeader) {\n\t\t\t\t\taddThinkingHeader(state, `**${worker}**`);\n\t\t\t\t} else if (msg && msg !== \"Thinking...\") {\n\t\t\t\t\taddThinkingDetail(state, msg);\n\t\t\t\t}\n\t\t\t} else if (msg && (showHeader || msg !== \"Thinking...\")) {\n\t\t\t\tappendThinkingText(state, \"\\n\" + msg);\n\t\t\t}\n\n\t\t\t// Backward-compat step tracking\n\t\t\tconst lastInProgress = [...state.steps].reverse().find(s => s.status === \"in_progress\");\n\t\t\tif (lastInProgress) {\n\t\t\t\tlastInProgress.thinkingText = \"\";\n\t\t\t\tlastInProgress.isThinking = true;\n\t\t\t}\n\n\t\t\tstate.lastEventType = \"INTENT_THINKING\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_THINKING_CONT\": {\n\t\t\tconst msg = (event.message as string) || \"\";\n\t\t\tif (!msg) break;\n\n\t\t\tif (state.lastEventType === \"INTENT_THINKING\") {\n\t\t\t\tappendThinkingText(state, \"\\n\" + msg);\n\t\t\t} else {\n\t\t\t\tappendThinkingText(state, msg);\n\t\t\t}\n\n\t\t\tconst thinkingStep = [...state.steps].reverse().find(s => s.isThinking);\n\t\t\tif (thinkingStep) {\n\t\t\t\tthinkingStep.thinkingText = (thinkingStep.thinkingText || \"\") + msg;\n\t\t\t}\n\n\t\t\tstate.lastEventType = \"INTENT_THINKING_CONT\";\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"ORCHESTRATOR_THINKING\": {\n\t\t\taddThinkingLine(state, \"**Planning**\", (event.message as string) || \"Understanding your request...\");\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"ORCHESTRATOR_COMPLETED\": {\n\t\t\tconst workingDetail = workingPhaseDetailForDisplay(message);\n\t\t\tif (workingDetail) {\n\t\t\t\taddThinkingLine(state, \"**Working**\", workingDetail);\n\t\t\t} else {\n\t\t\t\taddThinkingHeader(state, \"**Working**\");\n\t\t\t}\n\n\t\t\tstate.steps.push({\n\t\t\t\tid: `step-${state.stepCounter++}`,\n\t\t\t\teventType: \"WORKING\",\n\t\t\t\tmessage: workingDetail,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\n\t\t\tconst step = state.steps.find(s => s.eventType === \"ORCHESTRATOR_THINKING\" && s.status === \"in_progress\");\n\t\t\tif (step) {\n\t\t\t\tstep.status = \"completed\";\n\t\t\t\tif (event.elapsedMs) step.elapsedMs = event.elapsedMs;\n\t\t\t\tif (step.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_STARTED\": {\n\t\t\tconst worker = getEventText(event, \"workerName\") || \"Worker\";\n\t\t\tconst msg = getEventText(event, \"message\") || \"Starting...\";\n\t\t\tconst showHeader = shouldShowIntentHeader(event);\n\t\t\tstate.currentWorker = worker;\n\n\t\t\tif (showHeader && msg !== worker) {\n\t\t\t\taddThinkingLine(state, `**${worker}**`, msg);\n\t\t\t} else if (showHeader) {\n\t\t\t\taddThinkingHeader(state, `**${worker}**`);\n\t\t\t} else {\n\t\t\t\taddThinkingDetail(state, msg);\n\t\t\t}\n\n\t\t\tconst thinkingStep = state.steps.find(s => s.isThinking);\n\t\t\tif (thinkingStep) thinkingStep.isThinking = false;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\t// Keep the enclosing execution stage step in sync with the\n\t\t\t// current tool label so the UI never flashes back to\n\t\t\t// \"Executing…\" between tool calls. See helper docs.\n\t\t\tupdateExecutionStageMessage(state, message);\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"INTENT_COMPLETED\": {\n\t\t\tconst intentStep = state.steps.find(s => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\");\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.status = \"completed\";\n\t\t\t\tintentStep.isThinking = false;\n\t\t\t\tif (event.elapsedMs) intentStep.elapsedMs = event.elapsedMs;\n\t\t\t\tif (intentStep.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\t// DO NOT update the enclosing execution-stage message\n\t\t\t// here. AGENTIC runs fire many back-to-back tools\n\t\t\t// (especially query_engine chains) and surfacing the\n\t\t\t// per-tool completion label (\"Got 20 rows\" → \"Got 16\n\t\t\t// rows\" → …) caused a rapid flicker between start/end\n\t\t\t// labels during the 60-120s loop. Keeping the stage step\n\t\t\t// pinned to the CURRENT tool's start description means\n\t\t\t// back-to-back same-type tool calls all read as the same\n\t\t\t// stable label (\"Crunching the numbers\" throughout the\n\t\t\t// query_engine chain). The detail per tool still lives\n\t\t\t// on the tool's own step for expanded / trace views.\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"AGGREGATOR_THINKING\": {\n\t\t\taddThinkingLine(state, \"**Finalizing**\", (event.message as string) || \"Preparing response...\");\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"AGGREGATOR_COMPLETED\": {\n\t\t\tappendThinkingText(state, \"\\n\" + ((event.message as string) || \"Response ready\"));\n\n\t\t\tconst step = state.steps.find(s => s.eventType === \"AGGREGATOR_THINKING\" && s.status === \"in_progress\");\n\t\t\tif (step) {\n\t\t\t\tstep.status = \"completed\";\n\t\t\t\tif (event.elapsedMs) step.elapsedMs = event.elapsedMs;\n\t\t\t\tif (step.id === state.currentExecutingStepId) state.currentExecutingStepId = undefined;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"WORKFLOW_COMPLETED\":\n\t\tcase \"COMPLETED\": {\n\t\t\t// Capture server-computed wall-clock duration. Authoritative.\n\t\t\tconst totalTime = Number(event.totalTimeMs);\n\t\t\tif (Number.isFinite(totalTime) && totalTime > 0) {\n\t\t\t\tstate.totalElapsedMs = totalTime;\n\t\t\t}\n\n\t\t\tlet content = extractResponseContent(event.response);\n\t\t\tconst trace = event.trace && typeof event.trace === \"object\" ? (event.trace as Record<string, unknown>) : null;\n\t\t\tif (!content && trace?.workflowMsg && typeof trace.workflowMsg === \"string\") {\n\t\t\t\tcontent = trace.workflowMsg;\n\t\t\t}\n\t\t\tif (!content && trace?.aggregator && typeof trace.aggregator === \"object\") {\n\t\t\t\tconst agg = trace.aggregator as Record<string, unknown>;\n\t\t\t\tif (typeof agg.response === \"string\") content = agg.response;\n\t\t\t\telse content = extractResponseContent(agg.response);\n\t\t\t}\n\n\t\t\tif (content) {\n\t\t\t\tstate.finalResponse = content;\n\t\t\t\t// `finalData` feeds `tracingData` on the final\n\t\t\t\t// MessageDisplay and must be either an object or\n\t\t\t\t// undefined. Previously this set finalData to a bare\n\t\t\t\t// string when the event carried a response but no\n\t\t\t\t// structured trace, which downstream rendered as\n\t\t\t\t// {\"0\":\"H\",\"1\":\"e\",...} in the JSON view because the\n\t\t\t\t// viewer iterates strings character-by-character.\n\t\t\t\t//\n\t\t\t\t// Legacy non-K2 servers embed a structured trace\n\t\t\t\t// object in event.trace; preserve that. K2 playground\n\t\t\t\t// runs emit only event.response/event.message inline\n\t\t\t\t// — the full trace is fetched on demand via\n\t\t\t\t// GET /api/playground/executions/{id}/trace using the\n\t\t\t\t// executionId already on state.\n\t\t\t\tif (event.trace && typeof event.trace === \"object\") {\n\t\t\t\t\tstate.finalData = event.trace;\n\t\t\t\t}\n\t\t\t\tstate.hasError = false;\n\t\t\t\tstate.errorMessage = \"\";\n\t\t\t} else {\n\t\t\t\tstate.hasError = true;\n\t\t\t\tstate.errorMessage = \"WORKFLOW_FAILED\";\n\t\t\t}\n\n\t\t\tstate.steps.forEach(step => {\n\t\t\t\tif (step.status === \"in_progress\") {\n\t\t\t\t\tstep.status = \"completed\";\n\t\t\t\t\tstep.isThinking = false;\n\t\t\t\t}\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_REQUIRED\": {\n\t\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t\tif (event.userActionRequest) {\n\t\t\t\tstate.userActionRequest = {\n\t\t\t\t\tuserActionId: event.userActionRequest.userActionId,\n\t\t\t\t\tuserActionType: event.userActionRequest.userActionType as UserActionType | undefined,\n\t\t\t\t\tmessage: event.userActionRequest.message,\n\t\t\t\t\trequestedSchema: event.userActionRequest.requestedSchema,\n\t\t\t\t\tmetadata: event.userActionRequest.metadata,\n\t\t\t\t};\n\t\t\t}\n\t\t\tstate.userActionPending = true;\n\n\t\t\tconst req = event.userActionRequest;\n\t\t\tconst displayMessage = getUserActionDisplayMessage(\n\t\t\t\teventType,\n\t\t\t\t(req?.message as string | undefined) || message,\n\t\t\t);\n\t\t\tif (req) {\n\t\t\t\taddThinkingLine(state, \"**Verification Required**\", displayMessage);\n\t\t\t}\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_SUCCESS\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n✓ \" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\t\t\tstate.userActionResult = \"approved\";\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_INVALID\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n✗ \" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\n\t\t\tconst errorStepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: errorStepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"error\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\n\t\t\tconst retryStepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: retryStepId,\n\t\t\t\teventType: \"USER_ACTION_REQUIRED\",\n\t\t\t\tmessage: \"Waiting for verification...\",\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = retryStepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_REJECTED\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n\" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\t\t\tstate.userActionResult = \"rejected\";\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_EXPIRED\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n✗ \" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"error\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_RESENT\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(eventType, event.message as string | undefined);\n\t\t\tappendThinkingText(state, \"\\n\" + displayMessage);\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"completed\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"USER_ACTION_FAILED\": {\n\t\t\tconst displayMessage = getUserActionDisplayMessage(\n\t\t\t\teventType,\n\t\t\t\t(event.message as string | undefined) || (event.errorMessage as string | undefined),\n\t\t\t);\n\t\t\tappendThinkingText(state, \"\\n✗ \" + displayMessage);\n\t\t\tcompleteLastInProgressStep(state.steps);\n\t\t\tstate.userActionRequest = undefined;\n\t\t\tstate.userActionPending = false;\n\n\t\t\tconst stepId = `step-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: displayMessage,\n\t\t\t\tstatus: \"error\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\telapsedMs: event.elapsedMs,\n\t\t\t});\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"WORKFLOW_ERROR\":\n\t\tcase \"ERROR\":\n\t\t\tstate.hasError = true;\n\t\t\tstate.errorMessage = (event.errorMessage as string) || (event.message as string) || \"Workflow error\";\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\n\t\tcase \"INTENT_ERROR\": {\n\t\t\tstate.errorMessage = message || event.errorMessage || \"An error occurred\";\n\n\t\t\tconst intentStep = state.steps.find(s => s.eventType === \"INTENT_STARTED\" && s.status === \"in_progress\");\n\t\t\tif (intentStep) {\n\t\t\t\tintentStep.status = \"error\";\n\t\t\t\tintentStep.isThinking = false;\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\t// ---- K2 pipeline stage lifecycle events ----\n\t\t//\n\t\t// The k2-server playground streaming API emits\n\t\t// STAGE_STARTED / STAGE_COMPLETED / STAGE_FAILED /\n\t\t// STAGE_SKIPPED around each pipeline stage so the UI can\n\t\t// show real progress (sanitizer → analyzer → planner → …)\n\t\t// instead of a static placeholder. Each STAGE_STARTED\n\t\t// pushes an in-progress step with a user-facing label; the\n\t\t// matching STAGE_COMPLETED/FAILED closes it WITHOUT\n\t\t// rewriting the label — a terse \"completed\" flash between\n\t\t// stages was more noise than signal. STAGE_SKIPPED removes\n\t\t// the just-opened step entirely (skipping is expected on\n\t\t// DIRECT_RESPONSE short-circuits).\n\t\t//\n\t\t// Finding the matching step uses `stepId` directly rather\n\t\t// than comparing labels — the processor remembers which id\n\t\t// it minted for the latest open STAGE_STARTED and the\n\t\t// closing events look it up from state.currentExecutingStepId.\n\n\t\tcase \"STAGE_STARTED\": {\n\t\t\tconst stage = getEventText(event, \"stage\");\n\t\t\tif (!stage) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// Prefer the server-provided `message` — each K2 pipeline\n\t\t\t// stage now ships its own user-facing label on StageStarted\n\t\t\t// (Analyzer: \"Thinking…\", Prefetcher: \"Gathering context…\",\n\t\t\t// etc.). Fall back to the SDK's static stageLabel() table\n\t\t\t// only if the server didn't send one, which keeps this\n\t\t\t// processor compatible with older k2-server builds.\n\t\t\tconst serverMessage = getEventText(event, \"message\");\n\t\t\tlet initialMessage = serverMessage || stageLabel(stage);\n\n\t\t\t// Execution-stage special case: the server's default label\n\t\t\t// is a bare \"Executing…\" which would show for the 5-10s\n\t\t\t// between STAGE_STARTED(\"executor\") and the first\n\t\t\t// TOOL_CALL_STARTED in an AGENTIC run. Prefer the\n\t\t\t// Analyzer's LLM-generated status (\"Pulling those up for\n\t\t\t// you now.\") — it's request-specific and bridges the gap\n\t\t\t// to the first tool event. Tool events subsequently mutate\n\t\t\t// this step's message via updateExecutionStageMessage().\n\t\t\t//\n\t\t\t// Match BOTH \"executor\" (current k2-server stage key) and\n\t\t\t// \"execution\" (legacy ExecutionEngine stage). Without the\n\t\t\t// \"executor\" match, the special case never fired against\n\t\t\t// modern server builds — observed in production: the chat\n\t\t\t// bubble showed bland \"Executing…\" for the entire agentic\n\t\t\t// run despite the analyzer having shipped a useful narrative\n\t\t\t// status that should have been inherited.\n\t\t\tif (stage === \"executor\" || stage === \"execution\") {\n\t\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst s = state.steps[i];\n\t\t\t\t\tif (\n\t\t\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\t\t\ts.stage === \"analyzer\" &&\n\t\t\t\t\t\ts.status === \"completed\" &&\n\t\t\t\t\t\ts.message\n\t\t\t\t\t) {\n\t\t\t\t\t\tinitialMessage = s.message;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst stepId = `stage-${stage}-${state.stepCounter++}`;\n\t\t\tstate.steps.push({\n\t\t\t\tid: stepId,\n\t\t\t\teventType,\n\t\t\t\tmessage: initialMessage,\n\t\t\t\tstatus: \"in_progress\",\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tstage,\n\t\t\t});\n\t\t\tstate.currentExecutingStepId = stepId;\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"STAGE_COMPLETED\": {\n\t\t\t// Close the most recent in-progress step for this stage.\n\t\t\t// If the server provides a new `message` (the Analyzer's\n\t\t\t// LLM-generated \"Pulling those up for you now.\"), OVERWRITE\n\t\t\t// the step's label before marking completed — the UI's\n\t\t\t// currentStepLabel fallback shows the most recent step's\n\t\t\t// label during the gap between stages, so updating here\n\t\t\t// means the user sees the dynamic status instead of the\n\t\t\t// generic start-label until the next STAGE_STARTED lands.\n\t\t\tconst stage = getEventText(event, \"stage\");\n\t\t\tif (!stage) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst serverMessage = getEventText(event, \"message\");\n\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\tconst s = state.steps[i];\n\t\t\t\tif (\n\t\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\t\ts.stage === stage &&\n\t\t\t\t\ts.status === \"in_progress\"\n\t\t\t\t) {\n\t\t\t\t\tif (serverMessage) s.message = serverMessage;\n\t\t\t\t\ts.status = \"completed\";\n\t\t\t\t\tconst durationMs = Number(event.durationMs);\n\t\t\t\t\tif (Number.isFinite(durationMs)) s.elapsedMs = durationMs;\n\t\t\t\t\tif (s.id === state.currentExecutingStepId) {\n\t\t\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"STAGE_FAILED\": {\n\t\t\t// Same as STAGE_COMPLETED but the step's status becomes\n\t\t\t// \"error\". If the server provides a specific failure\n\t\t\t// message we surface it; otherwise the label stays so the\n\t\t\t// user at least sees which stage was running. Expanded\n\t\t\t// Thought view renders errored steps differently via CSS.\n\t\t\tconst stage = getEventText(event, \"stage\");\n\t\t\tif (!stage) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst serverMessage = getEventText(event, \"message\");\n\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\tconst s = state.steps[i];\n\t\t\t\tif (\n\t\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\t\ts.stage === stage &&\n\t\t\t\t\ts.status === \"in_progress\"\n\t\t\t\t) {\n\t\t\t\t\tif (serverMessage) s.message = serverMessage;\n\t\t\t\t\ts.status = \"error\";\n\t\t\t\t\tconst durationMs = Number(event.durationMs);\n\t\t\t\t\tif (Number.isFinite(durationMs)) s.elapsedMs = durationMs;\n\t\t\t\t\tif (s.id === state.currentExecutingStepId) {\n\t\t\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tcase \"STAGE_SKIPPED\": {\n\t\t\t// Mark the matching in-progress step as \"skipped\" rather\n\t\t\t// than removing it. The chat-bubble thinking animation\n\t\t\t// only reads in-progress steps so marking skipped doesn't\n\t\t\t// affect it. But pipeline-sidebar UIs need the step\n\t\t\t// retained (with the \"skipped\" status) so they can render\n\t\t\t// a visual indicator (e.g. a MinusCircle icon) for stages\n\t\t\t// the pipeline intentionally bypassed.\n\t\t\tconst stage = getEventText(event, \"stage\");\n\t\t\tif (!stage) {\n\t\t\t\tstate.lastEventType = eventType;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tfor (let i = state.steps.length - 1; i >= 0; i--) {\n\t\t\t\tconst s = state.steps[i];\n\t\t\t\tif (\n\t\t\t\t\ts.eventType === \"STAGE_STARTED\" &&\n\t\t\t\t\ts.stage === stage &&\n\t\t\t\t\ts.status === \"in_progress\"\n\t\t\t\t) {\n\t\t\t\t\tif (s.id === state.currentExecutingStepId) {\n\t\t\t\t\t\tstate.currentExecutingStepId = undefined;\n\t\t\t\t\t}\n\t\t\t\t\ts.status = \"skipped\" as typeof s.status;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t\t}\n\n\t\tdefault:\n\t\t\tstate.lastEventType = eventType;\n\t\t\tbreak;\n\t}\n\n\treturn state;\n}\n","import type { MessageDisplay, StreamingStep, UserActionResult } from \"../types\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/**\n * Build a richly-formatted thinking string from the SDK's `steps` array\n * and raw `allThinkingText`. This matches the demo's streaming format\n * so both the SDK and demo produce identical thinking output.\n *\n * The SDK's `allThinkingText` only contains raw `INTENT_THINKING_CONT`\n * deltas — no phase headers. This function reconstructs the full format\n * from the steps array, which stores every event the SDK processes.\n */\nexport function buildFormattedThinking(\n\tsteps: StreamingStep[] | undefined,\n\tallThinkingText: string,\n): string {\n\tconst parts: string[] = [];\n\tconst safeSteps = steps ?? [];\n\n\t// Detect orphaned \"preflight\" thinking:\n\t// INTENT_THINKING events that fire before any INTENT_STARTED don't\n\t// create steps, so their text lives only in allThinkingText.\n\tconst cleanAll = allThinkingText.replace(/^\\s+/, \"\");\n\tif (cleanAll) {\n\t\tconst firstStepWithThinking = safeSteps.find(\n\t\t\t(s) => s.thinkingText && s.thinkingText.trim(),\n\t\t);\n\n\t\tif (!firstStepWithThinking) {\n\t\t\tparts.push(\"**Preflight**\");\n\t\t\tparts.push(cleanAll);\n\t\t} else {\n\t\t\tconst stepText = firstStepWithThinking.thinkingText!.trim();\n\t\t\tconst idx = cleanAll.indexOf(stepText);\n\t\t\tif (idx > 0) {\n\t\t\t\tconst orphaned = cleanAll.substring(0, idx).replace(/\\s+$/, \"\");\n\t\t\t\tif (orphaned) {\n\t\t\t\t\tparts.push(\"**Preflight**\");\n\t\t\t\t\tparts.push(orphaned);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build formatted sections from steps\n\tfor (const step of safeSteps) {\n\t\tswitch (step.eventType) {\n\t\t\tcase \"STAGE_STARTED\": {\n\t\t\t\t// K2 pipeline stage: render the step's message as a\n\t\t\t\t// bold statement so ThinkingBlockV2 picks it up as\n\t\t\t\t// the current step label. The processor sets the\n\t\t\t\t// message to `stageLabel(stage)` on STAGE_STARTED\n\t\t\t\t// and leaves it unchanged on STAGE_COMPLETED / FAILED\n\t\t\t\t// (see v2EventProcessor.ts for why we don't flash a\n\t\t\t\t// \"completed\" variant).\n\t\t\t\tif (step.message) parts.push(`**${step.message}**`);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"ORCHESTRATOR_THINKING\":\n\t\t\t\tparts.push(\"**Planning**\");\n\t\t\t\tif (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"INTENT_STARTED\": {\n\t\t\t\tlet label = step.message || \"Processing\";\n\t\t\t\tconst started = label.match(/^(.+?)\\s+started$/i);\n\t\t\t\tconst progress = label.match(/^(.+?)\\s+in progress$/i);\n\t\t\t\tif (started) label = started[1];\n\t\t\t\telse if (progress) label = progress[1];\n\t\t\t\tparts.push(`**${label}**`);\n\t\t\t\tif (step.thinkingText) parts.push(step.thinkingText);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"INTENT_PROGRESS\": {\n\t\t\t\tif (step.thinkingText) parts.push(step.thinkingText);\n\t\t\t\telse if (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"AGGREGATOR_THINKING\":\n\t\t\t\tparts.push(\"**Finalizing**\");\n\t\t\t\tif (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_REQUIRED\":\n\t\t\t\tparts.push(\"**Verification Required**\");\n\t\t\t\tif (step.message) parts.push(step.message);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\t\tparts.push(`✓ ${step.message || \"Verification successful\"}`);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\t\tparts.push(`✗ ${step.message || \"Verification rejected\"}`);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\t\tparts.push(`✗ ${step.message || \"Verification expired\"}`);\n\t\t\t\tbreak;\n\n\t\t\tcase \"USER_ACTION_FAILED\":\n\t\t\t\tparts.push(`✗ ${step.message || \"Verification failed\"}`);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn parts.length > 0 ? parts.join(\"\\n\") : allThinkingText;\n}\n\n/**\n * Create streaming message update with error handling\n */\nexport function createStreamingMessageUpdate(state: {\n\thasError: boolean;\n\terrorMessage: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\tcurrentMessage?: string;\n\texecutionId?: string;\n\tsessionId?: string;\n\tsteps: StreamingStep[];\n\tcurrentExecutingStepId?: string;\n\tuserActionResult?: UserActionResult;\n\tactiveThinkingText?: string;\n\tallThinkingText?: string;\n}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\tconst steps = state.hasError ? [] : [...state.steps];\n\tconst allThinking = state.hasError ? undefined : state.allThinkingText;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? FRIENDLY_ERROR_MESSAGE\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : \"\",\n\t\tcurrentMessage: state.hasError ? undefined : state.currentMessage,\n\t\tstreamProgress: state.hasError ? (\"error\" as const) : (\"processing\" as const),\n\t\tisError: state.hasError,\n\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\texecutionId: state.executionId,\n\t\tsessionId: state.sessionId,\n\t\tsteps,\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\n\t\tuserActionResult: state.userActionResult,\n\t\tactiveThinkingText: state.hasError ? undefined : state.activeThinkingText,\n\t\tallThinkingText: allThinking,\n\t\tformattedThinkingText: state.hasError ? undefined : buildFormattedThinking(steps, allThinking || \"\"),\n\t};\n}\n\n/**\n * Create error message update for abort or error scenarios\n */\nexport function createErrorMessageUpdate(\n\terror: Error,\n\tstate: {\n\t\taccumulatedContent: string;\n\t\tcurrentMessage?: string;\n\t\tsteps: StreamingStep[];\n\t}\n): Partial<MessageDisplay> {\n\tconst isAborted = error.name === \"AbortError\";\n\n\treturn {\n\t\tisStreaming: false,\n\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\tisError: !isAborted,\n\t\tisCancelled: isAborted,\n\t\terrorDetails: isAborted ? undefined : error.message,\n\t\tcontent: isAborted\n\t\t\t? state.accumulatedContent || \"\"\n\t\t\t: state.accumulatedContent || FRIENDLY_ERROR_MESSAGE,\n\t\t// Preserve currentMessage when cancelled so UI can show it\n\t\tcurrentMessage: isAborted ? state.currentMessage || \"Thinking...\" : undefined,\n\t\tsteps: [...state.steps].map((step) => {\n\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t}\n\t\t\treturn step;\n\t\t}),\n\t\tcurrentExecutingStepId: undefined,\n\t};\n}\n\n/**\n * Create final completed message\n */\nexport function createFinalMessage(\n\tstreamingId: string,\n\tstate: {\n\t\thasError: boolean;\n\t\terrorMessage: string;\n\t\taccumulatedContent: string;\n\t\tsessionId?: string;\n\t\texecutionId?: string;\n\t\tfinalData?: unknown;\n\t\tsteps: StreamingStep[];\n\t\tuserActionResult?: UserActionResult;\n\t\tallThinkingText?: string;\n\t\tisResolvingImages?: boolean;\n\t\ttotalElapsedMs?: number;\n\t}\n): MessageDisplay {\n\tconst steps = state.hasError ? [] : [...state.steps];\n\tconst allThinking = state.hasError ? undefined : state.allThinkingText;\n\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : state.accumulatedContent || \"\",\n\t\ttimestamp: new Date().toISOString(),\n\t\tisStreaming: false,\n\t\tstreamProgress: state.hasError ? \"error\" : \"completed\",\n\t\tisError: state.hasError,\n\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\texecutionId: state.executionId,\n\t\t// Defensive guard: tracingData must never be a bare string.\n\t\t// The UI renders it via @uiw/react-json-view which iterates\n\t\t// strings character-by-character as `{\"0\":\"H\",\"1\":\"e\",...}`.\n\t\t// If finalData somehow carries a string despite the event-\n\t\t// processor fixes, drop it — the UI should fetch the real\n\t\t// trace via executionId instead.\n\t\ttracingData: toSafeTracingData(state.finalData),\n\t\tsteps,\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\n\t\tuserActionResult: state.userActionResult,\n\t\tactiveThinkingText: undefined,\n\t\tallThinkingText: allThinking,\n\t\tformattedThinkingText: state.hasError ? undefined : buildFormattedThinking(steps, allThinking || \"\"),\n\t\tisResolvingImages: state.hasError ? undefined : state.isResolvingImages,\n\t\ttotalElapsedMs: state.hasError ? undefined : state.totalElapsedMs,\n\t};\n}\n\n/**\n * Coerce a `finalData` value into something safe to drop into\n * `MessageDisplay.tracingData`. The UI's JSON viewer expects an\n * object; anything else (strings, numbers, booleans) would render\n * nonsensically. Returns `undefined` for scalar values so the UI\n * falls through to its fetch-by-executionId path instead.\n */\nfunction toSafeTracingData(finalData: unknown): unknown {\n\tif (finalData == null) return undefined;\n\tif (typeof finalData === \"object\") return finalData;\n\treturn undefined;\n}\n\n/**\n * Create cancelled message update\n */\nexport function createCancelledMessageUpdate(\n\tsteps: StreamingStep[],\n\tcurrentMessage?: string\n): Partial<MessageDisplay> {\n\tconst updatedSteps = steps.map((step) => {\n\t\tif (step.status === \"in_progress\") {\n\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t}\n\t\treturn step;\n\t});\n\n\treturn {\n\t\tisStreaming: false,\n\t\tisCancelled: true,\n\t\tsteps: updatedSteps,\n\t\tcurrentExecutingStepId: undefined,\n\t\t// Preserve currentMessage so UI can show it with X icon\n\t\tcurrentMessage: currentMessage || \"Thinking...\",\n\t};\n}\n","import type { ChatConfig } from \"../types\";\n\nconst DEFAULT_STREAM_ENDPOINT = \"/api/playground/ask/stream\";\n\n/**\n * Latency-vs-precision toggle surfaced in the chat widget. \"fast\"\n * (default) lets the server cap list-tool fetches and answer\n * quickly; \"deep\" runs a full analytical pass. The value is\n * forwarded verbatim to the server, which normalizes it — any\n * other string collapses to \"fast\" server-side. See\n * `ExecutionRequest.analysisMode` on the k2 backend for the\n * authoritative semantics.\n */\nexport type AnalysisMode = \"fast\" | \"deep\";\n\n/**\n * Build request body for the k2 playground ask endpoint.\n *\n * Shape matches PlaygroundAskRequest on the server:\n * { agentId, userInput, sessionId?, sessionOwnerLabel?,\n * sessionAttributes?, analysisMode? }\n *\n * `analysisMode` is omitted from the body when undefined so older\n * SDK versions that don't pass it produce the exact same wire\n * shape they did before — the server defaults missing values to\n * \"fast\" anyway, so including the field is purely informational\n * when the caller hasn't opted in.\n */\nexport function buildRequestBody(\n\tconfig: ChatConfig,\n\tuserMessage: string,\n\tsessionId?: string,\n\toptions?: { analysisMode?: AnalysisMode },\n): Record<string, unknown> {\n\tconst sessionOwner = config.sessionParams;\n\tconst sessionAttributes =\n\t\tsessionOwner?.attributes && Object.keys(sessionOwner.attributes).length > 0\n\t\t\t? sessionOwner.attributes\n\t\t\t: undefined;\n\n\treturn {\n\t\tagentId: config.agentId,\n\t\tuserInput: userMessage,\n\t\tsessionId,\n\t\tsessionOwnerLabel: sessionOwner?.name || undefined,\n\t\tsessionAttributes,\n\t\tanalysisMode: options?.analysisMode,\n\t};\n}\n\n/**\n * Build streaming URL. Defaults to the k2 playground stream endpoint.\n */\nexport function buildStreamingUrl(config: ChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || DEFAULT_STREAM_ENDPOINT;\n\tconst stage = config.stage || \"DEV\";\n\tconst stageParamName = config.stageQueryParam ?? \"stage\";\n\tconst queryParams = new URLSearchParams({ [stageParamName]: stage });\n\n\treturn `${config.api.baseUrl}${endpoint}?${queryParams.toString()}`;\n}\n\n/**\n * Build user action URL (submit / cancel / resend)\n * Derives base path from the stream endpoint by stripping the \"/stream\" suffix.\n */\nexport function buildUserActionUrl(\n\tconfig: ChatConfig,\n\tuserActionId: string,\n\taction: \"submit\" | \"cancel\" | \"resend\",\n): string {\n\tconst endpoint = config.api.streamEndpoint || DEFAULT_STREAM_ENDPOINT;\n\tconst [endpointPath] = endpoint.split(\"?\");\n\tconst normalizedEndpointPath = endpointPath.replace(/\\/+$/, \"\");\n\tconst basePath = normalizedEndpointPath.endsWith(\"/stream\")\n\t\t? normalizedEndpointPath.slice(0, -\"/stream\".length)\n\t\t: normalizedEndpointPath;\n\tconst encodedUserActionId = encodeURIComponent(userActionId);\n\treturn `${config.api.baseUrl}${basePath}/user-action/${encodedUserActionId}/${action}`;\n}\n\n/**\n * Build resolve-image-urls endpoint URL.\n * Derives the base path from the stream endpoint (same pattern as buildUserActionUrl)\n * so that playground URLs stay on the playground path and workflow URLs stay on the\n * workflows path. An explicit resolveImagesEndpoint in config always wins.\n */\nexport function buildResolveImagesUrl(config: ChatConfig): string {\n\tif (config.api.resolveImagesEndpoint) {\n\t\treturn `${config.api.baseUrl}${config.api.resolveImagesEndpoint}`;\n\t}\n\tconst streamEndpoint = config.api.streamEndpoint || DEFAULT_STREAM_ENDPOINT;\n\tconst [endpointPath] = streamEndpoint.split(\"?\");\n\tconst normalizedEndpointPath = endpointPath.replace(/\\/+$/, \"\");\n\tconst basePath = normalizedEndpointPath.endsWith(\"/stream\")\n\t\t? normalizedEndpointPath.slice(0, -\"/stream\".length)\n\t\t: normalizedEndpointPath;\n\treturn `${config.api.baseUrl}${basePath}/resolve-image-urls`;\n}\n\n/**\n * Build request headers\n */\nexport function buildRequestHeaders(config: ChatConfig): Record<string, string> {\n\tconst headers: Record<string, string> = {\n\t\t...config.api.headers,\n\t};\n\tif (config.api.authToken) {\n\t\theaders.Authorization = `Bearer ${config.api.authToken}`;\n\t}\n\treturn headers;\n}\n","import type { ChatConfig } from \"../types\";\nimport { buildUserActionUrl, buildRequestHeaders } from \"./requestBuilder\";\n\ntype UserActionResponse = {\n\tsuccess: boolean;\n\tmessage: string;\n};\n\n/**\n * Internal helper — sends a POST to a user-action endpoint and returns the\n * parsed JSON response. Throws on non-2xx status or JSON parse failure.\n */\nasync function sendUserActionRequest(\n\tconfig: ChatConfig,\n\tuserActionId: string,\n\taction: \"submit\" | \"cancel\" | \"resend\",\n\tdata?: Record<string, unknown>,\n): Promise<UserActionResponse> {\n\tconst url = buildUserActionUrl(config, userActionId, action);\n\tconst baseHeaders = buildRequestHeaders(config);\n\tconst hasBody = data !== undefined;\n\tconst headers = hasBody\n\t\t? { \"Content-Type\": \"application/json\", ...baseHeaders }\n\t\t: baseHeaders;\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: hasBody ? JSON.stringify(data) : undefined,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t}\n\n\treturn await response.json();\n}\n\n/**\n * Submit a user action (e.g. OTP verification)\n */\nexport async function submitUserAction(\n\tconfig: ChatConfig,\n\tuserActionId: string,\n\tdata?: Record<string, unknown>,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"submit\", data);\n}\n\n/**\n * Cancel / reject a user action\n */\nexport async function cancelUserAction(\n\tconfig: ChatConfig,\n\tuserActionId: string,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"cancel\");\n}\n\n/**\n * Resend a user action (e.g. request a new OTP)\n */\nexport async function resendUserAction(\n\tconfig: ChatConfig,\n\tuserActionId: string,\n): Promise<UserActionResponse> {\n\treturn sendUserActionRequest(config, userActionId, \"resend\");\n}\n","import { createMMKV } from \"react-native-mmkv\";\nimport type { MessageDisplay } from \"../types\";\n\nconst storage = createMMKV({ id: \"payman-chat-store\" });\n\nexport const chatStore = {\n\tget(key: string): MessageDisplay[] {\n\t\tconst raw = storage.getString(key);\n\t\tif (!raw) return [];\n\t\ttry {\n\t\t\treturn JSON.parse(raw) as MessageDisplay[];\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t},\n\tset(key: string, messages: MessageDisplay[]): void {\n\t\tstorage.set(key, JSON.stringify(messages));\n\t},\n\tdelete(key: string): void {\n\t\tstorage.delete(key);\n\t},\n};\n","import type { MessageDisplay } from \"../types\";\nimport { chatStore } from \"./chatStore\";\n\ntype Listener = (messages: MessageDisplay[], isWaiting: boolean) => void;\n\ntype StreamEntry = {\n\tmessages: MessageDisplay[];\n\tisWaiting: boolean;\n\tabortController: AbortController;\n\tlisteners: Set<Listener>;\n};\n\n// Keyed by userId — lives at module scope so it survives component unmount/remount\nconst streams = new Map<string, StreamEntry>();\n\nexport const activeStreamStore = {\n\thas(key: string): boolean {\n\t\treturn streams.has(key);\n\t},\n\n\tget(key: string): { messages: MessageDisplay[]; isWaiting: boolean } | null {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return null;\n\t\treturn { messages: entry.messages, isWaiting: entry.isWaiting };\n\t},\n\n\t// Called before startStream — registers the controller and initial messages\n\tstart(key: string, abortController: AbortController, initialMessages: MessageDisplay[]): void {\n\t\tconst existing = streams.get(key);\n\t\tstreams.set(key, {\n\t\t\tmessages: initialMessages,\n\t\t\tisWaiting: true,\n\t\t\tabortController,\n\t\t\tlisteners: existing?.listeners ?? new Set(),\n\t\t});\n\t},\n\n\t// Called by the stream on every event — applies the same updater pattern React uses\n\tapplyMessages(\n\t\tkey: string,\n\t\tupdater: MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[])\n\t): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tconst next = typeof updater === \"function\" ? updater(entry.messages) : updater;\n\t\tentry.messages = next;\n\t\tentry.listeners.forEach((l) => l(next, entry.isWaiting));\n\t},\n\n\tsetWaiting(key: string, waiting: boolean): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.isWaiting = waiting;\n\t\tentry.listeners.forEach((l) => l(entry.messages, waiting));\n\t},\n\n\t// Called when stream completes — persists to chatStore and cleans up\n\tcomplete(key: string): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.isWaiting = false;\n\t\tentry.listeners.forEach((l) => l(entry.messages, false));\n\t\tconst toSave = entry.messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) chatStore.set(key, toSave);\n\t\tstreams.delete(key);\n\t},\n\n\t// Subscribe — returns unsubscribe fn. Component calls this on mount, cleanup on unmount.\n\tsubscribe(key: string, listener: Listener): () => void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return () => {};\n\t\tentry.listeners.add(listener);\n\t\treturn () => {\n\t\t\tstreams.get(key)?.listeners.delete(listener);\n\t\t};\n\t},\n\n\t// Explicit user cancel — aborts the controller and removes the entry\n\tabort(key: string): void {\n\t\tconst entry = streams.get(key);\n\t\tif (!entry) return;\n\t\tentry.abortController.abort();\n\t\tstreams.delete(key);\n\t},\n};\n","import type { ChatConfig } from \"../types\";\nimport { buildResolveImagesUrl, buildRequestHeaders } from \"./requestBuilder\";\n\n/** Matches the RAG image path pattern: /api/rag/chunks/<id>/<version>/<chunk>/image */\nconst RAG_IMAGE_REGEX = /\\/api\\/rag\\/chunks\\/[^\"'\\s]+\\/image/;\n\n/**\n * Returns true if the content contains any unresolved RAG image URLs.\n */\nexport function hasRagImages(content: string): boolean {\n\treturn RAG_IMAGE_REGEX.test(content);\n}\n\n/**\n * Wait one paint before starting the resolve request so the final response\n * can render first and image placeholders can appear in the UI.\n */\nexport async function waitForNextPaint(signal?: AbortSignal): Promise<void> {\n\tif (signal?.aborted) return;\n\n\tawait new Promise<void>((resolve) => {\n\t\tlet isSettled = false;\n\n\t\tconst finish = () => {\n\t\t\tif (isSettled) return;\n\t\t\tisSettled = true;\n\t\t\tsignal?.removeEventListener(\"abort\", finish);\n\t\t\tresolve();\n\t\t};\n\n\t\tsignal?.addEventListener(\"abort\", finish, { once: true });\n\n\t\tif (typeof requestAnimationFrame === \"function\") {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tsetTimeout(finish, 0);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tsetTimeout(finish, 0);\n\t});\n}\n\n/**\n * Calls the resolve-image-urls API to replace RAG image paths with\n * real signed Azure Blob Storage URLs.\n *\n * @throws on non-2xx HTTP status\n */\nexport async function resolveRagImageUrls(\n\tconfig: ChatConfig,\n\tcontent: string,\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tconst url = buildResolveImagesUrl(config);\n\tconst baseHeaders = buildRequestHeaders(config);\n\tconst headers = { \"Content-Type\": \"application/json\", ...baseHeaders };\n\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\theaders,\n\t\tbody: JSON.stringify({ input: content }),\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t}\n\n\tconst text = await response.text();\n\n\t// Handle both plain-text and JSON-wrapped responses\n\ttry {\n\t\tconst parsed = JSON.parse(text);\n\t\tif (typeof parsed === \"string\") return parsed;\n\t\tif (typeof parsed.output === \"string\") return parsed.output;\n\t\tif (typeof parsed.result === \"string\") return parsed.result;\n\t} catch {\n\t\t// Not JSON — treat as plain text\n\t}\n\n\treturn text;\n}\n","import { useCallback, useRef } from \"react\";\nimport type { ChatConfig, ChatCallbacks, MessageDisplay } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport {\n\tprocessStreamEventV2,\n\tcreateInitialV2State,\n\tgetEventMessage,\n\tgetUserActionDisplayMessage,\n\tisBlandStatus,\n} from \"../utils/v2EventProcessor\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n\ttype AnalysisMode,\n} from \"../utils/requestBuilder\";\nimport {\n\thasRagImages,\n\tresolveRagImageUrls,\n\twaitForNextPaint,\n} from \"../utils/ragImageResolver\";\n\nconst FRIENDLY_ERROR_MESSAGE = \"Oops, something went wrong. Please try again.\";\n\n/**\n * V2 stream manager that mirrors the demo's streaming approach:\n * - Builds `formattedThinkingText` incrementally during events (with headers/sections)\n * - Buffers the final response until WORKFLOW_COMPLETED\n * - No throttle interval — UI-side `useTypingEffect` handles animation\n */\nexport function useStreamManagerV2(\n\tconfig: ChatConfig,\n\tcallbacks: ChatCallbacks,\n\tsetMessages: React.Dispatch<React.SetStateAction<MessageDisplay[]>>,\n\tsetIsWaitingForResponse: (waiting: boolean) => void,\n) {\n\tconst abortControllerRef = useRef<AbortController | null>(null);\n\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\n\tconst startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string,\n\t\t\texternalAbortController?: AbortController,\n\t\t\toptions?: { analysisMode?: AnalysisMode },\n\t\t): Promise<string | undefined> => {\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = externalAbortController ?? new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\tconst state = createInitialV2State();\n\n\t\t\tconst updateMessage = (update: Partial<MessageDisplay>) => {\n\t\t\t\tif (abortController.signal.aborted) return;\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, ...update } : msg,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tconst currentConfig = configRef.current;\n\t\t\tconst requestBody = buildRequestBody(\n\t\t\t\tcurrentConfig,\n\t\t\t\tuserMessage,\n\t\t\t\tsessionId,\n\t\t\t\toptions,\n\t\t\t);\n\t\t\tconst url = buildStreamingUrl(currentConfig);\n\t\t\tconst headers = buildRequestHeaders(currentConfig);\n\n\t\t\ttry {\n\t\t\t\tawait streamWorkflowEvents(url, requestBody, headers, {\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t\tonEvent: (event: StreamEvent) => {\n\t\t\t\t\t\tif (abortController.signal.aborted) return;\n\n\t\t\t\t\t\t// KEEP_ALIVE used to early-return here as a no-op\n\t\t\t\t\t\t// liveness tick. Server now attaches a rotating\n\t\t\t\t\t\t// `description` phrase during silent-think gaps so\n\t\t\t\t\t\t// the chat bubble status line changes instead of\n\t\t\t\t\t\t// freezing on \"Thinking…\". processStreamEventV2 owns\n\t\t\t\t\t\t// that mirroring; we fall through to updateMessage\n\t\t\t\t\t\t// so the new phrase actually reaches the UI.\n\t\t\t\t\t\tprocessStreamEventV2(event, state);\n\n\t\t\t\t\t\tconst eventType = event.eventType;\n\n\t\t\t\t\t\t// Dispatch user action callbacks\n\t\t\t\t\t\tif (eventType === \"USER_ACTION_REQUIRED\" && state.userActionRequest) {\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionRequired?.(state.userActionRequest);\n\t\t\t\t\t\t} else if (typeof eventType === \"string\" && eventType.startsWith(\"USER_ACTION_\") && eventType !== \"USER_ACTION_REQUIRED\") {\n\t\t\t\t\t\t\tconst msg = getUserActionDisplayMessage(\n\t\t\t\t\t\t\t\teventType,\n\t\t\t\t\t\t\t\tevent.message?.trim() ||\n\t\t\t\t\t\t\t\t\tevent.errorMessage?.trim() ||\n\t\t\t\t\t\t\t\t\tgetEventMessage(event),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(eventType, msg);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst activeStep = state.steps.find((s) => s.id === state.currentExecutingStepId);\n\t\t\t\t\t\tconst lastInProgressStep = [...state.steps].reverse().find((s) => s.status === \"in_progress\");\n\t\t\t\t\t\t// Bland default-start labels like \"Executing…\" / \"Working\n\t\t\t\t\t\t// on it…\" come from each pipeline stage's\n\t\t\t\t\t\t// defaultStartMessage on the server. They flicker into the\n\t\t\t\t\t\t// chat bubble for the moment between an analyzer's dynamic\n\t\t\t\t\t\t// \"Pulling those up…\" status and the first tool call's\n\t\t\t\t\t\t// real \"Got 437 transactions\" — replacing useful info\n\t\t\t\t\t\t// with placeholder noise. Filter them out so the user\n\t\t\t\t\t\t// sees the most-recent SUBSTANTIVE message instead.\n\t\t\t\t\t\tconst useful = (m: string | undefined): string | undefined =>\n\t\t\t\t\t\t\tm && !isBlandStatus(m) ? m : undefined;\n\t\t\t\t\t\t// Walk backwards for the most recent USEFUL step message.\n\t\t\t\t\t\t// If executor just started with bland \"Executing…\" and\n\t\t\t\t\t\t// analyzer is done with \"Pulling those up for you now\",\n\t\t\t\t\t\t// we want analyzer's — bland on the latest step must\n\t\t\t\t\t\t// NOT shadow useful older ones. Previously latestWithMessage\n\t\t\t\t\t\t// returned the bland top-of-stack step and the candidate\n\t\t\t\t\t\t// chain fell through to the last-resort bland fallback even\n\t\t\t\t\t\t// though useful messages existed deeper in the stack.\n\t\t\t\t\t\tconst latestUsefulStep = [...state.steps].reverse().find(\n\t\t\t\t\t\t\t(s) => s.message && !isBlandStatus(s.message),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst currentMessage =\n\t\t\t\t\t\t\tuseful(activeStep?.message) ??\n\t\t\t\t\t\t\tuseful(lastInProgressStep?.message) ??\n\t\t\t\t\t\t\tlatestUsefulStep?.message ??\n\t\t\t\t\t\t\tuseful(getEventMessage(event)) ??\n\t\t\t\t\t\t\t// Last-resort: every candidate is bland (very first event,\n\t\t\t\t\t\t\t// nothing useful seen yet). Render the bland label so the\n\t\t\t\t\t\t\t// bubble isn't blank.\n\t\t\t\t\t\t\tactiveStep?.message ??\n\t\t\t\t\t\t\tlastInProgressStep?.message ??\n\t\t\t\t\t\t\tgetEventMessage(event);\n\t\t\t\t\t\t// Notify consumers of every status-message change so a\n\t\t\t\t\t\t// surface outside the chat bubble (pipeline sidebar,\n\t\t\t\t\t\t// agent-avatar label) can mirror it without re-parsing\n\t\t\t\t\t\t// the event stream. Debounced implicitly by React\n\t\t\t\t\t\t// reconciliation — the callback fires every event but\n\t\t\t\t\t\t// consumers typically setState against it and React\n\t\t\t\t\t\t// dedups.\n\t\t\t\t\t\tif (currentMessage) {\n\t\t\t\t\t\t\tcallbacksRef.current.onStatusMessage?.(currentMessage);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Give the host app the full steps snapshot so\n\t\t\t\t\t\t// pipeline-sidebar UIs can derive per-stage status\n\t\t\t\t\t\t// without reverse-mapping labels. Only fire when\n\t\t\t\t\t\t// steps actually changed (every STAGE_* event).\n\t\t\t\t\t\tcallbacksRef.current.onStepsUpdate?.([...state.steps]);\n\n\t\t\t\t\t\tif (state.hasError) {\n\t\t\t\t\t\t\tupdateMessage({\n\t\t\t\t\t\t\t\tstreamingContent: FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\tcontent: FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\tstreamProgress: \"error\",\n\t\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\t\terrorDetails: state.errorMessage,\n\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\tsteps: [...state.steps],\n\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t\tsessionId: state.sessionId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Mirror state.finalResponse into streamingContent\n\t\t\t\t\t\t\t// as it builds up from INTENT_PROGRESS deltas.\n\t\t\t\t\t\t\t// The k2 Formatter streams its LLM output chunk-\n\t\t\t\t\t\t\t// by-chunk; this is how the user sees the answer\n\t\t\t\t\t\t\t// build in real time instead of staring at a\n\t\t\t\t\t\t\t// blank screen for the ~2-3s the LLM takes.\n\t\t\t\t\t\t\t//\n\t\t\t\t\t\t\t// Pre-streaming servers never emit partial text,\n\t\t\t\t\t\t\t// so state.finalResponse stays \"\" until\n\t\t\t\t\t\t\t// WORKFLOW_COMPLETED — rendering \"\" here matches\n\t\t\t\t\t\t\t// the old behavior exactly for that case.\n\t\t\t\t\t\t\tupdateMessage({\n\t\t\t\t\t\t\t\tstreamingContent: state.finalResponse,\n\t\t\t\t\t\t\t\tcontent: \"\",\n\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\tstreamProgress: \"processing\",\n\t\t\t\t\t\t\t\tisError: false,\n\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\tsteps: [...state.steps],\n\t\t\t\t\t\t\t\tcurrentExecutingStepId: state.currentExecutingStepId,\n\t\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t\tsessionId: state.sessionId,\n\t\t\t\t\t\t\t\tuserActionResult: state.userActionResult,\n\t\t\t\t\t\t\t\tisCancelled: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error: Error) => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\t\t\t\t\t\t// Clear any status-message consumers are mirroring —\n\t\t\t\t\t\t// the run is over, whatever was last showing is\n\t\t\t\t\t\t// stale now.\n\t\t\t\t\t\tcallbacksRef.current.onStatusMessage?.(null);\n\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacksRef.current.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst isAborted = error.name === \"AbortError\";\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\t\t\t\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\t\t\t\t\t\t\t\t\t\tisError: !isAborted,\n\t\t\t\t\t\t\t\t\t\t\tisCancelled: isAborted,\n\t\t\t\t\t\t\t\t\t\t\terrorDetails: isAborted ? undefined : error.message,\n\t\t\t\t\t\t\t\t\t\t\tcontent: isAborted\n\t\t\t\t\t\t\t\t\t\t\t\t? state.finalResponse || \"\"\n\t\t\t\t\t\t\t\t\t\t\t\t: state.finalResponse || FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\t\t\t\tcurrentMessage: isAborted ? \"Thinking...\" : undefined,\n\t\t\t\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\t\t\t\tsteps: [...state.steps].map((step) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn step;\n\t\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tonComplete: () => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\t\t\t\t\t\t// Run is over — consumers tracking the status\n\t\t\t\t\t\t// message should clear their label / revert to\n\t\t\t\t\t\t// whatever default (agent name, blank).\n\t\t\t\t\t\tcallbacksRef.current.onStatusMessage?.(null);\n\t\t\t\t\t\t// Reset the steps snapshot so pipeline-sidebar\n\t\t\t\t\t\t// UIs can revert all stages back to idle.\n\t\t\t\t\t\tcallbacksRef.current.onStepsUpdate?.([]);\n\n\t\t\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\t\t\"Verification could not be completed.\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (state.sessionId && state.sessionId !== sessionId) {\n\t\t\t\t\t\t\tcallbacksRef.current.onSessionIdChange?.(state.sessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst needsImageResolve =\n\t\t\t\t\t\t\t!state.hasError &&\n\t\t\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t\t\thasRagImages(state.finalResponse);\n\n\t\t\t\t\t\tconst finalMessage: MessageDisplay = {\n\t\t\t\t\t\t\tid: streamingId,\n\t\t\t\t\t\t\tsessionId: state.sessionId || sessionId,\n\t\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\t\tcontent: state.hasError ? FRIENDLY_ERROR_MESSAGE : state.finalResponse || \"\",\n\t\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\tstreamProgress: state.hasError ? \"error\" : \"completed\",\n\t\t\t\t\t\t\tisError: state.hasError,\n\t\t\t\t\t\t\terrorDetails: state.hasError ? state.errorMessage : undefined,\n\t\t\t\t\t\t\texecutionId: state.executionId,\n\t\t\t\t\t\t\t// Defensive: tracingData must be an object (or undefined)\n\t\t\t\t\t\t\t// so the JSON viewer doesn't char-iterate a string. The\n\t\t\t\t\t\t\t// event processor already drops bare strings; this is\n\t\t\t\t\t\t\t// the last stop before the message leaves the SDK.\n\t\t\t\t\t\t\ttracingData:\n\t\t\t\t\t\t\t\tstate.finalData != null && typeof state.finalData === \"object\"\n\t\t\t\t\t\t\t\t\t? state.finalData\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tsteps: state.hasError ? [] : [...state.steps],\n\t\t\t\t\t\t\tisCancelled: false,\n\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\tuserActionResult: state.userActionResult,\n\t\t\t\t\t\t\tformattedThinkingText: state.hasError ? undefined : state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\tisResolvingImages: needsImageResolve,\n\t\t\t\t\t\t\ttotalElapsedMs: state.hasError ? undefined : state.totalElapsedMs,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? finalMessage : msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tcallbacksRef.current.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\tconst shouldResolveImages =\n\t\t\t\t\t!abortController.signal.aborted &&\n\t\t\t\t\t!state.hasError &&\n\t\t\t\t\thasRagImages(state.finalResponse);\n\n\t\t\t\tif (shouldResolveImages) {\n\t\t\t\t\tawait waitForNextPaint(abortController.signal);\n\t\t\t\t}\n\n\t\t\t\tif (shouldResolveImages && !abortController.signal.aborted) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst resolvedContent = await resolveRagImageUrls(\n\t\t\t\t\t\t\tcurrentConfig,\n\t\t\t\t\t\t\tstate.finalResponse,\n\t\t\t\t\t\t\tabortController.signal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t\t\t? { ...msg, content: resolvedContent, isResolvingImages: false }\n\t\t\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\t\t\tmsg.id === streamingId ? { ...msg, isResolvingImages: false } : msg,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn state.sessionId;\n\t\t\t} catch (error) {\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\tif (state.userActionPending) {\n\t\t\t\t\tstate.userActionPending = false;\n\t\t\t\t\tstate.userActionRequest = undefined;\n\t\t\t\t\tcallbacksRef.current.onUserActionEvent?.(\n\t\t\t\t\t\t\"USER_ACTION_FAILED\",\n\t\t\t\t\t\t\"Connection lost. Please try again.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst isAborted = (error as Error).name === \"AbortError\";\n\t\t\t\tsetMessages((prev) =>\n\t\t\t\t\tprev.map((msg) =>\n\t\t\t\t\t\tmsg.id === streamingId\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\t\tisStreaming: false,\n\t\t\t\t\t\t\t\t\tstreamProgress: isAborted ? (\"processing\" as const) : (\"error\" as const),\n\t\t\t\t\t\t\t\t\tisError: !isAborted,\n\t\t\t\t\t\t\t\t\tisCancelled: isAborted,\n\t\t\t\t\t\t\t\t\terrorDetails: isAborted ? undefined : (error as Error).message,\n\t\t\t\t\t\t\t\t\tcontent: isAborted\n\t\t\t\t\t\t\t\t\t\t? state.finalResponse || \"\"\n\t\t\t\t\t\t\t\t\t\t: state.finalResponse || FRIENDLY_ERROR_MESSAGE,\n\t\t\t\t\t\t\t\t\tformattedThinkingText: state.formattedThinkingText || undefined,\n\t\t\t\t\t\t\t\t\tsteps: [...state.steps].map((step) => {\n\t\t\t\t\t\t\t\t\t\tif (step.status === \"in_progress\" && isAborted) {\n\t\t\t\t\t\t\t\t\t\t\treturn { ...step, status: \"pending\" as const };\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn step;\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: msg,\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\treturn state.sessionId;\n\t\t\t}\n\t\t},\n\t\t[setMessages, setIsWaitingForResponse],\n\t);\n\n\tconst cancelStream = useCallback(() => {\n\t\tabortControllerRef.current?.abort();\n\t}, []);\n\n\treturn {\n\t\tstartStream,\n\t\tcancelStream,\n\t\tabortControllerRef,\n\t};\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ChatCallbacks, ChatConfig, MessageDisplay, UserActionState } from \"../types\";\nimport { generateId } from \"../utils\";\nimport { chatStore } from \"../utils/chatStore\";\nimport { activeStreamStore } from \"../utils/activeStreamStore\";\nimport { useStreamManagerV2 } from \"./useStreamManagerV2\";\nimport type { AnalysisMode } from \"../utils/requestBuilder\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\nimport {\n\tsubmitUserAction as submitUserActionApi,\n\tcancelUserAction as cancelUserActionApi,\n\tresendUserAction as resendUserActionApi,\n} from \"../utils/userActionClient\";\n\nexport type SendMessageOptions = {\n\t/**\n\t * Latency-vs-precision toggle surfaced in the chat widget.\n\t * `\"fast\"` (default) — the server caps list-tool fetches and\n\t * returns a quick, directionally correct answer with a sampling\n\t * caveat. `\"deep\"` — the server runs a full analytical pass,\n\t * no row caps, full rankings.\n\t *\n\t * Undefined / omitted means \"don't set — let the server use its\n\t * default\", which is `\"fast\"` today. Callers that want explicit\n\t * control should always pass this; callers that don't care can\n\t * skip it and inherit the server default.\n\t */\n\tanalysisMode?: AnalysisMode;\n};\n\nexport type UseChatV2Return = {\n\tmessages: MessageDisplay[];\n\tsendMessage: (userMessage: string, options?: SendMessageOptions) => Promise<void>;\n\tclearMessages: () => void;\n\tprependMessages: (messages: MessageDisplay[]) => void;\n\tcancelStream: () => void;\n\tresetSession: () => void;\n\tgetSessionId: () => string | undefined;\n\tgetMessages: () => MessageDisplay[];\n\tisWaitingForResponse: boolean;\n\tsessionId: string | undefined;\n\tuserActionState: UserActionState;\n\tapproveUserAction: (otp: string) => Promise<void>;\n\trejectUserAction: () => Promise<void>;\n\tresendOtp: () => Promise<void>;\n};\n\nexport function useChatV2(config: ChatConfig, callbacks: ChatCallbacks = {}): UseChatV2Return {\n\tconst [messages, setMessages] = useState<MessageDisplay[]>(() => {\n\t\tif (config.userId) return chatStore.get(config.userId);\n\t\treturn config.initialMessages ?? [];\n\t});\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst sessionIdRef = useRef<string | undefined>(\n\t\tconfig.userId\n\t\t\t? (chatStore.get(config.userId).find((m) => m.sessionId)?.sessionId ?? config.initialSessionId ?? undefined)\n\t\t\t: (config.initialSessionId ?? undefined),\n\t);\n\tconst prevUserIdRef = useRef<string | undefined>(config.userId);\n\n\tconst callbacksRef = useRef(callbacks);\n\tcallbacksRef.current = callbacks;\n\tconst configRef = useRef(config);\n\tconfigRef.current = config;\n\tconst messagesRef = useRef(messages);\n\tmessagesRef.current = messages;\n\n\tconst storeAwareSetMessages = useCallback<React.Dispatch<React.SetStateAction<MessageDisplay[]>>>(\n\t\t(updater) => {\n\t\t\tconst { userId } = configRef.current;\n\t\t\tif (userId && activeStreamStore.has(userId)) {\n\t\t\t\tactiveStreamStore.applyMessages(userId, updater as MessageDisplay[] | ((prev: MessageDisplay[]) => MessageDisplay[]));\n\t\t\t}\n\t\t\tsetMessages(updater);\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[],\n\t);\n\n\tconst storeAwareSetIsWaiting = useCallback(\n\t\t(waiting: boolean) => {\n\t\t\tconst { userId } = configRef.current;\n\t\t\tif (userId && activeStreamStore.has(userId)) {\n\t\t\t\tactiveStreamStore.setWaiting(userId, waiting);\n\t\t\t}\n\t\t\tsetIsWaitingForResponse(waiting);\n\t\t},\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[],\n\t);\n\n\tconst [userActionState, setUserActionState] = useState<UserActionState>({\n\t\trequest: null,\n\t\tresult: null,\n\t\tclearOtpTrigger: 0,\n\t});\n\n\tconst userActionStateRef = useRef(userActionState);\n\tuserActionStateRef.current = userActionState;\n\n\tconst wrappedCallbacks = useMemo<ChatCallbacks>(() => ({\n\t\t...callbacksRef.current,\n\t\tonMessageSent: (message) => callbacksRef.current.onMessageSent?.(message),\n\t\tonStreamStart: () => callbacksRef.current.onStreamStart?.(),\n\t\tonStreamComplete: (message) => callbacksRef.current.onStreamComplete?.(message),\n\t\tonError: (error) => callbacksRef.current.onError?.(error),\n\t\tonExecutionTraceClick: (data) => callbacksRef.current.onExecutionTraceClick?.(data),\n\t\tonSessionIdChange: (sessionId) => callbacksRef.current.onSessionIdChange?.(sessionId),\n\t\tonUserActionRequired: (request) => {\n\t\t\tsetUserActionState((prev) => ({ ...prev, request, result: null }));\n\t\t\tcallbacksRef.current.onUserActionRequired?.(request);\n\t\t},\n\t\tonUserActionEvent: (eventType, message) => {\n\t\t\tswitch (eventType) {\n\t\t\t\tcase \"USER_ACTION_SUCCESS\":\n\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: \"approved\" }));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"USER_ACTION_REJECTED\":\n\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: \"rejected\" }));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"USER_ACTION_EXPIRED\":\n\t\t\t\tcase \"USER_ACTION_FAILED\":\n\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, request: null }));\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"USER_ACTION_INVALID\":\n\t\t\t\t\tsetUserActionState((prev) => ({ ...prev, clearOtpTrigger: prev.clearOtpTrigger + 1 }));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcallbacksRef.current.onUserActionEvent?.(eventType, message);\n\t\t},\n\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}), []);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManagerV2(\n\t\tconfig,\n\t\twrappedCallbacks,\n\t\tstoreAwareSetMessages,\n\t\tstoreAwareSetIsWaiting,\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string, options?: SendMessageOptions) => {\n\t\t\tif (!userMessage.trim()) return;\n\n\t\t\tif (!sessionIdRef.current && configRef.current.autoGenerateSessionId !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tcallbacksRef.current.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\tconst userMessageId = `user-${Date.now()}`;\n\t\t\tconst userMsg: MessageDisplay = {\n\t\t\t\tid: userMessageId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: userMessage,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, userMsg]);\n\t\t\tcallbacksRef.current.onMessageSent?.(userMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacksRef.current.onStreamStart?.();\n\n\t\t\tconst streamingId = `assistant-${Date.now()}`;\n\t\t\tconst streamingMsg: MessageDisplay = {\n\t\t\t\tid: streamingId,\n\t\t\t\tsessionId: sessionIdRef.current,\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: \"\",\n\t\t\t\tstreamingContent: \"\",\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tisStreaming: true,\n\t\t\t\tstreamProgress: \"started\",\n\t\t\t\tsteps: [],\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\tisCancelled: false,\n\t\t\t\tcurrentMessage: undefined,\n\t\t\t};\n\n\t\t\tsetMessages((prev) => [...prev, streamingMsg]);\n\n\t\t\tconst abortController = new AbortController();\n\t\t\tconst { userId } = configRef.current;\n\t\t\tif (userId) {\n\t\t\t\tconst initialMessages = [...messagesRef.current, userMsg, streamingMsg];\n\t\t\t\tactiveStreamStore.start(userId, abortController, initialMessages);\n\t\t\t}\n\n\t\t\tconst newSessionId = await startStream(\n\t\t\t\tuserMessage,\n\t\t\t\tstreamingId,\n\t\t\t\tsessionIdRef.current,\n\t\t\t\tabortController,\n\t\t\t\toptions,\n\t\t\t);\n\n\t\t\tif (userId) {\n\t\t\t\tactiveStreamStore.complete(userId);\n\t\t\t}\n\n\t\t\tif (!abortController.signal.aborted && newSessionId && newSessionId !== sessionIdRef.current) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t}\n\t\t},\n\t\t[startStream],\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tif (configRef.current.userId) {\n\t\t\tchatStore.delete(configRef.current.userId);\n\t\t}\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst prependMessages = useCallback((msgs: MessageDisplay[]) => {\n\t\tsetMessages((prev) => [...msgs, ...prev]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tif (configRef.current.userId) {\n\t\t\tactiveStreamStore.abort(configRef.current.userId);\n\t\t}\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState((prev) => ({ ...prev, request: null, result: null }));\n\n\t\tsetMessages((prev) =>\n\t\t\tprev.map((msg) => {\n\t\t\t\tif (msg.isStreaming) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t...createCancelledMessageUpdate(\n\t\t\t\t\t\t\tmsg.steps || [],\n\t\t\t\t\t\t\tmsg.currentMessage,\n\t\t\t\t\t\t),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t}),\n\t\t);\n\t}, [cancelStreamManager]);\n\n\tconst resetSession = useCallback(() => {\n\t\tif (configRef.current.userId) {\n\t\t\tactiveStreamStore.abort(configRef.current.userId);\n\t\t\tchatStore.delete(configRef.current.userId);\n\t\t}\n\t\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\n\t\tsetUserActionState({ request: null, result: null, clearOtpTrigger: 0 });\n\t}, []);\n\n\tconst getSessionId = useCallback(() => {\n\t\treturn sessionIdRef.current;\n\t}, []);\n\n\tconst getMessages = useCallback(() => {\n\t\treturn messages;\n\t}, [messages]);\n\n\tconst approveUserAction = useCallback(\n\t\tasync (otp: string) => {\n\t\t\tconst request = userActionStateRef.current.request;\n\t\t\tif (!request) return;\n\t\t\ttry {\n\t\t\t\tawait submitUserActionApi(configRef.current, request.userActionId, { otp });\n\t\t\t} catch (error) {\n\t\t\t\tsetUserActionState((prev) => ({\n\t\t\t\t\t...prev,\n\t\t\t\t\tclearOtpTrigger: prev.clearOtpTrigger + 1,\n\t\t\t\t}));\n\t\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\tconst rejectUserAction = useCallback(async () => {\n\t\tconst request = userActionStateRef.current.request;\n\t\tif (!request) return;\n\t\ttry {\n\t\t\tsetMessages((prev) => {\n\t\t\t\tlet lastStreamingIdx = -1;\n\t\t\t\tfor (let i = prev.length - 1; i >= 0; i--) {\n\t\t\t\t\tif (prev[i].role === \"assistant\" && prev[i].isStreaming) {\n\t\t\t\t\t\tlastStreamingIdx = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (lastStreamingIdx === -1) return prev;\n\t\t\t\treturn prev.map((msg, i) =>\n\t\t\t\t\ti === lastStreamingIdx ? { ...msg, currentMessage: \"Rejecting...\" } : msg,\n\t\t\t\t);\n\t\t\t});\n\t\t\tawait cancelUserActionApi(configRef.current, request.userActionId);\n\t\t} catch (error) {\n\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t}, []);\n\n\tconst resendOtp = useCallback(async () => {\n\t\tconst request = userActionStateRef.current.request;\n\t\tif (!request) return;\n\t\ttry {\n\t\t\tawait resendUserActionApi(configRef.current, request.userActionId);\n\t\t} catch (error) {\n\t\t\tcallbacksRef.current.onError?.(error as Error);\n\t\t\tthrow error;\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst { userId } = config;\n\t\tif (!userId) return;\n\t\tconst unsubscribe = activeStreamStore.subscribe(userId, (msgs, isWaiting) => {\n\t\t\tsetMessages(msgs);\n\t\t\tsetIsWaitingForResponse(isWaiting);\n\t\t});\n\t\tconst active = activeStreamStore.get(userId);\n\t\tif (active) {\n\t\t\tsetMessages(active.messages);\n\t\t\tsetIsWaitingForResponse(active.isWaiting);\n\t\t}\n\t\treturn unsubscribe;\n\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!config.userId) return;\n\t\tconst toSave = messages.filter((m) => !m.isStreaming);\n\t\tif (toSave.length > 0) {\n\t\t\tchatStore.set(config.userId, toSave);\n\t\t}\n\t}, [messages, config.userId]);\n\n\tuseEffect(() => {\n\t\tconst prevUserId = prevUserIdRef.current;\n\t\tprevUserIdRef.current = config.userId;\n\n\t\tif (prevUserId === config.userId) return;\n\n\t\tif (prevUserId && !config.userId) {\n\t\t\tchatStore.delete(prevUserId);\n\t\t\tsetMessages([]);\n\t\t\tsessionIdRef.current = undefined;\n\t\t\tsetIsWaitingForResponse(false);\n\t\t\tsetUserActionState({ request: null, result: null, clearOtpTrigger: 0 });\n\t\t} else if (config.userId) {\n\t\t\tconst stored = chatStore.get(config.userId);\n\t\t\tsetMessages(stored);\n\t\t\tsessionIdRef.current = stored.find((m) => m.sessionId)?.sessionId;\n\t\t}\n\t}, [config.userId]);\n\n\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tprependMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tsessionId: sessionIdRef.current,\n\t\tuserActionState,\n\t\tapproveUserAction,\n\t\trejectUserAction,\n\t\tresendOtp,\n\t};\n}\n","// ============================================\n// Voice Hook - React Native Implementation\n// ============================================\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n\tExpoSpeechRecognitionModule,\n\tuseSpeechRecognitionEvent,\n} from \"expo-speech-recognition\";\n\n// ============================================\n// Types\n// ============================================\n\nexport type VoiceState = \"idle\" | \"listening\" | \"processing\" | \"error\";\n\nexport interface UseVoiceReturn {\n\tvoiceState: VoiceState;\n\ttranscribedText: string;\n\tisAvailable: boolean;\n\tisRecording: boolean;\n\t/** Last error message (e.g. \"audio not available\") – set from recognition error event */\n\tlastError: string | null;\n\tstartRecording: () => Promise<void>;\n\tstopRecording: () => void;\n\tclearTranscript: () => void;\n\treset: () => void;\n}\n\n// ============================================\n// Hook Implementation\n// ============================================\n\nexport function useVoice(): UseVoiceReturn {\n\tconst [voiceState, setVoiceState] = useState<VoiceState>(\"idle\");\n\tconst [transcribedText, setTranscribedText] = useState(\"\");\n\tconst [isAvailable, setIsAvailable] = useState(false);\n\tconst [isRecording, setIsRecording] = useState(false);\n\tconst [lastError, setLastError] = useState<string | null>(null);\n\tconst isRecordingRef = useRef(false);\n\n\tisRecordingRef.current = isRecording;\n\n\tuseEffect(() => {\n\t\tconst available =\n\t\t\ttypeof ExpoSpeechRecognitionModule.isRecognitionAvailable ===\n\t\t\t\t\"function\"\n\t\t\t\t? ExpoSpeechRecognitionModule.isRecognitionAvailable()\n\t\t\t\t: true;\n\t\tsetIsAvailable(!!available);\n\t}, []);\n\n\tuseSpeechRecognitionEvent(\"start\", () => {\n\t\tif (isRecordingRef.current) setVoiceState(\"listening\");\n\t});\n\tuseSpeechRecognitionEvent(\"end\", () => {});\n\tuseSpeechRecognitionEvent(\"result\", (event: any) => {\n\t\tif (!isRecordingRef.current) return;\n\t\tconst transcript = event?.results?.[0]?.transcript;\n\t\tif (transcript?.trim()) setTranscribedText(transcript);\n\t});\n\tuseSpeechRecognitionEvent(\"error\", (event: any) => {\n\t\tif (isRecordingRef.current) {\n\t\t\tsetLastError(\n\t\t\t\tevent?.message ?? event?.error ?? \"Speech recognition error\"\n\t\t\t);\n\t\t\tsetVoiceState(\"error\");\n\t\t}\n\t});\n\n\t// Start recording\n\tconst startRecording = useCallback(async () => {\n\t\tif (!isAvailable) {\n\t\t\tsetLastError(\"Speech recognition not available\");\n\t\t\treturn;\n\t\t}\n\n\t\tsetLastError(null);\n\n\t\ttry {\n\t\t\tconst result =\n\t\t\t\tawait ExpoSpeechRecognitionModule.requestPermissionsAsync();\n\t\t\tif (!result?.granted) {\n\t\t\t\tsetLastError(\"Microphone permission not granted\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\ttypeof ExpoSpeechRecognitionModule\n\t\t\t\t\t.requestSpeechRecognizerPermissionsAsync === \"function\"\n\t\t\t) {\n\t\t\t\tconst speechResult =\n\t\t\t\t\tawait ExpoSpeechRecognitionModule.requestSpeechRecognizerPermissionsAsync();\n\t\t\t\tif (!speechResult?.granted) {\n\t\t\t\t\tsetLastError(\"Speech recognition permission not granted\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetTranscribedText(\"\");\n\t\t\tsetVoiceState(\"listening\");\n\t\t\tsetIsRecording(true);\n\t\t\tisRecordingRef.current = true;\n\n\t\t\tawait ExpoSpeechRecognitionModule.start({\n\t\t\t\tlang: \"en-US\",\n\t\t\t\tinterimResults: true,\n\t\t\t\tcontinuous: true,\n\t\t\t\tmaxAlternatives: 1,\n\t\t\t\trequiresOnDeviceRecognition: false,\n\t\t\t\tiosCategory: {\n\t\t\t\t\tcategory: \"playAndRecord\",\n\t\t\t\t\tcategoryOptions: [\"defaultToSpeaker\", \"allowBluetooth\"],\n\t\t\t\t\tmode: \"measurement\",\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (error: any) {\n\t\t\tconst message =\n\t\t\t\terror?.message ?? String(error) ?? \"Failed to start recording\";\n\t\t\tsetLastError(message);\n\t\t\tsetVoiceState(\"error\");\n\t\t\tsetIsRecording(false);\n\t\t\tisRecordingRef.current = false;\n\t\t}\n\t}, [isAvailable]);\n\n\t// Stop recording\n\tconst stopRecording = useCallback(() => {\n\t\ttry {\n\t\t\tExpoSpeechRecognitionModule.stop();\n\t\t} catch (error) {\n\t\t\t// ignore\n\t\t} finally {\n\t\t\tsetVoiceState(\"idle\");\n\t\t\tsetIsRecording(false);\n\t\t\tisRecordingRef.current = false;\n\t\t}\n\t}, []);\n\n\t// Clear transcript\n\tconst clearTranscript = useCallback(() => {\n\t\tsetTranscribedText(\"\");\n\t\tsetLastError(null);\n\t}, []);\n\n\t// Reset\n\tconst reset = useCallback(() => {\n\t\tstopRecording();\n\t\tsetTranscribedText(\"\");\n\t\tsetLastError(null);\n\t\tsetVoiceState(\"idle\");\n\t}, [stopRecording]);\n\n\t// Cleanup on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (isRecordingRef.current) {\n\t\t\t\ttry {\n\t\t\t\t\tExpoSpeechRecognitionModule.stop();\n\t\t\t\t} catch (_e) {}\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn {\n\t\tvoiceState,\n\t\ttranscribedText,\n\t\tisAvailable,\n\t\tisRecording,\n\t\tlastError,\n\t\tstartRecording,\n\t\tstopRecording,\n\t\tclearTranscript,\n\t\treset,\n\t};\n}\n"]}
|