@paymanai/payman-typescript-ask-sdk 2.0.0 → 2.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 +78 -25
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +78 -25
- package/dist/index.mjs.map +1 -1
- package/dist/index.native.js +78 -25
- package/dist/index.native.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -123,6 +123,8 @@ type MessageDisplay = {
|
|
|
123
123
|
allThinkingText?: string;
|
|
124
124
|
formattedThinkingText?: string;
|
|
125
125
|
isResolvingImages?: boolean;
|
|
126
|
+
/** Elapsed thinking time in seconds, captured at stream completion and persisted. */
|
|
127
|
+
thinkingDurationSec?: number;
|
|
126
128
|
/** History row loaded via loadSession(). Renderers skip streaming/step UI. */
|
|
127
129
|
isHistorical?: boolean;
|
|
128
130
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -123,6 +123,8 @@ type MessageDisplay = {
|
|
|
123
123
|
allThinkingText?: string;
|
|
124
124
|
formattedThinkingText?: string;
|
|
125
125
|
isResolvingImages?: boolean;
|
|
126
|
+
/** Elapsed thinking time in seconds, captured at stream completion and persisted. */
|
|
127
|
+
thinkingDurationSec?: number;
|
|
126
128
|
/** History row loaded via loadSession(). Renderers skip streaming/step UI. */
|
|
127
129
|
isHistorical?: boolean;
|
|
128
130
|
};
|
package/dist/index.js
CHANGED
|
@@ -147,13 +147,13 @@ function getEventMessage(event) {
|
|
|
147
147
|
case "USER_ACTION_REQUIRED":
|
|
148
148
|
return "Waiting for verification...";
|
|
149
149
|
case "USER_ACTION_SUCCESS":
|
|
150
|
-
return "Verification
|
|
150
|
+
return "Verification approved";
|
|
151
151
|
case "USER_ACTION_EXPIRED":
|
|
152
152
|
return "Verification expired";
|
|
153
153
|
case "USER_ACTION_INVALID":
|
|
154
|
-
return "Invalid
|
|
154
|
+
return "Invalid code. Please try again.";
|
|
155
155
|
case "USER_ACTION_REJECTED":
|
|
156
|
-
return "Verification
|
|
156
|
+
return "Verification cancelled";
|
|
157
157
|
case "USER_ACTION_RESENT":
|
|
158
158
|
return "Verification code resent";
|
|
159
159
|
case "USER_ACTION_FAILED":
|
|
@@ -168,6 +168,31 @@ function getEventMessage(event) {
|
|
|
168
168
|
return eventType;
|
|
169
169
|
}
|
|
170
170
|
}
|
|
171
|
+
function isUserActionPrompt(text) {
|
|
172
|
+
return /\benter\b.+\b(code|otp)\b/i.test(text) || /\b(authorization|verification)\s+code\b/i.test(text) || /\bsent\s+to\s+your\b/i.test(text);
|
|
173
|
+
}
|
|
174
|
+
function getUserActionDisplayMessage(eventType, rawMessage) {
|
|
175
|
+
const raw = rawMessage?.trim();
|
|
176
|
+
const safeRaw = raw && !isUserActionPrompt(raw) ? raw : "";
|
|
177
|
+
switch (eventType) {
|
|
178
|
+
case "USER_ACTION_REQUIRED":
|
|
179
|
+
return raw || "Waiting for verification...";
|
|
180
|
+
case "USER_ACTION_SUCCESS":
|
|
181
|
+
return safeRaw || "Verification approved";
|
|
182
|
+
case "USER_ACTION_INVALID":
|
|
183
|
+
return safeRaw || "Invalid code. Please try again.";
|
|
184
|
+
case "USER_ACTION_REJECTED":
|
|
185
|
+
return safeRaw || "Verification cancelled";
|
|
186
|
+
case "USER_ACTION_EXPIRED":
|
|
187
|
+
return safeRaw || "Verification expired";
|
|
188
|
+
case "USER_ACTION_RESENT":
|
|
189
|
+
return safeRaw || "Verification code resent";
|
|
190
|
+
case "USER_ACTION_FAILED":
|
|
191
|
+
return safeRaw || "Verification failed";
|
|
192
|
+
default:
|
|
193
|
+
return safeRaw || raw || eventType;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
171
196
|
function workingPhaseDetailForDisplay(raw) {
|
|
172
197
|
const t = raw.trim();
|
|
173
198
|
if (!t) return "";
|
|
@@ -256,19 +281,27 @@ function buildFormattedThinking(steps, allThinkingText) {
|
|
|
256
281
|
break;
|
|
257
282
|
case "USER_ACTION_REQUIRED":
|
|
258
283
|
parts.push("**Verification Required**");
|
|
259
|
-
if (step.message)
|
|
284
|
+
if (step.message) {
|
|
285
|
+
parts.push(getUserActionDisplayMessage(step.eventType, step.message));
|
|
286
|
+
}
|
|
260
287
|
break;
|
|
261
288
|
case "USER_ACTION_SUCCESS":
|
|
262
|
-
parts.push(`\u2713 ${step.message
|
|
289
|
+
parts.push(`\u2713 ${getUserActionDisplayMessage(step.eventType, step.message)}`);
|
|
263
290
|
break;
|
|
264
291
|
case "USER_ACTION_REJECTED":
|
|
265
|
-
parts.push(
|
|
292
|
+
parts.push(getUserActionDisplayMessage(step.eventType, step.message));
|
|
266
293
|
break;
|
|
267
294
|
case "USER_ACTION_EXPIRED":
|
|
268
|
-
parts.push(`\u2717 ${step.message
|
|
295
|
+
parts.push(`\u2717 ${getUserActionDisplayMessage(step.eventType, step.message)}`);
|
|
296
|
+
break;
|
|
297
|
+
case "USER_ACTION_INVALID":
|
|
298
|
+
parts.push(`\u2717 ${getUserActionDisplayMessage(step.eventType, step.message)}`);
|
|
299
|
+
break;
|
|
300
|
+
case "USER_ACTION_RESENT":
|
|
301
|
+
parts.push(getUserActionDisplayMessage(step.eventType, step.message));
|
|
269
302
|
break;
|
|
270
303
|
case "USER_ACTION_FAILED":
|
|
271
|
-
parts.push(`\u2717 ${step.message
|
|
304
|
+
parts.push(`\u2717 ${getUserActionDisplayMessage(step.eventType, step.message)}`);
|
|
272
305
|
break;
|
|
273
306
|
}
|
|
274
307
|
}
|
|
@@ -711,14 +744,18 @@ function processStreamEventV2(event, state) {
|
|
|
711
744
|
}
|
|
712
745
|
state.userActionPending = true;
|
|
713
746
|
const req = event.userActionRequest;
|
|
747
|
+
const displayMessage = getUserActionDisplayMessage(
|
|
748
|
+
eventType,
|
|
749
|
+
req?.message || message
|
|
750
|
+
);
|
|
714
751
|
if (req) {
|
|
715
|
-
addThinkingLine(state, "**Verification Required**",
|
|
752
|
+
addThinkingLine(state, "**Verification Required**", displayMessage);
|
|
716
753
|
}
|
|
717
754
|
const stepId = `step-${state.stepCounter++}`;
|
|
718
755
|
state.steps.push({
|
|
719
756
|
id: stepId,
|
|
720
757
|
eventType,
|
|
721
|
-
message,
|
|
758
|
+
message: displayMessage,
|
|
722
759
|
status: "in_progress",
|
|
723
760
|
timestamp: Date.now(),
|
|
724
761
|
elapsedMs: event.elapsedMs
|
|
@@ -728,7 +765,8 @@ function processStreamEventV2(event, state) {
|
|
|
728
765
|
break;
|
|
729
766
|
}
|
|
730
767
|
case "USER_ACTION_SUCCESS": {
|
|
731
|
-
|
|
768
|
+
const displayMessage = getUserActionDisplayMessage(eventType, event.message);
|
|
769
|
+
appendThinkingText(state, "\n\u2713 " + displayMessage);
|
|
732
770
|
completeLastInProgressStep(state.steps);
|
|
733
771
|
state.userActionRequest = void 0;
|
|
734
772
|
state.userActionPending = false;
|
|
@@ -737,7 +775,7 @@ function processStreamEventV2(event, state) {
|
|
|
737
775
|
state.steps.push({
|
|
738
776
|
id: stepId,
|
|
739
777
|
eventType,
|
|
740
|
-
message,
|
|
778
|
+
message: displayMessage,
|
|
741
779
|
status: "completed",
|
|
742
780
|
timestamp: Date.now(),
|
|
743
781
|
elapsedMs: event.elapsedMs
|
|
@@ -746,12 +784,14 @@ function processStreamEventV2(event, state) {
|
|
|
746
784
|
break;
|
|
747
785
|
}
|
|
748
786
|
case "USER_ACTION_INVALID": {
|
|
787
|
+
const displayMessage = getUserActionDisplayMessage(eventType, event.message);
|
|
788
|
+
appendThinkingText(state, "\n\u2717 " + displayMessage);
|
|
749
789
|
completeLastInProgressStep(state.steps);
|
|
750
790
|
const errorStepId = `step-${state.stepCounter++}`;
|
|
751
791
|
state.steps.push({
|
|
752
792
|
id: errorStepId,
|
|
753
793
|
eventType,
|
|
754
|
-
message,
|
|
794
|
+
message: displayMessage,
|
|
755
795
|
status: "error",
|
|
756
796
|
timestamp: Date.now(),
|
|
757
797
|
elapsedMs: event.elapsedMs
|
|
@@ -769,7 +809,8 @@ function processStreamEventV2(event, state) {
|
|
|
769
809
|
break;
|
|
770
810
|
}
|
|
771
811
|
case "USER_ACTION_REJECTED": {
|
|
772
|
-
|
|
812
|
+
const displayMessage = getUserActionDisplayMessage(eventType, event.message);
|
|
813
|
+
appendThinkingText(state, "\n" + displayMessage);
|
|
773
814
|
completeLastInProgressStep(state.steps);
|
|
774
815
|
state.userActionRequest = void 0;
|
|
775
816
|
state.userActionPending = false;
|
|
@@ -778,7 +819,7 @@ function processStreamEventV2(event, state) {
|
|
|
778
819
|
state.steps.push({
|
|
779
820
|
id: stepId,
|
|
780
821
|
eventType,
|
|
781
|
-
message,
|
|
822
|
+
message: displayMessage,
|
|
782
823
|
status: "completed",
|
|
783
824
|
timestamp: Date.now(),
|
|
784
825
|
elapsedMs: event.elapsedMs
|
|
@@ -787,7 +828,8 @@ function processStreamEventV2(event, state) {
|
|
|
787
828
|
break;
|
|
788
829
|
}
|
|
789
830
|
case "USER_ACTION_EXPIRED": {
|
|
790
|
-
|
|
831
|
+
const displayMessage = getUserActionDisplayMessage(eventType, event.message);
|
|
832
|
+
appendThinkingText(state, "\n\u2717 " + displayMessage);
|
|
791
833
|
completeLastInProgressStep(state.steps);
|
|
792
834
|
state.userActionRequest = void 0;
|
|
793
835
|
state.userActionPending = false;
|
|
@@ -795,7 +837,7 @@ function processStreamEventV2(event, state) {
|
|
|
795
837
|
state.steps.push({
|
|
796
838
|
id: stepId,
|
|
797
839
|
eventType,
|
|
798
|
-
message,
|
|
840
|
+
message: displayMessage,
|
|
799
841
|
status: "error",
|
|
800
842
|
timestamp: Date.now(),
|
|
801
843
|
elapsedMs: event.elapsedMs
|
|
@@ -804,11 +846,13 @@ function processStreamEventV2(event, state) {
|
|
|
804
846
|
break;
|
|
805
847
|
}
|
|
806
848
|
case "USER_ACTION_RESENT": {
|
|
849
|
+
const displayMessage = getUserActionDisplayMessage(eventType, event.message);
|
|
850
|
+
appendThinkingText(state, "\n" + displayMessage);
|
|
807
851
|
const stepId = `step-${state.stepCounter++}`;
|
|
808
852
|
state.steps.push({
|
|
809
853
|
id: stepId,
|
|
810
854
|
eventType,
|
|
811
|
-
message,
|
|
855
|
+
message: displayMessage,
|
|
812
856
|
status: "completed",
|
|
813
857
|
timestamp: Date.now(),
|
|
814
858
|
elapsedMs: event.elapsedMs
|
|
@@ -817,7 +861,11 @@ function processStreamEventV2(event, state) {
|
|
|
817
861
|
break;
|
|
818
862
|
}
|
|
819
863
|
case "USER_ACTION_FAILED": {
|
|
820
|
-
|
|
864
|
+
const displayMessage = getUserActionDisplayMessage(
|
|
865
|
+
eventType,
|
|
866
|
+
event.message || event.errorMessage
|
|
867
|
+
);
|
|
868
|
+
appendThinkingText(state, "\n\u2717 " + displayMessage);
|
|
821
869
|
completeLastInProgressStep(state.steps);
|
|
822
870
|
state.userActionRequest = void 0;
|
|
823
871
|
state.userActionPending = false;
|
|
@@ -825,7 +873,7 @@ function processStreamEventV2(event, state) {
|
|
|
825
873
|
state.steps.push({
|
|
826
874
|
id: stepId,
|
|
827
875
|
eventType,
|
|
828
|
-
message,
|
|
876
|
+
message: displayMessage,
|
|
829
877
|
status: "error",
|
|
830
878
|
timestamp: Date.now(),
|
|
831
879
|
elapsedMs: event.elapsedMs
|
|
@@ -920,6 +968,7 @@ function useStreamManagerV2(config, callbacks, setMessages, setIsWaitingForRespo
|
|
|
920
968
|
const abortController = externalAbortController ?? new AbortController();
|
|
921
969
|
abortControllerRef.current = abortController;
|
|
922
970
|
const state = createInitialV2State();
|
|
971
|
+
const streamStartedAt = Date.now();
|
|
923
972
|
const updateMessage = (update) => {
|
|
924
973
|
if (abortController.signal.aborted) return;
|
|
925
974
|
setMessages(
|
|
@@ -947,7 +996,10 @@ function useStreamManagerV2(config, callbacks, setMessages, setIsWaitingForRespo
|
|
|
947
996
|
if (eventType === "USER_ACTION_REQUIRED" && state.userActionRequest) {
|
|
948
997
|
callbacksRef.current.onUserActionRequired?.(state.userActionRequest);
|
|
949
998
|
} else if (eventType.startsWith("USER_ACTION_") && eventType !== "USER_ACTION_REQUIRED") {
|
|
950
|
-
const msg =
|
|
999
|
+
const msg = getUserActionDisplayMessage(
|
|
1000
|
+
eventType,
|
|
1001
|
+
event.message?.trim() || event.errorMessage?.trim() || getEventMessage(event)
|
|
1002
|
+
);
|
|
951
1003
|
callbacksRef.current.onUserActionEvent?.(eventType, msg);
|
|
952
1004
|
}
|
|
953
1005
|
const activeStep = state.steps.find((s) => s.id === state.currentExecutingStepId);
|
|
@@ -1051,7 +1103,8 @@ function useStreamManagerV2(config, callbacks, setMessages, setIsWaitingForRespo
|
|
|
1051
1103
|
currentExecutingStepId: void 0,
|
|
1052
1104
|
userActionResult: state.userActionResult,
|
|
1053
1105
|
formattedThinkingText: state.hasError ? void 0 : state.formattedThinkingText || void 0,
|
|
1054
|
-
isResolvingImages: needsImageResolve
|
|
1106
|
+
isResolvingImages: needsImageResolve,
|
|
1107
|
+
thinkingDurationSec: state.hasError ? void 0 : Math.max(0, Math.round((Date.now() - streamStartedAt) / 1e3))
|
|
1055
1108
|
};
|
|
1056
1109
|
setMessages(
|
|
1057
1110
|
(prev) => prev.map(
|
|
@@ -1269,9 +1322,9 @@ function streamKeyFor(scopeKey, sessionId) {
|
|
|
1269
1322
|
function useChatV2(config, callbacks = {}) {
|
|
1270
1323
|
const scopeKey = react.useMemo(() => buildScopeKey(config), [
|
|
1271
1324
|
config.session?.userId,
|
|
1272
|
-
config.workflow
|
|
1273
|
-
config.workflow
|
|
1274
|
-
config.workflow
|
|
1325
|
+
config.workflow?.id,
|
|
1326
|
+
config.workflow?.version,
|
|
1327
|
+
config.workflow?.stage
|
|
1275
1328
|
]);
|
|
1276
1329
|
const initialSessionId = chatStore.get(scopeKey).find((m) => m.sessionId)?.sessionId ?? config.session?.initialId ?? void 0;
|
|
1277
1330
|
const [messages, setMessages] = react.useState(() => {
|