@paymanai/payman-typescript-ask-sdk 1.0.0 → 1.0.2
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 +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -2
- package/dist/index.mjs.map +1 -1
- package/dist/index.native.js +6 -2
- package/dist/index.native.js.map +1 -1
- package/package.json +5 -4
package/dist/index.d.mts
CHANGED
|
@@ -61,6 +61,8 @@ type ChatConfig = {
|
|
|
61
61
|
workflowVersion?: number;
|
|
62
62
|
/** Stage/Environment */
|
|
63
63
|
stage?: WorkflowStage;
|
|
64
|
+
/** Query param name for stage (default: "stage"). Use e.g. "workflowStage" if the API expects that name. */
|
|
65
|
+
stageQueryParam?: string;
|
|
64
66
|
/** Session params */
|
|
65
67
|
sessionParams?: SessionParams;
|
|
66
68
|
/** Custom placeholder text */
|
package/dist/index.d.ts
CHANGED
|
@@ -61,6 +61,8 @@ type ChatConfig = {
|
|
|
61
61
|
workflowVersion?: number;
|
|
62
62
|
/** Stage/Environment */
|
|
63
63
|
stage?: WorkflowStage;
|
|
64
|
+
/** Query param name for stage (default: "stage"). Use e.g. "workflowStage" if the API expects that name. */
|
|
65
|
+
stageQueryParam?: string;
|
|
64
66
|
/** Session params */
|
|
65
67
|
sessionParams?: SessionParams;
|
|
66
68
|
/** Custom placeholder text */
|
package/dist/index.js
CHANGED
|
@@ -374,8 +374,12 @@ function buildRequestBody(config, userMessage, sessionId) {
|
|
|
374
374
|
function buildStreamingUrl(config) {
|
|
375
375
|
const endpoint = config.api.streamEndpoint || "/api/workflows/ask/stream";
|
|
376
376
|
const stage = config.stage || "DEV";
|
|
377
|
-
const
|
|
378
|
-
|
|
377
|
+
const stageParamName = config.stageQueryParam ?? "stage";
|
|
378
|
+
const queryParams = new URLSearchParams({ [stageParamName]: stage });
|
|
379
|
+
if (config.workflowVersion !== void 0) {
|
|
380
|
+
queryParams.append("workflowVersion", String(config.workflowVersion));
|
|
381
|
+
}
|
|
382
|
+
return `${config.api.baseUrl}${endpoint}?${queryParams.toString()}`;
|
|
379
383
|
}
|
|
380
384
|
function buildRequestHeaders(config) {
|
|
381
385
|
const headers = {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/generateId.ts","../src/utils/streamingClient.ts","../src/utils/eventProcessor.ts","../src/utils/messageStateManager.ts","../src/utils/requestBuilder.ts","../src/hooks/useStreamManager.ts","../src/hooks/useChat.ts"],"names":["events","useRef","useCallback","useState"],"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;;;ACkBA,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;AAKA,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,IAAI;AACH,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MACjC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACR,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG;AAAA,OACJ;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzB;AAAA,KACA,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACjB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACZ,MAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,IACnC;AAED,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,OAAO,IAAA,EAAM;AACZ,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAE1C,MAAA,IAAI,IAAA,EAAM;AAET,QAAA,IAAI,MAAA,CAAO,MAAK,EAAG;AAClB,UAAA,MAAM,EAAE,MAAA,EAAAA,OAAAA,EAAO,GAAI,gBAAgB,MAAM,CAAA;AACzC,UAAA,KAAA,MAAW,SAASA,OAAAA,EAAQ;AAC3B,YAAA,OAAA,GAAU,KAAK,CAAA;AAAA,UAChB;AAAA,QACD;AACA,QAAA;AAAA,MACD;AAGA,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAGhD,MAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,gBAAgB,MAAM,CAAA;AACpD,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC3B,QAAA,OAAA,GAAU,KAAK,CAAA;AAAA,MAChB;AAEA,MAAA,MAAA,GAAS,SAAA;AAAA,IACV;AAEC,IAAA,UAAA,IAAa;AAAA,EACd,SAAS,KAAA,EAAO;AACf,IAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AAE1D,MAAA;AAAA,IACD;AACA,IAAA,OAAA,GAAU,KAAc,CAAA;AAAA,EACzB;AACD;;;AC1JO,SAAS,gBAAgB,KAAA,EAA4B;AAC3D,EAAA,IAAI,KAAA,CAAM,OAAA,EAAS,IAAA,EAAK,EAAG;AAC1B,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACd;AAEA,EAAA,IAAI,KAAA,CAAM,YAAA,EAAc,IAAA,EAAK,EAAG;AAC/B,IAAA,OAAO,KAAA,CAAM,YAAA;AAAA,EACd;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;AACC,MAAA,OAAO,SAAA;AAAA;AAEV;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;AAKO,SAAS,kBAAA,CACf,OACA,KAAA,EAiBC;AACD,EAAA,MAAM,YAAY,KAAA,CAAM,SAAA;AACxB,EAAA,MAAM,OAAA,GAAU,gBAAgB,KAAK,CAAA;AAGrC,EAAA,IAAA,CACE,cAAc,WAAA,IAAe,SAAA,KAAc,oBAAA,KAC5C,KAAA,CAAM,aAAa,MAAA,EAClB;AACD,IAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,KAAA,CAAM,QAAQ,CAAA;AACrD,IAAA,IAAI,OAAA,EAAS;AACZ,MAAA,KAAA,CAAM,kBAAA,GAAqB,OAAA;AAC3B,MAAA,KAAA,CAAM,YAAY,KAAA,CAAM,QAAA;AAAA,IACzB;AAAA,EACD;AAGA,EAAA,IAAI,SAAA,KAAc,SAAA,IAAa,SAAA,KAAc,kBAAA,EAAoB,CAEjE,MAAA,IAAW,SAAA,KAAc,WAAA,IAAe,SAAA,KAAc,oBAAA,EAAsB;AAE3E,IAAA,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC7B,MAAA,IAAI,IAAA,CAAK,WAAW,aAAA,EAAe;AAClC,QAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AAAA,MACf;AAAA,IACD,CAAC,CAAA;AAAA,EACF,CAAA,MAAA,IAAW,cAAc,cAAA,EAAgB;AAExC,IAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,IAAA,KAAA,CAAM,YAAA,GAAe,OAAA,IAAW,KAAA,CAAM,YAAA,IAAgB,mBAAA;AAGtD,IAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,IAAA;AAAA,MAC9B,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,gBAAA,IAAoB,EAAE,MAAA,KAAW;AAAA,KACzD;AACA,IAAA,IAAI,UAAA,EAAY;AACf,MAAA,UAAA,CAAW,MAAA,GAAS,OAAA;AAAA,IACrB;AAAA,EACD,CAAA,MAAA,IAAW,SAAA,KAAc,OAAA,IAAW,SAAA,KAAc,gBAAA,EAAkB;AAEnE,IAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AACjB,IAAA,KAAA,CAAM,YAAA,GAAe,OAAA,IAAW,KAAA,CAAM,YAAA,IAAgB,mBAAA;AAAA,EACvD,CAAA,MAAA,IAAW,cAAc,wBAAA,EAA0B;AAElD,IAAA,MAAM,gBAAA,GAAmB,MAAM,KAAA,CAAM,IAAA;AAAA,MACpC,CAAC,CAAA,KACA,CAAA,CAAE,SAAA,KAAc,uBAAA,IAA2B,EAAE,MAAA,KAAW;AAAA,KAC1D;AACA,IAAA,IAAI,gBAAA,EAAkB;AACrB,MAAA,gBAAA,CAAiB,MAAA,GAAS,WAAA;AAC1B,MAAA,IAAI,MAAM,SAAA,EAAW;AACpB,QAAA,gBAAA,CAAiB,YAAY,KAAA,CAAM,SAAA;AAAA,MACpC;AACA,MAAA,IAAI,gBAAA,CAAiB,EAAA,KAAO,KAAA,CAAM,sBAAA,EAAwB;AACzD,QAAA,KAAA,CAAM,sBAAA,GAAyB,MAAA;AAAA,MAChC;AAAA,IACD;AAAA,EACD,CAAA,MAAA,IAAW,cAAc,kBAAA,EAAoB;AAE5C,IAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,IAAA;AAAA,MAC9B,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,gBAAA,IAAoB,EAAE,MAAA,KAAW;AAAA,KACzD;AACA,IAAA,IAAI,UAAA,EAAY;AACf,MAAA,UAAA,CAAW,MAAA,GAAS,WAAA;AACpB,MAAA,IAAI,MAAM,SAAA,EAAW;AACpB,QAAA,UAAA,CAAW,YAAY,KAAA,CAAM,SAAA;AAAA,MAC9B;AACA,MAAA,IAAI,UAAA,CAAW,EAAA,KAAO,KAAA,CAAM,sBAAA,EAAwB;AACnD,QAAA,KAAA,CAAM,sBAAA,GAAyB,MAAA;AAAA,MAChC;AAAA,IACD;AAAA,EACD,CAAA,MAAA,IAAW,cAAc,sBAAA,EAAwB;AAEhD,IAAA,MAAM,cAAA,GAAiB,MAAM,KAAA,CAAM,IAAA;AAAA,MAClC,CAAC,CAAA,KACA,CAAA,CAAE,SAAA,KAAc,qBAAA,IAAyB,EAAE,MAAA,KAAW;AAAA,KACxD;AACA,IAAA,IAAI,cAAA,EAAgB;AACnB,MAAA,cAAA,CAAe,MAAA,GAAS,WAAA;AACxB,MAAA,IAAI,MAAM,SAAA,EAAW;AACpB,QAAA,cAAA,CAAe,YAAY,KAAA,CAAM,SAAA;AAAA,MAClC;AACA,MAAA,IAAI,cAAA,CAAe,EAAA,KAAO,KAAA,CAAM,sBAAA,EAAwB;AACvD,QAAA,KAAA,CAAM,sBAAA,GAAyB,MAAA;AAAA,MAChC;AAAA,IACD;AAAA,EACD,CAAA,MAAA,IACC,cAAc,uBAAA,IACd,SAAA,KAAc,oBACd,SAAA,KAAc,iBAAA,IACd,cAAc,qBAAA,EACb;AAED,IAAA,IAAI,cAAc,iBAAA,EAAmB;AAEpC,MAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,IAAA;AAAA,QAC9B,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,gBAAA,IAAoB,EAAE,MAAA,KAAW;AAAA,OACzD;AACA,MAAA,IAAI,UAAA,EAAY;AACf,QAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,QAAA,KAAA,CAAM,yBAAyB,UAAA,CAAW,EAAA;AAAA,MAC3C,CAAA,MAAO;AAEN,QAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA;AAC1C,QAAA,KAAA,CAAM,MAAM,IAAA,CAAK;AAAA,UAChB,EAAA,EAAI,MAAA;AAAA,UACJ,SAAA,EAAW,gBAAA;AAAA,UACX,OAAA;AAAA,UACA,MAAA,EAAQ,aAAA;AAAA,UACR,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,WAAW,KAAA,CAAM;AAAA,SACjB,CAAA;AACD,QAAA,KAAA,CAAM,sBAAA,GAAyB,MAAA;AAAA,MAChC;AAAA,IACD,CAAA,MAAO;AAEN,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;AAAA,IAChC;AAAA,EACD;AAGA,EAAA,OAAO,KAAA;AACR;;;AC1OO,SAAS,6BAA6B,KAAA,EAUjB;AAC3B,EAAA,MAAM,mBAAA,GAAsB,KAAA,CAAM,kBAAA,IAAsB,KAAA,CAAM,SAAA,KAAc,MAAA;AAE5E,EAAA,OAAO;AAAA,IACN,gBAAA,EAAkB,MAAM,QAAA,GACrB,CAAA;;AAAA,EAAoD,KAAA,CAAM,YAAY,CAAA,CAAA,GACtE,mBAAA,GACC,MAAM,kBAAA,GACN,EAAA;AAAA,IACJ,OAAA,EAAS,MAAM,QAAA,GACZ,CAAA;;AAAA,EAAoD,KAAA,CAAM,YAAY,CAAA,CAAA,GACtE,EAAA;AAAA,IACH,cAAA,EAAgB,KAAA,CAAM,QAAA,GAAW,MAAA,GAAY,KAAA,CAAM,cAAA;AAAA,IACnD,cAAA,EAAgB,KAAA,CAAM,QAAA,GAAY,OAAA,GAAqB,YAAA;AAAA,IACvD,SAAS,KAAA,CAAM,QAAA;AAAA,IACf,YAAA,EAAc,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,YAAA,GAAe,MAAA;AAAA,IACpD,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,KAAA,EAAO,MAAM,QAAA,GAAW,KAAK,CAAC,GAAG,MAAM,KAAK,CAAA;AAAA;AAAA,IAC5C,sBAAA,EAAwB,KAAA,CAAM,QAAA,GAAW,MAAA,GAAY,KAAA,CAAM,sBAAA;AAAA,IAC3D,WAAA,EAAa;AAAA,GACd;AACD;AAKO,SAAS,wBAAA,CACf,OACA,KAAA,EAK0B;AAC1B,EAAA,MAAM,SAAA,GAAY,MAAM,IAAA,KAAS,YAAA;AAEjC,EAAA,OAAO;AAAA,IACN,WAAA,EAAa,KAAA;AAAA,IACb,cAAA,EAAgB,YAAa,YAAA,GAA0B,OAAA;AAAA,IACvD,SAAS,CAAC,SAAA;AAAA,IACV,WAAA,EAAa,SAAA;AAAA,IACb,YAAA,EAAc,SAAA,GAAY,MAAA,GAAY,KAAA,CAAM,OAAA;AAAA,IAC5C,SAAS,SAAA,GACN,KAAA,CAAM,kBAAA,IAAsB,EAAA,GAC5B,MAAM,kBAAA,IACP,CAAA;;AAAA,EAAoD,MAAM,OAAO,CAAA,CAAA;AAAA;AAAA,IAEnE,cAAA,EAAgB,SAAA,GAAY,KAAA,CAAM,cAAA,IAAkB,aAAA,GAAgB,MAAA;AAAA,IACpE,KAAA,EAAO,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AACrC,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,aAAA,IAAiB,SAAA,EAAW;AAC/C,QAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAmB;AAAA,MAC9C;AACA,MAAA,OAAO,IAAA;AAAA,IACR,CAAC,CAAA;AAAA,IACD,sBAAA,EAAwB;AAAA,GACzB;AACD;AAKO,SAAS,kBAAA,CACf,aACA,KAAA,EASiB;AACjB,EAAA,OAAO;AAAA,IACN,EAAA,EAAI,WAAA;AAAA,IACJ,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS,MAAM,QAAA,GACZ,CAAA;;AAAA,EAAoD,KAAA,CAAM,YAAY,CAAA,CAAA,GACtE,KAAA,CAAM,kBAAA,IAAsB,EAAA;AAAA,IAC/B,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,WAAA,EAAa,KAAA;AAAA,IACb,cAAA,EAAgB,KAAA,CAAM,QAAA,GAAW,OAAA,GAAU,WAAA;AAAA,IAC3C,SAAS,KAAA,CAAM,QAAA;AAAA,IACf,YAAA,EAAc,KAAA,CAAM,QAAA,GAAW,KAAA,CAAM,YAAA,GAAe,MAAA;AAAA,IACpD,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,aAAa,KAAA,CAAM,SAAA;AAAA,IACnB,KAAA,EAAO,MAAM,QAAA,GAAW,KAAK,CAAC,GAAG,MAAM,KAAK,CAAA;AAAA;AAAA,IAC5C,WAAA,EAAa,KAAA;AAAA,IACb,sBAAA,EAAwB;AAAA,GACzB;AACD;AAKO,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;;;AC9HO,SAAS,gBAAA,CACf,MAAA,EACA,WAAA,EACA,SAAA,EAC0B;AAC1B,EAAA,MAAM,eAAe,MAAA,CAAO,aAAA;AAC5B,EAAA,MAAM,iBAAA,GACL,YAAA,EAAc,UAAA,IAAc,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA,CAAE,MAAA,GAAS,CAAA,GACvE,YAAA,CAAa,UAAA,GACb,MAAA;AAEJ,EAAA,OAAO;AAAA,IACN,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,SAAA,EAAW,WAAA;AAAA,IACX,SAAA;AAAA,IACA,cAAA,EAAgB,cAAc,EAAA,IAAM,EAAA;AAAA,IACpC,iBAAA,EAAmB,cAAc,IAAA,IAAQ,EAAA;AAAA,IACzC,iBAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACR,cAAA,EAAgB,IAAA,CAAK,cAAA,EAAe,CAAE,iBAAgB,CAAE;AAAA;AACzD,GACD;AACD;AAKO,SAAS,kBAAkB,MAAA,EAA4B;AAC7D,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,cAAA,IAAkB,2BAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,KAAA;AAC9B,EAAA,MAAM,OAAA,GAAU,OAAO,eAAA,IAAmB,CAAA;AAC1C,EAAA,OAAO,CAAA,EAAG,OAAO,GAAA,CAAI,OAAO,GAAG,QAAQ,CAAA,OAAA,EAAU,KAAK,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAA;AAClF;AAKO,SAAS,oBAAoB,MAAA,EAA4C;AAC/E,EAAA,MAAM,OAAA,GAAkC;AAAA,IACvC,GAAG,OAAO,GAAA,CAAI;AAAA,GACf;AACA,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;ACvBO,SAAS,gBAAA,CACf,MAAA,EACA,SAAA,EACA,WAAA,EACA,uBAAA,EACC;AACD,EAAA,MAAM,kBAAA,GAAqBC,aAA+B,IAAI,CAAA;AAE9D,EAAA,MAAM,WAAA,GAAcC,iBAAA;AAAA,IACnB,OACC,WAAA,EACA,WAAA,EACA,SAAA,KACiC;AAEjC,MAAA,kBAAA,CAAmB,SAAS,KAAA,EAAM;AAClC,MAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,MAAA,kBAAA,CAAmB,OAAA,GAAU,eAAA;AAG7B,MAAA,MAAM,KAAA,GAA4B;AAAA,QACjC,kBAAA,EAAoB,EAAA;AAAA,QACpB,WAAA,EAAa,MAAA;AAAA,QACb,gBAAA,EAAkB,MAAA;AAAA,QAClB,SAAA,EAAW,MAAA;AAAA,QACX,OAAO,EAAC;AAAA,QACR,WAAA,EAAa,CAAA;AAAA,QACb,sBAAA,EAAwB,MAAA;AAAA,QACxB,QAAA,EAAU,KAAA;AAAA,QACV,YAAA,EAAc;AAAA,OACf;AAGA,MAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,MAAA,EAAQ,WAAA,EAAa,SAAS,CAAA;AACnE,MAAA,MAAM,GAAA,GAAM,kBAAkB,MAAM,CAAA;AACpC,MAAA,MAAM,OAAA,GAAU,oBAAoB,MAAM,CAAA;AAE1C,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;AAEhC,YAAA,IAAI,eAAA,CAAgB,OAAO,OAAA,EAAS;AACnC,cAAA;AAAA,YACD;AAGA,YAAA,IAAI,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,WAAA;AACjD,YAAA,IAAI,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,gBAAA,GAAmB,KAAA,CAAM,SAAA;AAGpD,YAAA,kBAAA,CAAmB,OAAO,KAAK,CAAA;AAG/B,YAAA,MAAM,iBACL,KAAA,CAAM,OAAA,EAAS,MAAK,IAAK,KAAA,CAAM,cAAc,IAAA,EAAK;AAGnD,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,GAAG,4BAAA,CAA6B;AAAA,oBAC/B,GAAG,KAAA;AAAA,oBACH;AAAA,mBACA;AAAA,iBACF,GACC;AAAA;AACJ,aACD;AAAA,UACD,CAAA;AAAA,UACA,OAAA,EAAS,CAAC,KAAA,KAAiB;AAC1B,YAAA,uBAAA,CAAwB,KAAK,CAAA;AAG7B,YAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAChC,cAAA,SAAA,CAAU,UAAU,KAAK,CAAA;AAAA,YAC1B;AAGA,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,GAAG,wBAAA,CAAyB,KAAA,EAAO,KAAK;AAAA,iBACzC,GACC;AAAA;AACJ,aACD;AAAA,UACD,CAAA;AAAA,UACA,YAAY,MAAM;AACjB,YAAA,uBAAA,CAAwB,KAAK,CAAA;AAG7B,YAAA,IACC,KAAA,CAAM,gBAAA,IACN,KAAA,CAAM,gBAAA,KAAqB,SAAA,EAC1B;AACD,cAAA,SAAA,CAAU,iBAAA,GAAoB,MAAM,gBAAgB,CAAA;AAAA,YACrD;AAGA,YAAA,MAAM,YAAA,GAAe,mBAAmB,WAAA,EAAa;AAAA,cACpD,GAAG,KAAA;AAAA,cACH,SAAA,EAAW,MAAM,gBAAA,IAAoB;AAAA,aACrC,CAAA;AAED,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,SAAA,CAAU,mBAAmB,YAAY,CAAA;AAAA,UAC1C;AAAA,SACA,CAAA;AAED,QAAA,OAAO,KAAA,CAAM,gBAAA;AAAA,MACd,SAAS,KAAA,EAAO;AACf,QAAA,uBAAA,CAAwB,KAAK,CAAA;AAG7B,QAAA,IAAK,KAAA,CAAgB,SAAS,YAAA,EAAc;AAC3C,UAAA,SAAA,CAAU,UAAU,KAAc,CAAA;AAAA,QACnC;AAGA,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,GAAG,wBAAA,CAAyB,KAAA,EAAgB,KAAK;AAAA,aAClD,GACC;AAAA;AACJ,SACD;AAEA,QAAA,OAAO,KAAA,CAAM,gBAAA;AAAA,MACd;AAAA,IACD,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,SAAA,EAAW,WAAA,EAAa,uBAAuB;AAAA,GACzD;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;;;AChLO,SAAS,OAAA,CAAQ,MAAA,EAAoB,SAAA,GAA2B,EAAC,EAAG;AAC1E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,cAAA,CAA2B,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtE,EAAA,MAAM,YAAA,GAAeF,aAA2B,MAAS,CAAA;AAEzD,EAAA,MAAM,EAAE,WAAA,EAAa,YAAA,EAAc,mBAAA,EAAqB,oBAAmB,GAAI,gBAAA;AAAA,IAC9E,MAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACD;AAEA,EAAA,MAAM,WAAA,GAAcC,iBAAAA;AAAA,IACnB,OAAO,WAAA,KAAwB;AAC9B,MAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAK,EAAG;AAGzB,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA,IAAW,MAAA,CAAO,0BAA0B,KAAA,EAAO;AACpE,QAAA,YAAA,CAAa,UAAU,UAAA,EAAW;AAClC,QAAA,SAAA,CAAU,iBAAA,GAAoB,aAAa,OAAO,CAAA;AAAA,MACnD;AAGA,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,SAAA,CAAU,gBAAgB,WAAW,CAAA;AACrC,MAAA,uBAAA,CAAwB,IAAI,CAAA;AAC5B,MAAA,SAAA,CAAU,aAAA,IAAgB;AAG1B,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;AAG7C,MAAA,MAAM,eAAe,MAAM,WAAA;AAAA,QAC1B,WAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA,CAAa;AAAA,OACd;AAGA,MAAA,IAAI,YAAA,IAAgB,YAAA,KAAiB,YAAA,CAAa,OAAA,EAAS;AAC1D,QAAA,YAAA,CAAa,OAAA,GAAU,YAAA;AAAA,MACxB;AAAA,IACD,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,SAAA,EAAW,WAAA,EAAa,aAAa,uBAAuB;AAAA,GACtE;AAEA,EAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAM;AACvC,IAAA,WAAA,CAAY,EAAE,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACtC,IAAA,mBAAA,EAAoB;AACpB,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAG7B,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;AAAA,cACF,GAAA,CAAI,SAAS,EAAC;AAAA,cACd,GAAA,CAAI;AAAA;AACL,WACD;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,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,MAAA;AACvB,IAAA,kBAAA,CAAmB,SAAS,KAAA,EAAM;AAClC,IAAA,uBAAA,CAAwB,KAAK,CAAA;AAAA,EAC9B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACtC,IAAA,OAAO,YAAA,CAAa,OAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,kBAAY,MAAM;AACrC,IAAA,OAAO,QAAA;AAAA,EACR,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,OAAO;AAAA,IACN,QAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAA;AAAA,IACA,WAAW,YAAA,CAAa;AAAA,GACzB;AACD","file":"index.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 handling SSE (Server-Sent Events) from the API\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[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\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\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t...headers,\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal,\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t\t}\n\n\t\tconst reader = response.body?.getReader();\n\t\tif (!reader) {\n\t\t\tthrow new Error(\"No response body\");\n\t\t}\n\n\tconst decoder = new TextDecoder();\n\tlet buffer = \"\";\n\n\twhile (true) {\n\t\tconst { done, value } = await reader.read();\n\n\t\tif (done) {\n\t\t\t// Process any remaining buffer\n\t\t\tif (buffer.trim()) {\n\t\t\t\tconst { events } = parseJSONBuffer(buffer);\n\t\t\t\tfor (const event of events) {\n\t\t\t\t\tonEvent?.(event);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Decode the chunk and add to buffer\n\t\tbuffer += decoder.decode(value, { stream: true });\n\n\t\t// Try to parse complete JSON objects from buffer\n\t\tconst { events, remaining } = parseJSONBuffer(buffer);\n\t\tfor (const event of events) {\n\t\t\tonEvent?.(event);\n\t\t}\n\t\t// Keep only the remaining unparsed portion\n\t\tbuffer = remaining;\n\t}\n\n\t\tonComplete?.();\n\t} catch (error) {\n\t\tif (error instanceof Error && error.name === \"AbortError\") {\n\t\t\t// Stream was cancelled\n\t\t\treturn;\n\t\t}\n\t\tonError?.(error as Error);\n\t}\n}\n","import type { StreamEvent } from \"./streamingClient\";\nimport type { StreamingStep } 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;\n\t}\n\n\tif (event.errorMessage?.trim()) {\n\t\treturn event.errorMessage;\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\tdefault:\n\t\t\treturn eventType;\n\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 * Process streaming event and update state\n */\nexport function processStreamEvent(\n\tevent: StreamEvent,\n\tstate: {\n\t\tsteps: StreamingStep[];\n\t\tstepCounter: number;\n\t\tcurrentExecutingStepId?: string;\n\t\taccumulatedContent: string;\n\t\tfinalData?: unknown;\n\t\thasError: boolean;\n\t\terrorMessage: string;\n\t}\n): {\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n} {\n\tconst eventType = event.eventType;\n\tconst message = getEventMessage(event);\n\n\t// Only extract response content from WORKFLOW_COMPLETED event\n\tif (\n\t\t(eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") &&\n\t\tevent.response !== undefined\n\t) {\n\t\tconst content = extractResponseContent(event.response);\n\t\tif (content) {\n\t\t\tstate.accumulatedContent = content;\n\t\t\tstate.finalData = event.response;\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// 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\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\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\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\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// All other events are ignored and not shown as steps\n\n\treturn state;\n}\n","import type { MessageDisplay, StreamingStep } from \"../types\";\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}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: \"\",\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: state.hasError ? [] : [...state.steps], // Don't show steps on error\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\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 ||\n\t\t\t\t`Oops, something went wrong. Please try again.\\n\\n${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}\n): MessageDisplay {\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: 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: state.hasError ? [] : [...state.steps], // Don't show steps on error\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\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 { ChatConfig } from \"../types\";\n\n/**\n * Build request body for streaming workflow\n */\nexport function buildRequestBody(\n\tconfig: ChatConfig,\n\tuserMessage: string,\n\tsessionId?: string\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\tworkflowName: config.workflowName,\n\t\tuserInput: userMessage,\n\t\tsessionId,\n\t\tsessionOwnerId: sessionOwner?.id || \"\",\n\t\tsessionOwnerLabel: sessionOwner?.name || \"\",\n\t\tsessionAttributes,\n\t\toptions: {\n\t\t\tclientTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\t},\n\t};\n}\n\n/**\n * Build streaming URL\n */\nexport function buildStreamingUrl(config: ChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst stage = config.stage || \"DEV\";\n\tconst version = config.workflowVersion || 1;\n\treturn `${config.api.baseUrl}${endpoint}?stage=${stage}&workflowVersion=${version}`;\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 { useCallback, useRef } from \"react\";\nimport type { ChatConfig, ChatCallbacks, MessageDisplay, StreamingStep } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport { processStreamEvent } from \"../utils/eventProcessor\";\nimport {\n\tcreateStreamingMessageUpdate,\n\tcreateErrorMessageUpdate,\n\tcreateFinalMessage,\n} from \"../utils/messageStateManager\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n} from \"../utils/requestBuilder\";\n\ntype StreamManagerState = {\n\taccumulatedContent: string;\n\texecutionId?: string;\n\tcurrentSessionId?: string;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n};\n\nexport function useStreamManager(\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 startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string\n\t\t): Promise<string | undefined> => {\n\t\t\t// Cancel any existing stream\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\t// Initialize streaming state\n\t\t\tconst state: StreamManagerState = {\n\t\t\t\taccumulatedContent: \"\",\n\t\t\t\texecutionId: undefined,\n\t\t\t\tcurrentSessionId: undefined,\n\t\t\t\tfinalData: undefined,\n\t\t\t\tsteps: [],\n\t\t\t\tstepCounter: 0,\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\thasError: false,\n\t\t\t\terrorMessage: \"\",\n\t\t\t};\n\n\t\t\t// Build request\n\t\t\tconst requestBody = buildRequestBody(config, userMessage, sessionId);\n\t\t\tconst url = buildStreamingUrl(config);\n\t\t\tconst headers = buildRequestHeaders(config);\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\t// Check if stream was cancelled\n\t\t\t\t\t\tif (abortController.signal.aborted) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store execution ID and session ID\n\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\tif (event.sessionId) state.currentSessionId = event.sessionId;\n\n\t\t\t\t\t\t// Process the event and update state\n\t\t\t\t\t\tprocessStreamEvent(event, state);\n\n\t\t\t\t\t\t// Get current message from event\n\t\t\t\t\t\tconst currentMessage =\n\t\t\t\t\t\t\tevent.message?.trim() || event.errorMessage?.trim();\n\n\t\t\t\t\t\t// Update streaming message\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\t...createStreamingMessageUpdate({\n\t\t\t\t\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\t\t\t\t}),\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\tonError: (error: Error) => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacks.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with error or cancellation\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\t...createErrorMessageUpdate(error, state),\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\t// Update session ID if we got a new one\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate.currentSessionId &&\n\t\t\t\t\t\t\tstate.currentSessionId !== sessionId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcallbacks.onSessionIdChange?.(state.currentSessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with final content or error\n\t\t\t\t\t\tconst finalMessage = createFinalMessage(streamingId, {\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\tsessionId: state.currentSessionId || sessionId,\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\tcallbacks.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn state.currentSessionId;\n\t\t\t} catch (error) {\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacks.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\t// Update message with error or cancellation\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\t...createErrorMessageUpdate(error as Error, state),\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.currentSessionId;\n\t\t\t}\n\t\t},\n\t\t[config, callbacks, 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, useRef, useState } from \"react\";\nimport type { ChatCallbacks, ChatConfig, MessageDisplay } from \"../types\";\nimport { generateId } from \"../utils\";\nimport { useStreamManager } from \"./useStreamManager\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\n\nexport function useChat(config: ChatConfig, callbacks: ChatCallbacks = {}) {\n\tconst [messages, setMessages] = useState<MessageDisplay[]>([]);\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst sessionIdRef = useRef<string | undefined>(undefined);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManager(\n\t\tconfig,\n\t\tcallbacks,\n\t\tsetMessages,\n\t\tsetIsWaitingForResponse\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string) => {\n\t\t\tif (!userMessage.trim()) return;\n\n\t\t\t// Generate session ID if needed\n\t\t\tif (!sessionIdRef.current && config.autoGenerateSessionId !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tcallbacks.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\t// Add user message\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\tcallbacks.onMessageSent?.(userMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacks.onStreamStart?.();\n\n\t\t\t// Create streaming message placeholder\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\t// Start streaming\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);\n\n\t\t\t// Update session ID if we got a new one\n\t\t\tif (newSessionId && newSessionId !== sessionIdRef.current) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t}\n\t\t},\n\t\t[config, callbacks, startStream, setMessages, setIsWaitingForResponse]\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\n\t\t// Mark all in-progress steps as pending and preserve currentMessage\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\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\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\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tsessionId: sessionIdRef.current,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/generateId.ts","../src/utils/streamingClient.ts","../src/utils/eventProcessor.ts","../src/utils/messageStateManager.ts","../src/utils/requestBuilder.ts","../src/hooks/useStreamManager.ts","../src/hooks/useChat.ts"],"names":["events","useRef","useCallback","useState"],"mappings":"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","file":"index.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 handling SSE (Server-Sent Events) from the API\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[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\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\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t...headers,\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal,\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t\t}\n\n\t\tconst reader = response.body?.getReader();\n\t\tif (!reader) {\n\t\t\tthrow new Error(\"No response body\");\n\t\t}\n\n\tconst decoder = new TextDecoder();\n\tlet buffer = \"\";\n\n\twhile (true) {\n\t\tconst { done, value } = await reader.read();\n\n\t\tif (done) {\n\t\t\t// Process any remaining buffer\n\t\t\tif (buffer.trim()) {\n\t\t\t\tconst { events } = parseJSONBuffer(buffer);\n\t\t\t\tfor (const event of events) {\n\t\t\t\t\tonEvent?.(event);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Decode the chunk and add to buffer\n\t\tbuffer += decoder.decode(value, { stream: true });\n\n\t\t// Try to parse complete JSON objects from buffer\n\t\tconst { events, remaining } = parseJSONBuffer(buffer);\n\t\tfor (const event of events) {\n\t\t\tonEvent?.(event);\n\t\t}\n\t\t// Keep only the remaining unparsed portion\n\t\tbuffer = remaining;\n\t}\n\n\t\tonComplete?.();\n\t} catch (error) {\n\t\tif (error instanceof Error && error.name === \"AbortError\") {\n\t\t\t// Stream was cancelled\n\t\t\treturn;\n\t\t}\n\t\tonError?.(error as Error);\n\t}\n}\n","import type { StreamEvent } from \"./streamingClient\";\nimport type { StreamingStep } 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;\n\t}\n\n\tif (event.errorMessage?.trim()) {\n\t\treturn event.errorMessage;\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\tdefault:\n\t\t\treturn eventType;\n\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 * Process streaming event and update state\n */\nexport function processStreamEvent(\n\tevent: StreamEvent,\n\tstate: {\n\t\tsteps: StreamingStep[];\n\t\tstepCounter: number;\n\t\tcurrentExecutingStepId?: string;\n\t\taccumulatedContent: string;\n\t\tfinalData?: unknown;\n\t\thasError: boolean;\n\t\terrorMessage: string;\n\t}\n): {\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n} {\n\tconst eventType = event.eventType;\n\tconst message = getEventMessage(event);\n\n\t// Only extract response content from WORKFLOW_COMPLETED event\n\tif (\n\t\t(eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") &&\n\t\tevent.response !== undefined\n\t) {\n\t\tconst content = extractResponseContent(event.response);\n\t\tif (content) {\n\t\t\tstate.accumulatedContent = content;\n\t\t\tstate.finalData = event.response;\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// 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\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\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\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\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// All other events are ignored and not shown as steps\n\n\treturn state;\n}\n","import type { MessageDisplay, StreamingStep } from \"../types\";\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}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: \"\",\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: state.hasError ? [] : [...state.steps], // Don't show steps on error\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\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 ||\n\t\t\t\t`Oops, something went wrong. Please try again.\\n\\n${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}\n): MessageDisplay {\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: 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: state.hasError ? [] : [...state.steps], // Don't show steps on error\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\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 { ChatConfig } from \"../types\";\n\n/**\n * Build request body for streaming workflow\n */\nexport function buildRequestBody(\n\tconfig: ChatConfig,\n\tuserMessage: string,\n\tsessionId?: string\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\tworkflowName: config.workflowName,\n\t\tuserInput: userMessage,\n\t\tsessionId,\n\t\tsessionOwnerId: sessionOwner?.id || \"\",\n\t\tsessionOwnerLabel: sessionOwner?.name || \"\",\n\t\tsessionAttributes,\n\t\toptions: {\n\t\t\tclientTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\t},\n\t};\n}\n\n/**\n * Build streaming URL\n */\nexport function buildStreamingUrl(config: ChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst stage = config.stage || \"DEV\";\n\tconst stageParamName = config.stageQueryParam ?? \"stage\";\n\tconst queryParams = new URLSearchParams({ [stageParamName]: stage });\n\n\tif (config.workflowVersion !== undefined) {\n\t\tqueryParams.append(\"workflowVersion\", String(config.workflowVersion));\n\t}\n\n\treturn `${config.api.baseUrl}${endpoint}?${queryParams.toString()}`;\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 { useCallback, useRef } from \"react\";\nimport type { ChatConfig, ChatCallbacks, MessageDisplay, StreamingStep } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport { processStreamEvent } from \"../utils/eventProcessor\";\nimport {\n\tcreateStreamingMessageUpdate,\n\tcreateErrorMessageUpdate,\n\tcreateFinalMessage,\n} from \"../utils/messageStateManager\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n} from \"../utils/requestBuilder\";\n\ntype StreamManagerState = {\n\taccumulatedContent: string;\n\texecutionId?: string;\n\tcurrentSessionId?: string;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n};\n\nexport function useStreamManager(\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 startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string\n\t\t): Promise<string | undefined> => {\n\t\t\t// Cancel any existing stream\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\t// Initialize streaming state\n\t\t\tconst state: StreamManagerState = {\n\t\t\t\taccumulatedContent: \"\",\n\t\t\t\texecutionId: undefined,\n\t\t\t\tcurrentSessionId: undefined,\n\t\t\t\tfinalData: undefined,\n\t\t\t\tsteps: [],\n\t\t\t\tstepCounter: 0,\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\thasError: false,\n\t\t\t\terrorMessage: \"\",\n\t\t\t};\n\n\t\t\t// Build request\n\t\t\tconst requestBody = buildRequestBody(config, userMessage, sessionId);\n\t\t\tconst url = buildStreamingUrl(config);\n\t\t\tconst headers = buildRequestHeaders(config);\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\t// Check if stream was cancelled\n\t\t\t\t\t\tif (abortController.signal.aborted) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store execution ID and session ID\n\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\tif (event.sessionId) state.currentSessionId = event.sessionId;\n\n\t\t\t\t\t\t// Process the event and update state\n\t\t\t\t\t\tprocessStreamEvent(event, state);\n\n\t\t\t\t\t\t// Get current message from event\n\t\t\t\t\t\tconst currentMessage =\n\t\t\t\t\t\t\tevent.message?.trim() || event.errorMessage?.trim();\n\n\t\t\t\t\t\t// Update streaming message\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\t...createStreamingMessageUpdate({\n\t\t\t\t\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\t\t\t\t}),\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\tonError: (error: Error) => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacks.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with error or cancellation\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\t...createErrorMessageUpdate(error, state),\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\t// Update session ID if we got a new one\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate.currentSessionId &&\n\t\t\t\t\t\t\tstate.currentSessionId !== sessionId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcallbacks.onSessionIdChange?.(state.currentSessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with final content or error\n\t\t\t\t\t\tconst finalMessage = createFinalMessage(streamingId, {\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\tsessionId: state.currentSessionId || sessionId,\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\tcallbacks.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn state.currentSessionId;\n\t\t\t} catch (error) {\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacks.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\t// Update message with error or cancellation\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\t...createErrorMessageUpdate(error as Error, state),\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.currentSessionId;\n\t\t\t}\n\t\t},\n\t\t[config, callbacks, 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, useRef, useState } from \"react\";\nimport type { ChatCallbacks, ChatConfig, MessageDisplay } from \"../types\";\nimport { generateId } from \"../utils\";\nimport { useStreamManager } from \"./useStreamManager\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\n\nexport function useChat(config: ChatConfig, callbacks: ChatCallbacks = {}) {\n\tconst [messages, setMessages] = useState<MessageDisplay[]>([]);\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst sessionIdRef = useRef<string | undefined>(undefined);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManager(\n\t\tconfig,\n\t\tcallbacks,\n\t\tsetMessages,\n\t\tsetIsWaitingForResponse\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string) => {\n\t\t\tif (!userMessage.trim()) return;\n\n\t\t\t// Generate session ID if needed\n\t\t\tif (!sessionIdRef.current && config.autoGenerateSessionId !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tcallbacks.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\t// Add user message\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\tcallbacks.onMessageSent?.(userMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacks.onStreamStart?.();\n\n\t\t\t// Create streaming message placeholder\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\t// Start streaming\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);\n\n\t\t\t// Update session ID if we got a new one\n\t\t\tif (newSessionId && newSessionId !== sessionIdRef.current) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t}\n\t\t},\n\t\t[config, callbacks, startStream, setMessages, setIsWaitingForResponse]\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\n\t\t// Mark all in-progress steps as pending and preserve currentMessage\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\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\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\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tsessionId: sessionIdRef.current,\n\t};\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -372,8 +372,12 @@ function buildRequestBody(config, userMessage, sessionId) {
|
|
|
372
372
|
function buildStreamingUrl(config) {
|
|
373
373
|
const endpoint = config.api.streamEndpoint || "/api/workflows/ask/stream";
|
|
374
374
|
const stage = config.stage || "DEV";
|
|
375
|
-
const
|
|
376
|
-
|
|
375
|
+
const stageParamName = config.stageQueryParam ?? "stage";
|
|
376
|
+
const queryParams = new URLSearchParams({ [stageParamName]: stage });
|
|
377
|
+
if (config.workflowVersion !== void 0) {
|
|
378
|
+
queryParams.append("workflowVersion", String(config.workflowVersion));
|
|
379
|
+
}
|
|
380
|
+
return `${config.api.baseUrl}${endpoint}?${queryParams.toString()}`;
|
|
377
381
|
}
|
|
378
382
|
function buildRequestHeaders(config) {
|
|
379
383
|
const headers = {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/generateId.ts","../src/utils/streamingClient.ts","../src/utils/eventProcessor.ts","../src/utils/messageStateManager.ts","../src/utils/requestBuilder.ts","../src/hooks/useStreamManager.ts","../src/hooks/useChat.ts"],"names":["events","useRef","useCallback"],"mappings":"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","file":"index.mjs","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 handling SSE (Server-Sent Events) from the API\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[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\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\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t...headers,\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal,\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t\t}\n\n\t\tconst reader = response.body?.getReader();\n\t\tif (!reader) {\n\t\t\tthrow new Error(\"No response body\");\n\t\t}\n\n\tconst decoder = new TextDecoder();\n\tlet buffer = \"\";\n\n\twhile (true) {\n\t\tconst { done, value } = await reader.read();\n\n\t\tif (done) {\n\t\t\t// Process any remaining buffer\n\t\t\tif (buffer.trim()) {\n\t\t\t\tconst { events } = parseJSONBuffer(buffer);\n\t\t\t\tfor (const event of events) {\n\t\t\t\t\tonEvent?.(event);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Decode the chunk and add to buffer\n\t\tbuffer += decoder.decode(value, { stream: true });\n\n\t\t// Try to parse complete JSON objects from buffer\n\t\tconst { events, remaining } = parseJSONBuffer(buffer);\n\t\tfor (const event of events) {\n\t\t\tonEvent?.(event);\n\t\t}\n\t\t// Keep only the remaining unparsed portion\n\t\tbuffer = remaining;\n\t}\n\n\t\tonComplete?.();\n\t} catch (error) {\n\t\tif (error instanceof Error && error.name === \"AbortError\") {\n\t\t\t// Stream was cancelled\n\t\t\treturn;\n\t\t}\n\t\tonError?.(error as Error);\n\t}\n}\n","import type { StreamEvent } from \"./streamingClient\";\nimport type { StreamingStep } 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;\n\t}\n\n\tif (event.errorMessage?.trim()) {\n\t\treturn event.errorMessage;\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\tdefault:\n\t\t\treturn eventType;\n\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 * Process streaming event and update state\n */\nexport function processStreamEvent(\n\tevent: StreamEvent,\n\tstate: {\n\t\tsteps: StreamingStep[];\n\t\tstepCounter: number;\n\t\tcurrentExecutingStepId?: string;\n\t\taccumulatedContent: string;\n\t\tfinalData?: unknown;\n\t\thasError: boolean;\n\t\terrorMessage: string;\n\t}\n): {\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n} {\n\tconst eventType = event.eventType;\n\tconst message = getEventMessage(event);\n\n\t// Only extract response content from WORKFLOW_COMPLETED event\n\tif (\n\t\t(eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") &&\n\t\tevent.response !== undefined\n\t) {\n\t\tconst content = extractResponseContent(event.response);\n\t\tif (content) {\n\t\t\tstate.accumulatedContent = content;\n\t\t\tstate.finalData = event.response;\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// 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\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\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\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\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// All other events are ignored and not shown as steps\n\n\treturn state;\n}\n","import type { MessageDisplay, StreamingStep } from \"../types\";\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}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: \"\",\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: state.hasError ? [] : [...state.steps], // Don't show steps on error\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\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 ||\n\t\t\t\t`Oops, something went wrong. Please try again.\\n\\n${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}\n): MessageDisplay {\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: 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: state.hasError ? [] : [...state.steps], // Don't show steps on error\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\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 { ChatConfig } from \"../types\";\n\n/**\n * Build request body for streaming workflow\n */\nexport function buildRequestBody(\n\tconfig: ChatConfig,\n\tuserMessage: string,\n\tsessionId?: string\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\tworkflowName: config.workflowName,\n\t\tuserInput: userMessage,\n\t\tsessionId,\n\t\tsessionOwnerId: sessionOwner?.id || \"\",\n\t\tsessionOwnerLabel: sessionOwner?.name || \"\",\n\t\tsessionAttributes,\n\t\toptions: {\n\t\t\tclientTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\t},\n\t};\n}\n\n/**\n * Build streaming URL\n */\nexport function buildStreamingUrl(config: ChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst stage = config.stage || \"DEV\";\n\tconst version = config.workflowVersion || 1;\n\treturn `${config.api.baseUrl}${endpoint}?stage=${stage}&workflowVersion=${version}`;\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 { useCallback, useRef } from \"react\";\nimport type { ChatConfig, ChatCallbacks, MessageDisplay, StreamingStep } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport { processStreamEvent } from \"../utils/eventProcessor\";\nimport {\n\tcreateStreamingMessageUpdate,\n\tcreateErrorMessageUpdate,\n\tcreateFinalMessage,\n} from \"../utils/messageStateManager\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n} from \"../utils/requestBuilder\";\n\ntype StreamManagerState = {\n\taccumulatedContent: string;\n\texecutionId?: string;\n\tcurrentSessionId?: string;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n};\n\nexport function useStreamManager(\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 startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string\n\t\t): Promise<string | undefined> => {\n\t\t\t// Cancel any existing stream\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\t// Initialize streaming state\n\t\t\tconst state: StreamManagerState = {\n\t\t\t\taccumulatedContent: \"\",\n\t\t\t\texecutionId: undefined,\n\t\t\t\tcurrentSessionId: undefined,\n\t\t\t\tfinalData: undefined,\n\t\t\t\tsteps: [],\n\t\t\t\tstepCounter: 0,\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\thasError: false,\n\t\t\t\terrorMessage: \"\",\n\t\t\t};\n\n\t\t\t// Build request\n\t\t\tconst requestBody = buildRequestBody(config, userMessage, sessionId);\n\t\t\tconst url = buildStreamingUrl(config);\n\t\t\tconst headers = buildRequestHeaders(config);\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\t// Check if stream was cancelled\n\t\t\t\t\t\tif (abortController.signal.aborted) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store execution ID and session ID\n\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\tif (event.sessionId) state.currentSessionId = event.sessionId;\n\n\t\t\t\t\t\t// Process the event and update state\n\t\t\t\t\t\tprocessStreamEvent(event, state);\n\n\t\t\t\t\t\t// Get current message from event\n\t\t\t\t\t\tconst currentMessage =\n\t\t\t\t\t\t\tevent.message?.trim() || event.errorMessage?.trim();\n\n\t\t\t\t\t\t// Update streaming message\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\t...createStreamingMessageUpdate({\n\t\t\t\t\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\t\t\t\t}),\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\tonError: (error: Error) => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacks.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with error or cancellation\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\t...createErrorMessageUpdate(error, state),\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\t// Update session ID if we got a new one\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate.currentSessionId &&\n\t\t\t\t\t\t\tstate.currentSessionId !== sessionId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcallbacks.onSessionIdChange?.(state.currentSessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with final content or error\n\t\t\t\t\t\tconst finalMessage = createFinalMessage(streamingId, {\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\tsessionId: state.currentSessionId || sessionId,\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\tcallbacks.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn state.currentSessionId;\n\t\t\t} catch (error) {\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacks.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\t// Update message with error or cancellation\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\t...createErrorMessageUpdate(error as Error, state),\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.currentSessionId;\n\t\t\t}\n\t\t},\n\t\t[config, callbacks, 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, useRef, useState } from \"react\";\nimport type { ChatCallbacks, ChatConfig, MessageDisplay } from \"../types\";\nimport { generateId } from \"../utils\";\nimport { useStreamManager } from \"./useStreamManager\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\n\nexport function useChat(config: ChatConfig, callbacks: ChatCallbacks = {}) {\n\tconst [messages, setMessages] = useState<MessageDisplay[]>([]);\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst sessionIdRef = useRef<string | undefined>(undefined);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManager(\n\t\tconfig,\n\t\tcallbacks,\n\t\tsetMessages,\n\t\tsetIsWaitingForResponse\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string) => {\n\t\t\tif (!userMessage.trim()) return;\n\n\t\t\t// Generate session ID if needed\n\t\t\tif (!sessionIdRef.current && config.autoGenerateSessionId !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tcallbacks.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\t// Add user message\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\tcallbacks.onMessageSent?.(userMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacks.onStreamStart?.();\n\n\t\t\t// Create streaming message placeholder\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\t// Start streaming\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);\n\n\t\t\t// Update session ID if we got a new one\n\t\t\tif (newSessionId && newSessionId !== sessionIdRef.current) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t}\n\t\t},\n\t\t[config, callbacks, startStream, setMessages, setIsWaitingForResponse]\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\n\t\t// Mark all in-progress steps as pending and preserve currentMessage\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\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\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\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tsessionId: sessionIdRef.current,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/generateId.ts","../src/utils/streamingClient.ts","../src/utils/eventProcessor.ts","../src/utils/messageStateManager.ts","../src/utils/requestBuilder.ts","../src/hooks/useStreamManager.ts","../src/hooks/useChat.ts"],"names":["events","useRef","useCallback"],"mappings":"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","file":"index.mjs","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 handling SSE (Server-Sent Events) from the API\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[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\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\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t...headers,\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal,\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(`HTTP ${response.status}: ${errorText}`);\n\t\t}\n\n\t\tconst reader = response.body?.getReader();\n\t\tif (!reader) {\n\t\t\tthrow new Error(\"No response body\");\n\t\t}\n\n\tconst decoder = new TextDecoder();\n\tlet buffer = \"\";\n\n\twhile (true) {\n\t\tconst { done, value } = await reader.read();\n\n\t\tif (done) {\n\t\t\t// Process any remaining buffer\n\t\t\tif (buffer.trim()) {\n\t\t\t\tconst { events } = parseJSONBuffer(buffer);\n\t\t\t\tfor (const event of events) {\n\t\t\t\t\tonEvent?.(event);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\n\t\t// Decode the chunk and add to buffer\n\t\tbuffer += decoder.decode(value, { stream: true });\n\n\t\t// Try to parse complete JSON objects from buffer\n\t\tconst { events, remaining } = parseJSONBuffer(buffer);\n\t\tfor (const event of events) {\n\t\t\tonEvent?.(event);\n\t\t}\n\t\t// Keep only the remaining unparsed portion\n\t\tbuffer = remaining;\n\t}\n\n\t\tonComplete?.();\n\t} catch (error) {\n\t\tif (error instanceof Error && error.name === \"AbortError\") {\n\t\t\t// Stream was cancelled\n\t\t\treturn;\n\t\t}\n\t\tonError?.(error as Error);\n\t}\n}\n","import type { StreamEvent } from \"./streamingClient\";\nimport type { StreamingStep } 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;\n\t}\n\n\tif (event.errorMessage?.trim()) {\n\t\treturn event.errorMessage;\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\tdefault:\n\t\t\treturn eventType;\n\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 * Process streaming event and update state\n */\nexport function processStreamEvent(\n\tevent: StreamEvent,\n\tstate: {\n\t\tsteps: StreamingStep[];\n\t\tstepCounter: number;\n\t\tcurrentExecutingStepId?: string;\n\t\taccumulatedContent: string;\n\t\tfinalData?: unknown;\n\t\thasError: boolean;\n\t\terrorMessage: string;\n\t}\n): {\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n} {\n\tconst eventType = event.eventType;\n\tconst message = getEventMessage(event);\n\n\t// Only extract response content from WORKFLOW_COMPLETED event\n\tif (\n\t\t(eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") &&\n\t\tevent.response !== undefined\n\t) {\n\t\tconst content = extractResponseContent(event.response);\n\t\tif (content) {\n\t\t\tstate.accumulatedContent = content;\n\t\t\tstate.finalData = event.response;\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// 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\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\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\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\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// All other events are ignored and not shown as steps\n\n\treturn state;\n}\n","import type { MessageDisplay, StreamingStep } from \"../types\";\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}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: \"\",\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: state.hasError ? [] : [...state.steps], // Don't show steps on error\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\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 ||\n\t\t\t\t`Oops, something went wrong. Please try again.\\n\\n${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}\n): MessageDisplay {\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: 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: state.hasError ? [] : [...state.steps], // Don't show steps on error\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\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 { ChatConfig } from \"../types\";\n\n/**\n * Build request body for streaming workflow\n */\nexport function buildRequestBody(\n\tconfig: ChatConfig,\n\tuserMessage: string,\n\tsessionId?: string\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\tworkflowName: config.workflowName,\n\t\tuserInput: userMessage,\n\t\tsessionId,\n\t\tsessionOwnerId: sessionOwner?.id || \"\",\n\t\tsessionOwnerLabel: sessionOwner?.name || \"\",\n\t\tsessionAttributes,\n\t\toptions: {\n\t\t\tclientTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\t},\n\t};\n}\n\n/**\n * Build streaming URL\n */\nexport function buildStreamingUrl(config: ChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst stage = config.stage || \"DEV\";\n\tconst stageParamName = config.stageQueryParam ?? \"stage\";\n\tconst queryParams = new URLSearchParams({ [stageParamName]: stage });\n\n\tif (config.workflowVersion !== undefined) {\n\t\tqueryParams.append(\"workflowVersion\", String(config.workflowVersion));\n\t}\n\n\treturn `${config.api.baseUrl}${endpoint}?${queryParams.toString()}`;\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 { useCallback, useRef } from \"react\";\nimport type { ChatConfig, ChatCallbacks, MessageDisplay, StreamingStep } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport { processStreamEvent } from \"../utils/eventProcessor\";\nimport {\n\tcreateStreamingMessageUpdate,\n\tcreateErrorMessageUpdate,\n\tcreateFinalMessage,\n} from \"../utils/messageStateManager\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n} from \"../utils/requestBuilder\";\n\ntype StreamManagerState = {\n\taccumulatedContent: string;\n\texecutionId?: string;\n\tcurrentSessionId?: string;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n};\n\nexport function useStreamManager(\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 startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string\n\t\t): Promise<string | undefined> => {\n\t\t\t// Cancel any existing stream\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\t// Initialize streaming state\n\t\t\tconst state: StreamManagerState = {\n\t\t\t\taccumulatedContent: \"\",\n\t\t\t\texecutionId: undefined,\n\t\t\t\tcurrentSessionId: undefined,\n\t\t\t\tfinalData: undefined,\n\t\t\t\tsteps: [],\n\t\t\t\tstepCounter: 0,\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\thasError: false,\n\t\t\t\terrorMessage: \"\",\n\t\t\t};\n\n\t\t\t// Build request\n\t\t\tconst requestBody = buildRequestBody(config, userMessage, sessionId);\n\t\t\tconst url = buildStreamingUrl(config);\n\t\t\tconst headers = buildRequestHeaders(config);\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\t// Check if stream was cancelled\n\t\t\t\t\t\tif (abortController.signal.aborted) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store execution ID and session ID\n\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\tif (event.sessionId) state.currentSessionId = event.sessionId;\n\n\t\t\t\t\t\t// Process the event and update state\n\t\t\t\t\t\tprocessStreamEvent(event, state);\n\n\t\t\t\t\t\t// Get current message from event\n\t\t\t\t\t\tconst currentMessage =\n\t\t\t\t\t\t\tevent.message?.trim() || event.errorMessage?.trim();\n\n\t\t\t\t\t\t// Update streaming message\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\t...createStreamingMessageUpdate({\n\t\t\t\t\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\t\t\t\t}),\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\tonError: (error: Error) => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacks.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with error or cancellation\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\t...createErrorMessageUpdate(error, state),\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\t// Update session ID if we got a new one\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate.currentSessionId &&\n\t\t\t\t\t\t\tstate.currentSessionId !== sessionId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcallbacks.onSessionIdChange?.(state.currentSessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with final content or error\n\t\t\t\t\t\tconst finalMessage = createFinalMessage(streamingId, {\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\tsessionId: state.currentSessionId || sessionId,\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\tcallbacks.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn state.currentSessionId;\n\t\t\t} catch (error) {\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacks.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\t// Update message with error or cancellation\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\t...createErrorMessageUpdate(error as Error, state),\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.currentSessionId;\n\t\t\t}\n\t\t},\n\t\t[config, callbacks, 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, useRef, useState } from \"react\";\nimport type { ChatCallbacks, ChatConfig, MessageDisplay } from \"../types\";\nimport { generateId } from \"../utils\";\nimport { useStreamManager } from \"./useStreamManager\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\n\nexport function useChat(config: ChatConfig, callbacks: ChatCallbacks = {}) {\n\tconst [messages, setMessages] = useState<MessageDisplay[]>([]);\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst sessionIdRef = useRef<string | undefined>(undefined);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManager(\n\t\tconfig,\n\t\tcallbacks,\n\t\tsetMessages,\n\t\tsetIsWaitingForResponse\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string) => {\n\t\t\tif (!userMessage.trim()) return;\n\n\t\t\t// Generate session ID if needed\n\t\t\tif (!sessionIdRef.current && config.autoGenerateSessionId !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tcallbacks.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\t// Add user message\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\tcallbacks.onMessageSent?.(userMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacks.onStreamStart?.();\n\n\t\t\t// Create streaming message placeholder\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\t// Start streaming\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);\n\n\t\t\t// Update session ID if we got a new one\n\t\t\tif (newSessionId && newSessionId !== sessionIdRef.current) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t}\n\t\t},\n\t\t[config, callbacks, startStream, setMessages, setIsWaitingForResponse]\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\n\t\t// Mark all in-progress steps as pending and preserve currentMessage\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\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\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\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tsessionId: sessionIdRef.current,\n\t};\n}\n"]}
|
package/dist/index.native.js
CHANGED
|
@@ -398,8 +398,12 @@ function buildRequestBody(config, userMessage, sessionId) {
|
|
|
398
398
|
function buildStreamingUrl(config) {
|
|
399
399
|
const endpoint = config.api.streamEndpoint || "/api/workflows/ask/stream";
|
|
400
400
|
const stage = config.stage || "DEV";
|
|
401
|
-
const
|
|
402
|
-
|
|
401
|
+
const stageParamName = config.stageQueryParam ?? "stage";
|
|
402
|
+
const queryParams = new URLSearchParams({ [stageParamName]: stage });
|
|
403
|
+
if (config.workflowVersion !== void 0) {
|
|
404
|
+
queryParams.append("workflowVersion", String(config.workflowVersion));
|
|
405
|
+
}
|
|
406
|
+
return `${config.api.baseUrl}${endpoint}?${queryParams.toString()}`;
|
|
403
407
|
}
|
|
404
408
|
function buildRequestHeaders(config) {
|
|
405
409
|
const headers = {
|
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/hooks/useStreamManager.ts","../src/hooks/useChat.ts"],"names":["useRef","useCallback","useState"],"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[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 } 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;\n\t}\n\n\tif (event.errorMessage?.trim()) {\n\t\treturn event.errorMessage;\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\tdefault:\n\t\t\treturn eventType;\n\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 * Process streaming event and update state\n */\nexport function processStreamEvent(\n\tevent: StreamEvent,\n\tstate: {\n\t\tsteps: StreamingStep[];\n\t\tstepCounter: number;\n\t\tcurrentExecutingStepId?: string;\n\t\taccumulatedContent: string;\n\t\tfinalData?: unknown;\n\t\thasError: boolean;\n\t\terrorMessage: string;\n\t}\n): {\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n} {\n\tconst eventType = event.eventType;\n\tconst message = getEventMessage(event);\n\n\t// Only extract response content from WORKFLOW_COMPLETED event\n\tif (\n\t\t(eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") &&\n\t\tevent.response !== undefined\n\t) {\n\t\tconst content = extractResponseContent(event.response);\n\t\tif (content) {\n\t\t\tstate.accumulatedContent = content;\n\t\t\tstate.finalData = event.response;\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// 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\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\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\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\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// All other events are ignored and not shown as steps\n\n\treturn state;\n}\n","import type { MessageDisplay, StreamingStep } from \"../types\";\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}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: \"\",\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: state.hasError ? [] : [...state.steps], // Don't show steps on error\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\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 ||\n\t\t\t\t`Oops, something went wrong. Please try again.\\n\\n${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}\n): MessageDisplay {\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: 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: state.hasError ? [] : [...state.steps], // Don't show steps on error\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\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 { ChatConfig } from \"../types\";\n\n/**\n * Build request body for streaming workflow\n */\nexport function buildRequestBody(\n\tconfig: ChatConfig,\n\tuserMessage: string,\n\tsessionId?: string\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\tworkflowName: config.workflowName,\n\t\tuserInput: userMessage,\n\t\tsessionId,\n\t\tsessionOwnerId: sessionOwner?.id || \"\",\n\t\tsessionOwnerLabel: sessionOwner?.name || \"\",\n\t\tsessionAttributes,\n\t\toptions: {\n\t\t\tclientTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\t},\n\t};\n}\n\n/**\n * Build streaming URL\n */\nexport function buildStreamingUrl(config: ChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst stage = config.stage || \"DEV\";\n\tconst version = config.workflowVersion || 1;\n\treturn `${config.api.baseUrl}${endpoint}?stage=${stage}&workflowVersion=${version}`;\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 { useCallback, useRef } from \"react\";\nimport type { ChatConfig, ChatCallbacks, MessageDisplay, StreamingStep } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport { processStreamEvent } from \"../utils/eventProcessor\";\nimport {\n\tcreateStreamingMessageUpdate,\n\tcreateErrorMessageUpdate,\n\tcreateFinalMessage,\n} from \"../utils/messageStateManager\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n} from \"../utils/requestBuilder\";\n\ntype StreamManagerState = {\n\taccumulatedContent: string;\n\texecutionId?: string;\n\tcurrentSessionId?: string;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n};\n\nexport function useStreamManager(\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 startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string\n\t\t): Promise<string | undefined> => {\n\t\t\t// Cancel any existing stream\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\t// Initialize streaming state\n\t\t\tconst state: StreamManagerState = {\n\t\t\t\taccumulatedContent: \"\",\n\t\t\t\texecutionId: undefined,\n\t\t\t\tcurrentSessionId: undefined,\n\t\t\t\tfinalData: undefined,\n\t\t\t\tsteps: [],\n\t\t\t\tstepCounter: 0,\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\thasError: false,\n\t\t\t\terrorMessage: \"\",\n\t\t\t};\n\n\t\t\t// Build request\n\t\t\tconst requestBody = buildRequestBody(config, userMessage, sessionId);\n\t\t\tconst url = buildStreamingUrl(config);\n\t\t\tconst headers = buildRequestHeaders(config);\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\t// Check if stream was cancelled\n\t\t\t\t\t\tif (abortController.signal.aborted) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store execution ID and session ID\n\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\tif (event.sessionId) state.currentSessionId = event.sessionId;\n\n\t\t\t\t\t\t// Process the event and update state\n\t\t\t\t\t\tprocessStreamEvent(event, state);\n\n\t\t\t\t\t\t// Get current message from event\n\t\t\t\t\t\tconst currentMessage =\n\t\t\t\t\t\t\tevent.message?.trim() || event.errorMessage?.trim();\n\n\t\t\t\t\t\t// Update streaming message\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\t...createStreamingMessageUpdate({\n\t\t\t\t\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\t\t\t\t}),\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\tonError: (error: Error) => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacks.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with error or cancellation\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\t...createErrorMessageUpdate(error, state),\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\t// Update session ID if we got a new one\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate.currentSessionId &&\n\t\t\t\t\t\t\tstate.currentSessionId !== sessionId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcallbacks.onSessionIdChange?.(state.currentSessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with final content or error\n\t\t\t\t\t\tconst finalMessage = createFinalMessage(streamingId, {\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\tsessionId: state.currentSessionId || sessionId,\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\tcallbacks.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn state.currentSessionId;\n\t\t\t} catch (error) {\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacks.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\t// Update message with error or cancellation\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\t...createErrorMessageUpdate(error as Error, state),\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.currentSessionId;\n\t\t\t}\n\t\t},\n\t\t[config, callbacks, 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, useRef, useState } from \"react\";\nimport type { ChatCallbacks, ChatConfig, MessageDisplay } from \"../types\";\nimport { generateId } from \"../utils\";\nimport { useStreamManager } from \"./useStreamManager\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\n\nexport function useChat(config: ChatConfig, callbacks: ChatCallbacks = {}) {\n\tconst [messages, setMessages] = useState<MessageDisplay[]>([]);\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst sessionIdRef = useRef<string | undefined>(undefined);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManager(\n\t\tconfig,\n\t\tcallbacks,\n\t\tsetMessages,\n\t\tsetIsWaitingForResponse\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string) => {\n\t\t\tif (!userMessage.trim()) return;\n\n\t\t\t// Generate session ID if needed\n\t\t\tif (!sessionIdRef.current && config.autoGenerateSessionId !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tcallbacks.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\t// Add user message\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\tcallbacks.onMessageSent?.(userMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacks.onStreamStart?.();\n\n\t\t\t// Create streaming message placeholder\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\t// Start streaming\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);\n\n\t\t\t// Update session ID if we got a new one\n\t\t\tif (newSessionId && newSessionId !== sessionIdRef.current) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t}\n\t\t},\n\t\t[config, callbacks, startStream, setMessages, setIsWaitingForResponse]\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\n\t\t// Mark all in-progress steps as pending and preserve currentMessage\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\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\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\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tsessionId: sessionIdRef.current,\n\t};\n}\n"]}
|
|
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/hooks/useStreamManager.ts","../src/hooks/useChat.ts"],"names":["useRef","useCallback","useState"],"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[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 } 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;\n\t}\n\n\tif (event.errorMessage?.trim()) {\n\t\treturn event.errorMessage;\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\tdefault:\n\t\t\treturn eventType;\n\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 * Process streaming event and update state\n */\nexport function processStreamEvent(\n\tevent: StreamEvent,\n\tstate: {\n\t\tsteps: StreamingStep[];\n\t\tstepCounter: number;\n\t\tcurrentExecutingStepId?: string;\n\t\taccumulatedContent: string;\n\t\tfinalData?: unknown;\n\t\thasError: boolean;\n\t\terrorMessage: string;\n\t}\n): {\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\taccumulatedContent: string;\n\tfinalData?: unknown;\n\thasError: boolean;\n\terrorMessage: string;\n} {\n\tconst eventType = event.eventType;\n\tconst message = getEventMessage(event);\n\n\t// Only extract response content from WORKFLOW_COMPLETED event\n\tif (\n\t\t(eventType === \"COMPLETED\" || eventType === \"WORKFLOW_COMPLETED\") &&\n\t\tevent.response !== undefined\n\t) {\n\t\tconst content = extractResponseContent(event.response);\n\t\tif (content) {\n\t\t\tstate.accumulatedContent = content;\n\t\t\tstate.finalData = event.response;\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// 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\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\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\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\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// All other events are ignored and not shown as steps\n\n\treturn state;\n}\n","import type { MessageDisplay, StreamingStep } from \"../types\";\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}): Partial<MessageDisplay> {\n\tconst hasCompletedContent = state.accumulatedContent && state.finalData !== undefined;\n\n\treturn {\n\t\tstreamingContent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: hasCompletedContent\n\t\t\t\t? state.accumulatedContent\n\t\t\t\t: \"\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: \"\",\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: state.hasError ? [] : [...state.steps], // Don't show steps on error\n\t\tcurrentExecutingStepId: state.hasError ? undefined : state.currentExecutingStepId,\n\t\tisCancelled: false,\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 ||\n\t\t\t\t`Oops, something went wrong. Please try again.\\n\\n${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}\n): MessageDisplay {\n\treturn {\n\t\tid: streamingId,\n\t\tsessionId: state.sessionId,\n\t\trole: \"assistant\",\n\t\tcontent: state.hasError\n\t\t\t? `Oops, something went wrong. Please try again.\\n\\n${state.errorMessage}`\n\t\t\t: 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: state.hasError ? [] : [...state.steps], // Don't show steps on error\n\t\tisCancelled: false,\n\t\tcurrentExecutingStepId: undefined,\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 { ChatConfig } from \"../types\";\n\n/**\n * Build request body for streaming workflow\n */\nexport function buildRequestBody(\n\tconfig: ChatConfig,\n\tuserMessage: string,\n\tsessionId?: string\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\tworkflowName: config.workflowName,\n\t\tuserInput: userMessage,\n\t\tsessionId,\n\t\tsessionOwnerId: sessionOwner?.id || \"\",\n\t\tsessionOwnerLabel: sessionOwner?.name || \"\",\n\t\tsessionAttributes,\n\t\toptions: {\n\t\t\tclientTimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t\t},\n\t};\n}\n\n/**\n * Build streaming URL\n */\nexport function buildStreamingUrl(config: ChatConfig): string {\n\tconst endpoint = config.api.streamEndpoint || \"/api/workflows/ask/stream\";\n\tconst stage = config.stage || \"DEV\";\n\tconst stageParamName = config.stageQueryParam ?? \"stage\";\n\tconst queryParams = new URLSearchParams({ [stageParamName]: stage });\n\n\tif (config.workflowVersion !== undefined) {\n\t\tqueryParams.append(\"workflowVersion\", String(config.workflowVersion));\n\t}\n\n\treturn `${config.api.baseUrl}${endpoint}?${queryParams.toString()}`;\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 { useCallback, useRef } from \"react\";\nimport type { ChatConfig, ChatCallbacks, MessageDisplay, StreamingStep } from \"../types\";\nimport { streamWorkflowEvents, type StreamEvent } from \"../utils/streamingClient\";\nimport { processStreamEvent } from \"../utils/eventProcessor\";\nimport {\n\tcreateStreamingMessageUpdate,\n\tcreateErrorMessageUpdate,\n\tcreateFinalMessage,\n} from \"../utils/messageStateManager\";\nimport {\n\tbuildRequestBody,\n\tbuildStreamingUrl,\n\tbuildRequestHeaders,\n} from \"../utils/requestBuilder\";\n\ntype StreamManagerState = {\n\taccumulatedContent: string;\n\texecutionId?: string;\n\tcurrentSessionId?: string;\n\tfinalData?: unknown;\n\tsteps: StreamingStep[];\n\tstepCounter: number;\n\tcurrentExecutingStepId?: string;\n\thasError: boolean;\n\terrorMessage: string;\n};\n\nexport function useStreamManager(\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 startStream = useCallback(\n\t\tasync (\n\t\t\tuserMessage: string,\n\t\t\tstreamingId: string,\n\t\t\tsessionId?: string\n\t\t): Promise<string | undefined> => {\n\t\t\t// Cancel any existing stream\n\t\t\tabortControllerRef.current?.abort();\n\t\t\tconst abortController = new AbortController();\n\t\t\tabortControllerRef.current = abortController;\n\n\t\t\t// Initialize streaming state\n\t\t\tconst state: StreamManagerState = {\n\t\t\t\taccumulatedContent: \"\",\n\t\t\t\texecutionId: undefined,\n\t\t\t\tcurrentSessionId: undefined,\n\t\t\t\tfinalData: undefined,\n\t\t\t\tsteps: [],\n\t\t\t\tstepCounter: 0,\n\t\t\t\tcurrentExecutingStepId: undefined,\n\t\t\t\thasError: false,\n\t\t\t\terrorMessage: \"\",\n\t\t\t};\n\n\t\t\t// Build request\n\t\t\tconst requestBody = buildRequestBody(config, userMessage, sessionId);\n\t\t\tconst url = buildStreamingUrl(config);\n\t\t\tconst headers = buildRequestHeaders(config);\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\t// Check if stream was cancelled\n\t\t\t\t\t\tif (abortController.signal.aborted) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store execution ID and session ID\n\t\t\t\t\t\tif (event.executionId) state.executionId = event.executionId;\n\t\t\t\t\t\tif (event.sessionId) state.currentSessionId = event.sessionId;\n\n\t\t\t\t\t\t// Process the event and update state\n\t\t\t\t\t\tprocessStreamEvent(event, state);\n\n\t\t\t\t\t\t// Get current message from event\n\t\t\t\t\t\tconst currentMessage =\n\t\t\t\t\t\t\tevent.message?.trim() || event.errorMessage?.trim();\n\n\t\t\t\t\t\t// Update streaming message\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\t...createStreamingMessageUpdate({\n\t\t\t\t\t\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\t\t\t\t\t\tcurrentMessage,\n\t\t\t\t\t\t\t\t\t\t\t}),\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\tonError: (error: Error) => {\n\t\t\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\t\t\tif (error.name !== \"AbortError\") {\n\t\t\t\t\t\t\tcallbacks.onError?.(error);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with error or cancellation\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\t...createErrorMessageUpdate(error, state),\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\t// Update session ID if we got a new one\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tstate.currentSessionId &&\n\t\t\t\t\t\t\tstate.currentSessionId !== sessionId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcallbacks.onSessionIdChange?.(state.currentSessionId);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update message with final content or error\n\t\t\t\t\t\tconst finalMessage = createFinalMessage(streamingId, {\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\tsessionId: state.currentSessionId || sessionId,\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\tcallbacks.onStreamComplete?.(finalMessage);\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn state.currentSessionId;\n\t\t\t} catch (error) {\n\t\t\t\tsetIsWaitingForResponse(false);\n\n\t\t\t\t// Don't call onError if it was cancelled\n\t\t\t\tif ((error as Error).name !== \"AbortError\") {\n\t\t\t\t\tcallbacks.onError?.(error as Error);\n\t\t\t\t}\n\n\t\t\t\t// Update message with error or cancellation\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\t...createErrorMessageUpdate(error as Error, state),\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.currentSessionId;\n\t\t\t}\n\t\t},\n\t\t[config, callbacks, 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, useRef, useState } from \"react\";\nimport type { ChatCallbacks, ChatConfig, MessageDisplay } from \"../types\";\nimport { generateId } from \"../utils\";\nimport { useStreamManager } from \"./useStreamManager\";\nimport { createCancelledMessageUpdate } from \"../utils/messageStateManager\";\n\nexport function useChat(config: ChatConfig, callbacks: ChatCallbacks = {}) {\n\tconst [messages, setMessages] = useState<MessageDisplay[]>([]);\n\tconst [isWaitingForResponse, setIsWaitingForResponse] = useState(false);\n\tconst sessionIdRef = useRef<string | undefined>(undefined);\n\n\tconst { startStream, cancelStream: cancelStreamManager, abortControllerRef } = useStreamManager(\n\t\tconfig,\n\t\tcallbacks,\n\t\tsetMessages,\n\t\tsetIsWaitingForResponse\n\t);\n\n\tconst sendMessage = useCallback(\n\t\tasync (userMessage: string) => {\n\t\t\tif (!userMessage.trim()) return;\n\n\t\t\t// Generate session ID if needed\n\t\t\tif (!sessionIdRef.current && config.autoGenerateSessionId !== false) {\n\t\t\t\tsessionIdRef.current = generateId();\n\t\t\t\tcallbacks.onSessionIdChange?.(sessionIdRef.current);\n\t\t\t}\n\n\t\t\t// Add user message\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\tcallbacks.onMessageSent?.(userMessage);\n\t\t\tsetIsWaitingForResponse(true);\n\t\t\tcallbacks.onStreamStart?.();\n\n\t\t\t// Create streaming message placeholder\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\t// Start streaming\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);\n\n\t\t\t// Update session ID if we got a new one\n\t\t\tif (newSessionId && newSessionId !== sessionIdRef.current) {\n\t\t\t\tsessionIdRef.current = newSessionId;\n\t\t\t}\n\t\t},\n\t\t[config, callbacks, startStream, setMessages, setIsWaitingForResponse]\n\t);\n\n\tconst clearMessages = useCallback(() => {\n\t\tsetMessages([]);\n\t}, []);\n\n\tconst cancelStream = useCallback(() => {\n\t\tcancelStreamManager();\n\t\tsetIsWaitingForResponse(false);\n\n\t\t// Mark all in-progress steps as pending and preserve currentMessage\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\tsetMessages([]);\n\t\tsessionIdRef.current = undefined;\n\t\tabortControllerRef.current?.abort();\n\t\tsetIsWaitingForResponse(false);\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\treturn {\n\t\tmessages,\n\t\tsendMessage,\n\t\tclearMessages,\n\t\tcancelStream,\n\t\tresetSession,\n\t\tgetSessionId,\n\t\tgetMessages,\n\t\tisWaitingForResponse,\n\t\tsessionId: sessionIdRef.current,\n\t};\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@paymanai/payman-typescript-ask-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Core TypeScript SDK for Payman workflows - logic only, no UI",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -19,10 +19,11 @@
|
|
|
19
19
|
"README.md"
|
|
20
20
|
],
|
|
21
21
|
"scripts": {
|
|
22
|
-
"build": "tsup",
|
|
23
|
-
"dev": "tsup --watch",
|
|
22
|
+
"build": "npx tsup",
|
|
23
|
+
"dev": "npx tsup --watch",
|
|
24
24
|
"clean": "rm -rf dist",
|
|
25
|
-
"type-check": "tsc --noEmit"
|
|
25
|
+
"type-check": "tsc --noEmit",
|
|
26
|
+
"prepublishOnly": "npm run build"
|
|
26
27
|
},
|
|
27
28
|
"keywords": [
|
|
28
29
|
"payman",
|