@paymanai/payman-typescript-ask-sdk 1.2.1 → 1.2.3

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.mjs CHANGED
@@ -156,6 +156,10 @@ function getEventMessage(event) {
156
156
  return "Verification code resent";
157
157
  case "USER_ACTION_FAILED":
158
158
  return "Verification failed";
159
+ case "INTENT_THINKING":
160
+ return event.workerName ? `${event.workerName} thinking...` : "Thinking...";
161
+ case "INTENT_THINKING_CONT":
162
+ return event.message || "";
159
163
  default:
160
164
  return eventType;
161
165
  }
@@ -193,6 +197,16 @@ function completeLastInProgressStep(steps) {
193
197
  function processStreamEvent(event, state) {
194
198
  const eventType = event.eventType;
195
199
  const message = getEventMessage(event);
200
+ if (eventType !== "INTENT_THINKING" && eventType !== "INTENT_THINKING_CONT") {
201
+ if (state.currentThinkingStepId) {
202
+ const thinkingStep = state.steps.find((s) => s.id === state.currentThinkingStepId);
203
+ if (thinkingStep) {
204
+ thinkingStep.isThinking = false;
205
+ }
206
+ state.currentThinkingStepId = void 0;
207
+ }
208
+ state.activeThinkingText = void 0;
209
+ }
196
210
  if ((eventType === "COMPLETED" || eventType === "WORKFLOW_COMPLETED") && event.response !== void 0) {
197
211
  const content = extractResponseContent(event.response);
198
212
  if (content) {
@@ -219,6 +233,7 @@ function processStreamEvent(event, state) {
219
233
  state.hasError = true;
220
234
  state.errorMessage = message || event.errorMessage || "An error occurred";
221
235
  } else if (eventType === "ORCHESTRATOR_COMPLETED") {
236
+ state.inOrchestratorPhase = false;
222
237
  const orchestratorStep = state.steps.find(
223
238
  (s) => s.eventType === "ORCHESTRATOR_THINKING" && s.status === "in_progress"
224
239
  );
@@ -245,6 +260,7 @@ function processStreamEvent(event, state) {
245
260
  }
246
261
  }
247
262
  } else if (eventType === "AGGREGATOR_COMPLETED") {
263
+ state.inAggregatorPhase = false;
248
264
  const aggregatorStep = state.steps.find(
249
265
  (s) => s.eventType === "AGGREGATOR_THINKING" && s.status === "in_progress"
250
266
  );
@@ -258,6 +274,12 @@ function processStreamEvent(event, state) {
258
274
  }
259
275
  }
260
276
  } else if (eventType === "ORCHESTRATOR_THINKING" || eventType === "INTENT_STARTED" || eventType === "INTENT_PROGRESS" || eventType === "AGGREGATOR_THINKING") {
277
+ if (eventType === "ORCHESTRATOR_THINKING") {
278
+ state.inOrchestratorPhase = true;
279
+ }
280
+ if (eventType === "AGGREGATOR_THINKING") {
281
+ state.inAggregatorPhase = true;
282
+ }
261
283
  if (eventType === "INTENT_PROGRESS") {
262
284
  const intentStep = state.steps.find(
263
285
  (s) => s.eventType === "INTENT_STARTED" && s.status === "in_progress"
@@ -393,6 +415,37 @@ function processStreamEvent(event, state) {
393
415
  timestamp: Date.now(),
394
416
  elapsedMs: event.elapsedMs
395
417
  });
418
+ } else if (eventType === "INTENT_THINKING") {
419
+ if (state.currentThinkingStepId) {
420
+ const prev = state.steps.find((s) => s.id === state.currentThinkingStepId);
421
+ if (prev) prev.isThinking = false;
422
+ }
423
+ const lastInProgress = [...state.steps].reverse().find((s) => s.status === "in_progress");
424
+ if (lastInProgress) {
425
+ lastInProgress.thinkingText = "";
426
+ lastInProgress.isThinking = true;
427
+ state.currentThinkingStepId = lastInProgress.id;
428
+ } else {
429
+ state.currentThinkingStepId = void 0;
430
+ }
431
+ if (state.allThinkingText) state.allThinkingText += "\n\n";
432
+ if (!state.inOrchestratorPhase && !state.inAggregatorPhase) {
433
+ state.activeThinkingText = "";
434
+ }
435
+ } else if (eventType === "INTENT_THINKING_CONT") {
436
+ const delta = event.message || "";
437
+ if (!delta) return state;
438
+ if (state.currentThinkingStepId) {
439
+ const step = state.steps.find((s) => s.id === state.currentThinkingStepId);
440
+ if (step) {
441
+ step.thinkingText = (step.thinkingText || "") + delta;
442
+ }
443
+ }
444
+ state.allThinkingText += delta;
445
+ if (!state.inOrchestratorPhase && !state.inAggregatorPhase) {
446
+ if (state.activeThinkingText == null) state.activeThinkingText = "";
447
+ state.activeThinkingText += delta;
448
+ }
396
449
  }
397
450
  return state;
398
451
  }
@@ -416,7 +469,9 @@ ${state.errorMessage}` : "",
416
469
  steps: state.hasError ? [] : [...state.steps],
417
470
  currentExecutingStepId: state.hasError ? void 0 : state.currentExecutingStepId,
418
471
  isCancelled: false,
419
- userActionResult: state.userActionResult
472
+ userActionResult: state.userActionResult,
473
+ activeThinkingText: state.hasError ? void 0 : state.activeThinkingText,
474
+ allThinkingText: state.hasError ? void 0 : state.allThinkingText
420
475
  };
421
476
  }
422
477
  function createErrorMessageUpdate(error, state) {
@@ -459,7 +514,9 @@ ${state.errorMessage}` : state.accumulatedContent || "",
459
514
  steps: state.hasError ? [] : [...state.steps],
460
515
  isCancelled: false,
461
516
  currentExecutingStepId: void 0,
462
- userActionResult: state.userActionResult
517
+ userActionResult: state.userActionResult,
518
+ activeThinkingText: void 0,
519
+ allThinkingText: state.hasError ? void 0 : state.allThinkingText
463
520
  };
464
521
  }
