@modelnex/sdk 0.5.37 → 0.5.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -920,10 +920,7 @@ function useModelNexSocket({
920
920
  contexts: serializeContexts(contextsRef.current),
921
921
  documentation: documentationRef.current ?? void 0,
922
922
  domSummary: captureDomSummary(tagsRef.current),
923
- websiteId,
924
- // All tagged elements across every page — not just what's visible now.
925
- // The server uses this to pre-search relevant elements for each user query.
926
- allTaggedElements: tagsRef.current ? Array.from(tagsRef.current.values()) : void 0
923
+ websiteId
927
924
  });
928
925
  socket.on("connect", () => {
929
926
  emitSdkDebugLog("[ModelNex SDK] Connected to agent server", {
@@ -3308,6 +3305,59 @@ function createTourSocketPool({
3308
3305
  }
3309
3306
  var tourSocketPool = createTourSocketPool();
3310
3307
 
3308
+ // src/utils/reviewModeToggle.ts
3309
+ function isReviewModeEnabled(devMode, requestedReviewMode) {
3310
+ return Boolean(devMode && requestedReviewMode);
3311
+ }
3312
+ function getReviewModeToggleConfig(playbackState) {
3313
+ const isPaused = playbackState === "paused";
3314
+ return {
3315
+ icon: isPaused ? "\u25B6" : "\u23F8",
3316
+ label: isPaused ? "Continue Workflow" : "Pause for Feedback",
3317
+ shouldResume: isPaused
3318
+ };
3319
+ }
3320
+ function shouldCaptureReviewDraft(isReviewMode, playbackState) {
3321
+ return isReviewMode && playbackState === "paused";
3322
+ }
3323
+
3324
+ // src/utils/tourTransport.ts
3325
+ function compactCaptureEventForTransport(event) {
3326
+ return {
3327
+ id: event.id,
3328
+ type: event.type,
3329
+ order: event.order,
3330
+ timestamp: event.timestamp,
3331
+ url: event.url,
3332
+ label: event.label,
3333
+ tagName: event.tagName,
3334
+ testId: event.testId,
3335
+ fingerprint: event.fingerprint,
3336
+ textContaining: event.textContaining,
3337
+ fieldType: event.fieldType,
3338
+ valueSample: event.valueSample,
3339
+ note: event.note,
3340
+ stepTypeHint: event.stepTypeHint
3341
+ };
3342
+ }
3343
+ function compactTourForTransport(tour) {
3344
+ const capture = tour.capture;
3345
+ if (!capture || typeof capture !== "object") {
3346
+ return tour;
3347
+ }
3348
+ return {
3349
+ ...tour,
3350
+ capture: {
3351
+ ...capture.experienceType ? { experienceType: capture.experienceType } : {},
3352
+ ...capture.onboardingHints ? { onboardingHints: capture.onboardingHints } : {},
3353
+ ...capture.generation ? { generation: capture.generation } : {},
3354
+ ...Array.isArray(capture.events) ? {
3355
+ events: capture.events.map((event) => compactCaptureEventForTransport(event))
3356
+ } : {}
3357
+ }
3358
+ };
3359
+ }
3360
+
3311
3361
  // src/utils/tour-playback-guards.ts
3312
3362
  var playbackOwners = /* @__PURE__ */ new Map();
3313
3363
  function shouldExecuteTourCommandBatch(isPlaybackActive) {
@@ -4792,7 +4842,7 @@ function useTourPlayback({
4792
4842
  }
4793
4843
  claimedPlaybackOwnerKeyRef.current = ownerKey;
4794
4844
  startRequestedRef.current = true;
4795
- const shouldReview = Boolean(options?.reviewMode);
4845
+ const shouldReview = isReviewModeEnabled(devModeRef.current, Boolean(options?.reviewMode));
4796
4846
  resetCaptionSuppression();
4797
4847
  setReviewStatusMessage(null);
4798
4848
  setIsReviewMode(shouldReview);
@@ -4824,7 +4874,7 @@ function useTourPlayback({
4824
4874
  emitSocketEvent(socketRef.current, "tour:request_start", {
4825
4875
  tourId: tour.id,
4826
4876
  previewRunId: previewRunIdRef.current,
4827
- tourContext: tour
4877
+ tourContext: compactTourForTransport(tour)
4828
4878
  });
4829
4879
  }, [serverUrl, websiteId]);
4830
4880
  (0, import_react12.useEffect)(() => {
@@ -8770,19 +8820,6 @@ function isTourListeningSessionActive(state) {
8770
8820
  return state.isTourActive || state.isOnboardingActive || Boolean(state.startingExperienceType);
8771
8821
  }
8772
8822
 
8773
- // src/utils/reviewModeToggle.ts
8774
- function getReviewModeToggleConfig(playbackState) {
8775
- const isPaused = playbackState === "paused";
8776
- return {
8777
- icon: isPaused ? "\u25B6" : "\u23F8",
8778
- label: isPaused ? "Continue Workflow" : "Pause for Feedback",
8779
- shouldResume: isPaused
8780
- };
8781
- }
8782
- function shouldCaptureReviewDraft(isReviewMode, playbackState) {
8783
- return isReviewMode && playbackState === "paused";
8784
- }
8785
-
8786
8823
  // src/utils/reviewVoiceRouting.ts
8787
8824
  function resolveSinglePlaybackTranscriptTarget(snapshot) {
8788
8825
  return shouldCaptureReviewDraft(snapshot.isReviewMode, snapshot.playbackState) ? "review_draft" : "playback";
@@ -9579,6 +9616,7 @@ function ModelNexChatBubble({
9579
9616
  const tourPlayback = (0, import_react18.useMemo)(() => createPlaybackView("tour"), [createPlaybackView]);
9580
9617
  const onboardingPlayback = (0, import_react18.useMemo)(() => createPlaybackView("onboarding"), [createPlaybackView]);
9581
9618
  const tourReviewToggle = getReviewModeToggleConfig(tourPlayback.playbackState);
9619
+ const tourReviewModeEnabled = isReviewModeEnabled(devMode, tourPlayback.isReviewMode);
9582
9620
  const lastAutoTaggedUrlRef = (0, import_react18.useRef)(null);
9583
9621
  const handleAutoTag = (0, import_react18.useCallback)(async () => {
9584
9622
  if (!ctx) return;
@@ -9626,6 +9664,7 @@ function ModelNexChatBubble({
9626
9664
  }
9627
9665
  }, [authoringMode, handleAutoTag, ctx?.extractedElements.length, window.location.pathname]);
9628
9666
  const onboardingReviewToggle = getReviewModeToggleConfig(onboardingPlayback.playbackState);
9667
+ const onboardingReviewModeEnabled = isReviewModeEnabled(devMode, onboardingPlayback.isReviewMode);
9629
9668
  const pendingPrompt = playbackController.pendingPrompt;
9630
9669
  const pendingNotificationType = (onboardingPlayback.pendingTour || tourPlayback.pendingTour)?.notificationType ?? "bubble_card";
9631
9670
  const isPlaybackActive = tourPlayback.isActive || onboardingPlayback.isActive;
@@ -10395,7 +10434,7 @@ function ModelNexChatBubble({
10395
10434
  ]
10396
10435
  }
10397
10436
  ) }),
10398
- tourPlayback.isActive && tourPlayback.isReviewMode && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
10437
+ tourPlayback.isActive && tourReviewModeEnabled && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
10399
10438
  "div",
10400
10439
  {
10401
10440
  style: {
@@ -10690,7 +10729,7 @@ function ModelNexChatBubble({
10690
10729
  ] })
10691
10730
  ] })
10692
10731
  ] }),
10693
- onboardingPlayback.isReviewMode && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
10732
+ onboardingReviewModeEnabled && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
10694
10733
  "div",
10695
10734
  {
10696
10735
  style: {
@@ -10796,7 +10835,7 @@ function ModelNexChatBubble({
10796
10835
  }
10797
10836
  ),
10798
10837
  /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { style: { display: "flex", gap: "8px" }, children: [
10799
- !onboardingPlayback.isReviewMode && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
10838
+ !onboardingReviewModeEnabled && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
10800
10839
  "button",
10801
10840
  {
10802
10841
  onClick: onboardingPlayback.repeatStep,
@@ -10808,7 +10847,7 @@ function ModelNexChatBubble({
10808
10847
  "button",
10809
10848
  {
10810
10849
  onClick: onboardingPlayback.skipTour,
10811
- style: { flex: onboardingPlayback.isReviewMode ? 1 : 0.6, borderRadius: "12px", border: "1px solid rgba(220,38,38,0.18)", background: "#fff5f5", color: "#b91c1c", padding: "11px 14px", cursor: "pointer", fontWeight: 700, fontSize: "13px" },
10850
+ style: { flex: onboardingReviewModeEnabled ? 1 : 0.6, borderRadius: "12px", border: "1px solid rgba(220,38,38,0.18)", background: "#fff5f5", color: "#b91c1c", padding: "11px 14px", cursor: "pointer", fontWeight: 700, fontSize: "13px" },
10812
10851
  children: "Exit"
10813
10852
  }
10814
10853
  )
@@ -10849,7 +10888,7 @@ function ModelNexChatBubble({
10849
10888
  ) })
10850
10889
  ] }),
10851
10890
  tourCurrentStep && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { borderRadius: "14px", background: TOUR_THEME.card, border: `1px solid ${TOUR_THEME.cardBorder}`, padding: "14px" }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { fontSize: "15px", lineHeight: 1.55 }, children: tourCurrentStep.ask || tourCurrentStep.narration || tourCurrentStep.goal }) }),
10852
- tourPlayback.isReviewMode && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
10891
+ tourReviewModeEnabled && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
10853
10892
  "div",
10854
10893
  {
10855
10894
  style: {
@@ -11303,6 +11342,7 @@ function ModelNexOnboardingPanel({
11303
11342
  }) {
11304
11343
  const ctx = (0, import_react19.useContext)(ModelNexContext);
11305
11344
  const serverUrl = ctx?.serverUrl ?? DEFAULT_MODELNEX_SERVER_URL;
11345
+ const devMode = ctx?.devMode ?? false;
11306
11346
  const voice = useVoice(serverUrl);
11307
11347
  const audioLevels = useAudioLevel(voice.isListening);
11308
11348
  const [input, setInput] = (0, import_react19.useState)("");
@@ -11338,6 +11378,7 @@ function ModelNexOnboardingPanel({
11338
11378
  handleVoiceInput: playback.handleVoiceInput
11339
11379
  });
11340
11380
  const reviewToggle = getReviewModeToggleConfig(playback.playbackState);
11381
+ const reviewModeEnabled = isReviewModeEnabled(devMode, playback.isReviewMode);
11341
11382
  (0, import_react19.useEffect)(() => {
11342
11383
  playbackVoiceRoutingRef.current = {
11343
11384
  isReviewMode: playback.isReviewMode,
@@ -11762,7 +11803,7 @@ function ModelNexOnboardingPanel({
11762
11803
  ] })
11763
11804
  ] }),
11764
11805
  sttError === "not-allowed" && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: { fontSize: "12px", color: "#b45309", lineHeight: 1.4, padding: "8px 12px", borderRadius: "10px", background: "#fef3c7" }, children: "Microphone blocked. Allow access in your browser to use voice commands." }),
11765
- playback.isReviewMode && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
11806
+ reviewModeEnabled && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
11766
11807
  "div",
11767
11808
  {
11768
11809
  style: {
@@ -11873,7 +11914,7 @@ function ModelNexOnboardingPanel({
11873
11914
  ] })
11874
11915
  ] }),
11875
11916
  /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { style: { padding: "0 18px 18px", display: "flex", gap: "8px" }, children: [
11876
- playback.isReviewMode && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
11917
+ reviewModeEnabled && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
11877
11918
  "button",
11878
11919
  {
11879
11920
  type: "button",
@@ -11900,7 +11941,7 @@ function ModelNexOnboardingPanel({
11900
11941
  "button",
11901
11942
  {
11902
11943
  onClick: playback.repeatStep,
11903
- style: { flex: playback.isReviewMode ? 0.6 : 1, borderRadius: "12px", border: "1px solid rgba(15,23,42,0.12)", background: "#fff", padding: "11px 14px", cursor: "pointer", fontWeight: 600 },
11944
+ style: { flex: reviewModeEnabled ? 0.6 : 1, borderRadius: "12px", border: "1px solid rgba(15,23,42,0.12)", background: "#fff", padding: "11px 14px", cursor: "pointer", fontWeight: 600 },
11904
11945
  children: "Repeat"
11905
11946
  }
11906
11947
  ),
package/dist/index.mjs CHANGED
@@ -709,10 +709,7 @@ function useModelNexSocket({
709
709
  contexts: serializeContexts(contextsRef.current),
710
710
  documentation: documentationRef.current ?? void 0,
711
711
  domSummary: captureDomSummary(tagsRef.current),
712
- websiteId,
713
- // All tagged elements across every page — not just what's visible now.
714
- // The server uses this to pre-search relevant elements for each user query.
715
- allTaggedElements: tagsRef.current ? Array.from(tagsRef.current.values()) : void 0
712
+ websiteId
716
713
  });
717
714
  socket.on("connect", () => {
718
715
  emitSdkDebugLog("[ModelNex SDK] Connected to agent server", {
@@ -3097,6 +3094,59 @@ function createTourSocketPool({
3097
3094
  }
3098
3095
  var tourSocketPool = createTourSocketPool();
3099
3096
 
3097
+ // src/utils/reviewModeToggle.ts
3098
+ function isReviewModeEnabled(devMode, requestedReviewMode) {
3099
+ return Boolean(devMode && requestedReviewMode);
3100
+ }
3101
+ function getReviewModeToggleConfig(playbackState) {
3102
+ const isPaused = playbackState === "paused";
3103
+ return {
3104
+ icon: isPaused ? "\u25B6" : "\u23F8",
3105
+ label: isPaused ? "Continue Workflow" : "Pause for Feedback",
3106
+ shouldResume: isPaused
3107
+ };
3108
+ }
3109
+ function shouldCaptureReviewDraft(isReviewMode, playbackState) {
3110
+ return isReviewMode && playbackState === "paused";
3111
+ }
3112
+
3113
+ // src/utils/tourTransport.ts
3114
+ function compactCaptureEventForTransport(event) {
3115
+ return {
3116
+ id: event.id,
3117
+ type: event.type,
3118
+ order: event.order,
3119
+ timestamp: event.timestamp,
3120
+ url: event.url,
3121
+ label: event.label,
3122
+ tagName: event.tagName,
3123
+ testId: event.testId,
3124
+ fingerprint: event.fingerprint,
3125
+ textContaining: event.textContaining,
3126
+ fieldType: event.fieldType,
3127
+ valueSample: event.valueSample,
3128
+ note: event.note,
3129
+ stepTypeHint: event.stepTypeHint
3130
+ };
3131
+ }
3132
+ function compactTourForTransport(tour) {
3133
+ const capture = tour.capture;
3134
+ if (!capture || typeof capture !== "object") {
3135
+ return tour;
3136
+ }
3137
+ return {
3138
+ ...tour,
3139
+ capture: {
3140
+ ...capture.experienceType ? { experienceType: capture.experienceType } : {},
3141
+ ...capture.onboardingHints ? { onboardingHints: capture.onboardingHints } : {},
3142
+ ...capture.generation ? { generation: capture.generation } : {},
3143
+ ...Array.isArray(capture.events) ? {
3144
+ events: capture.events.map((event) => compactCaptureEventForTransport(event))
3145
+ } : {}
3146
+ }
3147
+ };
3148
+ }
3149
+
3100
3150
  // src/utils/tour-playback-guards.ts
3101
3151
  var playbackOwners = /* @__PURE__ */ new Map();
3102
3152
  function shouldExecuteTourCommandBatch(isPlaybackActive) {
@@ -4581,7 +4631,7 @@ function useTourPlayback({
4581
4631
  }
4582
4632
  claimedPlaybackOwnerKeyRef.current = ownerKey;
4583
4633
  startRequestedRef.current = true;
4584
- const shouldReview = Boolean(options?.reviewMode);
4634
+ const shouldReview = isReviewModeEnabled(devModeRef.current, Boolean(options?.reviewMode));
4585
4635
  resetCaptionSuppression();
4586
4636
  setReviewStatusMessage(null);
4587
4637
  setIsReviewMode(shouldReview);
@@ -4613,7 +4663,7 @@ function useTourPlayback({
4613
4663
  emitSocketEvent(socketRef.current, "tour:request_start", {
4614
4664
  tourId: tour.id,
4615
4665
  previewRunId: previewRunIdRef.current,
4616
- tourContext: tour
4666
+ tourContext: compactTourForTransport(tour)
4617
4667
  });
4618
4668
  }, [serverUrl, websiteId]);
4619
4669
  useEffect11(() => {
@@ -8558,19 +8608,6 @@ function isTourListeningSessionActive(state) {
8558
8608
  return state.isTourActive || state.isOnboardingActive || Boolean(state.startingExperienceType);
8559
8609
  }
8560
8610
 
8561
- // src/utils/reviewModeToggle.ts
8562
- function getReviewModeToggleConfig(playbackState) {
8563
- const isPaused = playbackState === "paused";
8564
- return {
8565
- icon: isPaused ? "\u25B6" : "\u23F8",
8566
- label: isPaused ? "Continue Workflow" : "Pause for Feedback",
8567
- shouldResume: isPaused
8568
- };
8569
- }
8570
- function shouldCaptureReviewDraft(isReviewMode, playbackState) {
8571
- return isReviewMode && playbackState === "paused";
8572
- }
8573
-
8574
8611
  // src/utils/reviewVoiceRouting.ts
8575
8612
  function resolveSinglePlaybackTranscriptTarget(snapshot) {
8576
8613
  return shouldCaptureReviewDraft(snapshot.isReviewMode, snapshot.playbackState) ? "review_draft" : "playback";
@@ -9367,6 +9404,7 @@ function ModelNexChatBubble({
9367
9404
  const tourPlayback = useMemo3(() => createPlaybackView("tour"), [createPlaybackView]);
9368
9405
  const onboardingPlayback = useMemo3(() => createPlaybackView("onboarding"), [createPlaybackView]);
9369
9406
  const tourReviewToggle = getReviewModeToggleConfig(tourPlayback.playbackState);
9407
+ const tourReviewModeEnabled = isReviewModeEnabled(devMode, tourPlayback.isReviewMode);
9370
9408
  const lastAutoTaggedUrlRef = useRef13(null);
9371
9409
  const handleAutoTag = useCallback12(async () => {
9372
9410
  if (!ctx) return;
@@ -9414,6 +9452,7 @@ function ModelNexChatBubble({
9414
9452
  }
9415
9453
  }, [authoringMode, handleAutoTag, ctx?.extractedElements.length, window.location.pathname]);
9416
9454
  const onboardingReviewToggle = getReviewModeToggleConfig(onboardingPlayback.playbackState);
9455
+ const onboardingReviewModeEnabled = isReviewModeEnabled(devMode, onboardingPlayback.isReviewMode);
9417
9456
  const pendingPrompt = playbackController.pendingPrompt;
9418
9457
  const pendingNotificationType = (onboardingPlayback.pendingTour || tourPlayback.pendingTour)?.notificationType ?? "bubble_card";
9419
9458
  const isPlaybackActive = tourPlayback.isActive || onboardingPlayback.isActive;
@@ -10183,7 +10222,7 @@ function ModelNexChatBubble({
10183
10222
  ]
10184
10223
  }
10185
10224
  ) }),
10186
- tourPlayback.isActive && tourPlayback.isReviewMode && /* @__PURE__ */ jsxs3(
10225
+ tourPlayback.isActive && tourReviewModeEnabled && /* @__PURE__ */ jsxs3(
10187
10226
  "div",
10188
10227
  {
10189
10228
  style: {
@@ -10478,7 +10517,7 @@ function ModelNexChatBubble({
10478
10517
  ] })
10479
10518
  ] })
10480
10519
  ] }),
10481
- onboardingPlayback.isReviewMode && /* @__PURE__ */ jsxs3(
10520
+ onboardingReviewModeEnabled && /* @__PURE__ */ jsxs3(
10482
10521
  "div",
10483
10522
  {
10484
10523
  style: {
@@ -10584,7 +10623,7 @@ function ModelNexChatBubble({
10584
10623
  }
10585
10624
  ),
10586
10625
  /* @__PURE__ */ jsxs3("div", { style: { display: "flex", gap: "8px" }, children: [
10587
- !onboardingPlayback.isReviewMode && /* @__PURE__ */ jsx4(
10626
+ !onboardingReviewModeEnabled && /* @__PURE__ */ jsx4(
10588
10627
  "button",
10589
10628
  {
10590
10629
  onClick: onboardingPlayback.repeatStep,
@@ -10596,7 +10635,7 @@ function ModelNexChatBubble({
10596
10635
  "button",
10597
10636
  {
10598
10637
  onClick: onboardingPlayback.skipTour,
10599
- style: { flex: onboardingPlayback.isReviewMode ? 1 : 0.6, borderRadius: "12px", border: "1px solid rgba(220,38,38,0.18)", background: "#fff5f5", color: "#b91c1c", padding: "11px 14px", cursor: "pointer", fontWeight: 700, fontSize: "13px" },
10638
+ style: { flex: onboardingReviewModeEnabled ? 1 : 0.6, borderRadius: "12px", border: "1px solid rgba(220,38,38,0.18)", background: "#fff5f5", color: "#b91c1c", padding: "11px 14px", cursor: "pointer", fontWeight: 700, fontSize: "13px" },
10600
10639
  children: "Exit"
10601
10640
  }
10602
10641
  )
@@ -10637,7 +10676,7 @@ function ModelNexChatBubble({
10637
10676
  ) })
10638
10677
  ] }),
10639
10678
  tourCurrentStep && /* @__PURE__ */ jsx4("div", { style: { borderRadius: "14px", background: TOUR_THEME.card, border: `1px solid ${TOUR_THEME.cardBorder}`, padding: "14px" }, children: /* @__PURE__ */ jsx4("div", { style: { fontSize: "15px", lineHeight: 1.55 }, children: tourCurrentStep.ask || tourCurrentStep.narration || tourCurrentStep.goal }) }),
10640
- tourPlayback.isReviewMode && /* @__PURE__ */ jsxs3(
10679
+ tourReviewModeEnabled && /* @__PURE__ */ jsxs3(
10641
10680
  "div",
10642
10681
  {
10643
10682
  style: {
@@ -11091,6 +11130,7 @@ function ModelNexOnboardingPanel({
11091
11130
  }) {
11092
11131
  const ctx = useContext6(ModelNexContext);
11093
11132
  const serverUrl = ctx?.serverUrl ?? DEFAULT_MODELNEX_SERVER_URL;
11133
+ const devMode = ctx?.devMode ?? false;
11094
11134
  const voice = useVoice(serverUrl);
11095
11135
  const audioLevels = useAudioLevel(voice.isListening);
11096
11136
  const [input, setInput] = useState14("");
@@ -11126,6 +11166,7 @@ function ModelNexOnboardingPanel({
11126
11166
  handleVoiceInput: playback.handleVoiceInput
11127
11167
  });
11128
11168
  const reviewToggle = getReviewModeToggleConfig(playback.playbackState);
11169
+ const reviewModeEnabled = isReviewModeEnabled(devMode, playback.isReviewMode);
11129
11170
  useEffect18(() => {
11130
11171
  playbackVoiceRoutingRef.current = {
11131
11172
  isReviewMode: playback.isReviewMode,
@@ -11550,7 +11591,7 @@ function ModelNexOnboardingPanel({
11550
11591
  ] })
11551
11592
  ] }),
11552
11593
  sttError === "not-allowed" && /* @__PURE__ */ jsx5("div", { style: { fontSize: "12px", color: "#b45309", lineHeight: 1.4, padding: "8px 12px", borderRadius: "10px", background: "#fef3c7" }, children: "Microphone blocked. Allow access in your browser to use voice commands." }),
11553
- playback.isReviewMode && /* @__PURE__ */ jsxs4(
11594
+ reviewModeEnabled && /* @__PURE__ */ jsxs4(
11554
11595
  "div",
11555
11596
  {
11556
11597
  style: {
@@ -11661,7 +11702,7 @@ function ModelNexOnboardingPanel({
11661
11702
  ] })
11662
11703
  ] }),
11663
11704
  /* @__PURE__ */ jsxs4("div", { style: { padding: "0 18px 18px", display: "flex", gap: "8px" }, children: [
11664
- playback.isReviewMode && /* @__PURE__ */ jsxs4(
11705
+ reviewModeEnabled && /* @__PURE__ */ jsxs4(
11665
11706
  "button",
11666
11707
  {
11667
11708
  type: "button",
@@ -11688,7 +11729,7 @@ function ModelNexOnboardingPanel({
11688
11729
  "button",
11689
11730
  {
11690
11731
  onClick: playback.repeatStep,
11691
- style: { flex: playback.isReviewMode ? 0.6 : 1, borderRadius: "12px", border: "1px solid rgba(15,23,42,0.12)", background: "#fff", padding: "11px 14px", cursor: "pointer", fontWeight: 600 },
11732
+ style: { flex: reviewModeEnabled ? 0.6 : 1, borderRadius: "12px", border: "1px solid rgba(15,23,42,0.12)", background: "#fff", padding: "11px 14px", cursor: "pointer", fontWeight: 600 },
11692
11733
  children: "Repeat"
11693
11734
  }
11694
11735
  ),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modelnex/sdk",
3
- "version": "0.5.37",
3
+ "version": "0.5.39",
4
4
  "description": "React SDK for natural language control of web apps via AI agents",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",