465
522
  function createCancelledMessageUpdate(steps, currentMessage) {
@@ -568,11 +625,63 @@ function useStreamManager(config, callbacks, setMessages, setIsWaitingForRespons
568
625
  steps: [],
569
626
  stepCounter: 0,
570
627
  currentExecutingStepId: void 0,
628
+ currentThinkingStepId: void 0,
571
629
  hasError: false,
572
630
  errorMessage: "",
573
631
  userActionRequest: void 0,
574
632
  userActionPending: false,
575
- userActionResult: void 0
633
+ userActionResult: void 0,
634
+ allThinkingText: "",
635
+ inOrchestratorPhase: false,
636
+ inAggregatorPhase: false
637
+ };
638
+ const THROTTLE_MS = 120;
639
+ const CHARS_PER_TICK = 10;
640
+ const displayedLengthRef = { current: 0 };
641
+ let throttleIntervalId = null;
642
+ const getActiveStepMessage = () => state.steps.find((s) => s.id === state.currentExecutingStepId)?.message || [...state.steps].reverse().find((s) => s.status === "in_progress")?.message;
643
+ const advanceDisplayLength = (full) => {
644
+ let newLen = Math.min(displayedLengthRef.current + CHARS_PER_TICK, full.length);
645
+ if (newLen > 0 && newLen < full.length) {
646
+ const code = full.charCodeAt(newLen - 1);
647
+ if (code >= 55296 && code <= 56319) {
648
+ newLen = Math.min(newLen + 1, full.length);
649
+ }
650
+ }
651
+ displayedLengthRef.current = newLen;
652
+ };
653
+ const clearThrottle = () => {
654
+ if (throttleIntervalId != null) {
655
+ clearInterval(throttleIntervalId);
656
+ throttleIntervalId = null;
657
+ }
658
+ };
659
+ abortController.signal.addEventListener("abort", clearThrottle, { once: true });
660
+ const ensureThrottle = () => {
661
+ if (throttleIntervalId != null) return;
662
+ throttleIntervalId = setInterval(() => {
663
+ if (abortController.signal.aborted) {
664
+ clearThrottle();
665
+ return;
666
+ }
667
+ const full = state.activeThinkingText ?? "";
668
+ if (displayedLengthRef.current < full.length) {
669
+ advanceDisplayLength(full);
670
+ const displayText = full.slice(0, displayedLengthRef.current);
671
+ setMessages(
672
+ (prev) => prev.map(
673
+ (msg) => msg.id === streamingId ? {
674
+ ...msg,
675
+ ...createStreamingMessageUpdate({
676
+ ...state,
677
+ activeThinkingText: displayText,
678
+ currentMessage: getActiveStepMessage() || "Thinking..."
679
+ })
680
+ } : msg
681
+ )
682
+ );
683
+ }
684
+ }, THROTTLE_MS);
576
685
  };
577
686
  const currentConfig = configRef.current;
578
687
  const requestBody = buildRequestBody(currentConfig, userMessage, sessionId);
@@ -587,22 +696,33 @@ function useStreamManager(config, callbacks, setMessages, setIsWaitingForRespons
587
696
  }
588
697
  if (event.executionId) state.executionId = event.executionId;
589
698
  if (event.sessionId) state.currentSessionId = event.sessionId;
699
+ const activeThinkingLengthBeforeProcess = state.activeThinkingText?.length ?? 0;
590
700
  processStreamEvent(event, state);
591
701
  const eventType = event.eventType;
702
+ if (eventType === "INTENT_THINKING") {
703
+ displayedLengthRef.current = 0;
704
+ ensureThrottle();
705
+ } else if (eventType !== "INTENT_THINKING_CONT") {
706
+ displayedLengthRef.current = activeThinkingLengthBeforeProcess;
707
+ clearThrottle();
708
+ }
592
709
  if (eventType === "USER_ACTION_REQUIRED" && state.userActionRequest) {
593
710
  callbacksRef.current.onUserActionRequired?.(state.userActionRequest);
594
711
  } else if (eventType.startsWith("USER_ACTION_") && eventType !== "USER_ACTION_REQUIRED") {
595
712
  const msg = event.message?.trim() || event.errorMessage?.trim() || getEventMessage(event);
596
713
  callbacksRef.current.onUserActionEvent?.(eventType, msg);
597
714
  }
715
+ const isIntentThinkingEvent = eventType === "INTENT_THINKING" || eventType === "INTENT_THINKING_CONT";
598
716
  const rawMessage = event.message?.trim() || event.errorMessage?.trim();
599
- const currentMessage = rawMessage || (event.eventType?.startsWith("USER_ACTION_") ? getEventMessage(event) : void 0);
717
+ const currentMessage = isIntentThinkingEvent ? getActiveStepMessage() || "Thinking..." : rawMessage || (event.eventType?.startsWith("USER_ACTION_") ? getEventMessage(event) : getActiveStepMessage() || getEventMessage(event));
718
+ const displayThinking = state.activeThinkingText != null ? state.activeThinkingText.slice(0, displayedLengthRef.current) : state.activeThinkingText;
600
719
  setMessages(
601
720
  (prev) => prev.map(
602
721
  (msg) => msg.id === streamingId ? {
603
722
  ...msg,
604
723
  ...createStreamingMessageUpdate({
605
724
  ...state,
725
+ activeThinkingText: displayThinking,
606
726
  currentMessage
607
727
  })
608
728
  } : msg
@@ -610,6 +730,7 @@ function useStreamManager(config, callbacks, setMessages, setIsWaitingForRespons
610
730
  );
611
731
  },
612
732
  onError: (error) => {
733
+ clearThrottle();
613
734
  setIsWaitingForResponse(false);
614
735
  if (error.name !== "AbortError") {
615
736
  callbacksRef.current.onError?.(error);
@@ -632,6 +753,7 @@ function useStreamManager(config, callbacks, setMessages, setIsWaitingForRespons
632
753
  );
633
754
  },
634
755
  onComplete: () => {
756
+ clearThrottle();
635
757
  setIsWaitingForResponse(false);
636
758
  if (state.userActionPending) {
637
759
  state.userActionPending = false;
@@ -656,8 +778,10 @@ function useStreamManager(config, callbacks, setMessages, setIsWaitingForRespons
656
778
  callbacksRef.current.onStreamComplete?.(finalMessage);
657
779
  }
658
780
  });
781
+ clearThrottle();
659
782
  return state.currentSessionId;
660
783
  } catch (error) {
784
+ clearThrottle();
661
785
  setIsWaitingForResponse(false);
662
786
  if (error.name !== "AbortError") {
663
787
  callbacksRef.current.onError?.(error);