@modelnex/sdk 0.5.36 → 0.5.37

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 CHANGED
@@ -817,9 +817,14 @@ interface SavedDraftPreview {
817
817
  experienceType: ExperienceType;
818
818
  }
819
819
  type PreviewLaunchSource = 'standard' | 'query_param';
820
+ type DraftPreviewModeListener = (enabled: boolean) => void;
820
821
  declare function getPreviewQueryParamName(experienceType: ExperienceType): 'modelnex_test_tour' | 'modelnex_test_workflow';
821
822
  declare function buildDraftPreviewUrl(currentUrl: string, draft: SavedDraftPreview): string;
822
823
  declare function shouldPromptForPreviewStart(notificationType: TourNotificationType | undefined, _source: PreviewLaunchSource): boolean;
824
+ declare function hasDraftPreviewModeSignal(): boolean;
825
+ declare function observeDraftPreviewModeSignal(listener: DraftPreviewModeListener, options?: {
826
+ pollIntervalMs?: number;
827
+ }): () => void;
823
828
  declare function persistActiveDraftPreview(draft: SavedDraftPreview): void;
824
829
  declare function readActiveDraftPreview(): SavedDraftPreview | null;
825
830
  declare function clearActiveDraftPreview(experienceType?: ExperienceType): void;
@@ -847,4 +852,4 @@ interface ModelNexProviderProps {
847
852
  }
848
853
  declare const ModelNexProvider: React$1.FC<ModelNexProviderProps>;
849
854
 
850
- export { type AgentDebug, type AgentTraceLlmInput, type AgentTraceStep, type ChatMessage, DEFAULT_MODELNEX_SERVER_URL, type ExperienceGoal, type ExperiencePlaybackHook, type ExperiencePresentation, type ExperienceType, type ExtractedElement, ModelNexChatBubble, type ModelNexChatBubbleProps, ModelNexOnboardingPanel, type ModelNexOnboardingPanelProps, ModelNexProvider, type ModelNexProviderProps, type OnboardingPlaybackHook, type OnboardingStepMetadata, type PreviewLaunchSource, type RecordingModeHook, RecordingOverlay, type RunCommandResult, type SavedDraftPreview, StudioOverlay, type TagData, type TagStore, type Tour, type TourNotificationType, type TourPlaybackHook, type TourPlaybackState, TourProgressPanel, type TourStartPolicy, type TourStep, type TourStepType, type TourTrigger, UIStateProvider, type UserProfile, type VoiceHook, buildDraftPreviewUrl, buildRecordingCapturePayload, buildRecordingStepGoal, clearActiveDraftPreview, extractInteractiveElements, generateFingerprint, getPreviewQueryParamName, getRecordingDraftActionLabel, getRecordingDraftStatusMessage, inferOnboardingMetadataForStep, isAskDrivenInputStepType, isInteractiveInputStepType, isManualOnboardingStep, isRecordingDraftGenerating, persistActiveDraftPreview, readActiveDraftPreview, shouldPromptForPreviewStart, shouldShowRecordingOverlay, useActionHighlight, useAgentViewport, useAutoExtract, useExperiencePlayback, useOnboardingPlayback, useRecordingMode, useRunCommand, useTagStore, useTourPlayback, useUIState, useViewportTrack, useVisibleIds, useVoice };
855
+ export { type AgentDebug, type AgentTraceLlmInput, type AgentTraceStep, type ChatMessage, DEFAULT_MODELNEX_SERVER_URL, type ExperienceGoal, type ExperiencePlaybackHook, type ExperiencePresentation, type ExperienceType, type ExtractedElement, ModelNexChatBubble, type ModelNexChatBubbleProps, ModelNexOnboardingPanel, type ModelNexOnboardingPanelProps, ModelNexProvider, type ModelNexProviderProps, type OnboardingPlaybackHook, type OnboardingStepMetadata, type PreviewLaunchSource, type RecordingModeHook, RecordingOverlay, type RunCommandResult, type SavedDraftPreview, StudioOverlay, type TagData, type TagStore, type Tour, type TourNotificationType, type TourPlaybackHook, type TourPlaybackState, TourProgressPanel, type TourStartPolicy, type TourStep, type TourStepType, type TourTrigger, UIStateProvider, type UserProfile, type VoiceHook, buildDraftPreviewUrl, buildRecordingCapturePayload, buildRecordingStepGoal, clearActiveDraftPreview, extractInteractiveElements, generateFingerprint, getPreviewQueryParamName, getRecordingDraftActionLabel, getRecordingDraftStatusMessage, hasDraftPreviewModeSignal, inferOnboardingMetadataForStep, isAskDrivenInputStepType, isInteractiveInputStepType, isManualOnboardingStep, isRecordingDraftGenerating, observeDraftPreviewModeSignal, persistActiveDraftPreview, readActiveDraftPreview, shouldPromptForPreviewStart, shouldShowRecordingOverlay, useActionHighlight, useAgentViewport, useAutoExtract, useExperiencePlayback, useOnboardingPlayback, useRecordingMode, useRunCommand, useTagStore, useTourPlayback, useUIState, useViewportTrack, useVisibleIds, useVoice };
package/dist/index.d.ts CHANGED
@@ -817,9 +817,14 @@ interface SavedDraftPreview {
817
817
  experienceType: ExperienceType;
818
818
  }
819
819
  type PreviewLaunchSource = 'standard' | 'query_param';
820
+ type DraftPreviewModeListener = (enabled: boolean) => void;
820
821
  declare function getPreviewQueryParamName(experienceType: ExperienceType): 'modelnex_test_tour' | 'modelnex_test_workflow';
821
822
  declare function buildDraftPreviewUrl(currentUrl: string, draft: SavedDraftPreview): string;
822
823
  declare function shouldPromptForPreviewStart(notificationType: TourNotificationType | undefined, _source: PreviewLaunchSource): boolean;
824
+ declare function hasDraftPreviewModeSignal(): boolean;
825
+ declare function observeDraftPreviewModeSignal(listener: DraftPreviewModeListener, options?: {
826
+ pollIntervalMs?: number;
827
+ }): () => void;
823
828
  declare function persistActiveDraftPreview(draft: SavedDraftPreview): void;
824
829
  declare function readActiveDraftPreview(): SavedDraftPreview | null;
825
830
  declare function clearActiveDraftPreview(experienceType?: ExperienceType): void;
@@ -847,4 +852,4 @@ interface ModelNexProviderProps {
847
852
  }
848
853
  declare const ModelNexProvider: React$1.FC<ModelNexProviderProps>;
849
854
 
850
- export { type AgentDebug, type AgentTraceLlmInput, type AgentTraceStep, type ChatMessage, DEFAULT_MODELNEX_SERVER_URL, type ExperienceGoal, type ExperiencePlaybackHook, type ExperiencePresentation, type ExperienceType, type ExtractedElement, ModelNexChatBubble, type ModelNexChatBubbleProps, ModelNexOnboardingPanel, type ModelNexOnboardingPanelProps, ModelNexProvider, type ModelNexProviderProps, type OnboardingPlaybackHook, type OnboardingStepMetadata, type PreviewLaunchSource, type RecordingModeHook, RecordingOverlay, type RunCommandResult, type SavedDraftPreview, StudioOverlay, type TagData, type TagStore, type Tour, type TourNotificationType, type TourPlaybackHook, type TourPlaybackState, TourProgressPanel, type TourStartPolicy, type TourStep, type TourStepType, type TourTrigger, UIStateProvider, type UserProfile, type VoiceHook, buildDraftPreviewUrl, buildRecordingCapturePayload, buildRecordingStepGoal, clearActiveDraftPreview, extractInteractiveElements, generateFingerprint, getPreviewQueryParamName, getRecordingDraftActionLabel, getRecordingDraftStatusMessage, inferOnboardingMetadataForStep, isAskDrivenInputStepType, isInteractiveInputStepType, isManualOnboardingStep, isRecordingDraftGenerating, persistActiveDraftPreview, readActiveDraftPreview, shouldPromptForPreviewStart, shouldShowRecordingOverlay, useActionHighlight, useAgentViewport, useAutoExtract, useExperiencePlayback, useOnboardingPlayback, useRecordingMode, useRunCommand, useTagStore, useTourPlayback, useUIState, useViewportTrack, useVisibleIds, useVoice };
855
+ export { type AgentDebug, type AgentTraceLlmInput, type AgentTraceStep, type ChatMessage, DEFAULT_MODELNEX_SERVER_URL, type ExperienceGoal, type ExperiencePlaybackHook, type ExperiencePresentation, type ExperienceType, type ExtractedElement, ModelNexChatBubble, type ModelNexChatBubbleProps, ModelNexOnboardingPanel, type ModelNexOnboardingPanelProps, ModelNexProvider, type ModelNexProviderProps, type OnboardingPlaybackHook, type OnboardingStepMetadata, type PreviewLaunchSource, type RecordingModeHook, RecordingOverlay, type RunCommandResult, type SavedDraftPreview, StudioOverlay, type TagData, type TagStore, type Tour, type TourNotificationType, type TourPlaybackHook, type TourPlaybackState, TourProgressPanel, type TourStartPolicy, type TourStep, type TourStepType, type TourTrigger, UIStateProvider, type UserProfile, type VoiceHook, buildDraftPreviewUrl, buildRecordingCapturePayload, buildRecordingStepGoal, clearActiveDraftPreview, extractInteractiveElements, generateFingerprint, getPreviewQueryParamName, getRecordingDraftActionLabel, getRecordingDraftStatusMessage, hasDraftPreviewModeSignal, inferOnboardingMetadataForStep, isAskDrivenInputStepType, isInteractiveInputStepType, isManualOnboardingStep, isRecordingDraftGenerating, observeDraftPreviewModeSignal, persistActiveDraftPreview, readActiveDraftPreview, shouldPromptForPreviewStart, shouldShowRecordingOverlay, useActionHighlight, useAgentViewport, useAutoExtract, useExperiencePlayback, useOnboardingPlayback, useRecordingMode, useRunCommand, useTagStore, useTourPlayback, useUIState, useViewportTrack, useVisibleIds, useVoice };
package/dist/index.js CHANGED
@@ -188,11 +188,13 @@ __export(index_exports, {
188
188
  getPreviewQueryParamName: () => getPreviewQueryParamName,
189
189
  getRecordingDraftActionLabel: () => getRecordingDraftActionLabel,
190
190
  getRecordingDraftStatusMessage: () => getRecordingDraftStatusMessage,
191
+ hasDraftPreviewModeSignal: () => hasDraftPreviewModeSignal,
191
192
  inferOnboardingMetadataForStep: () => inferOnboardingMetadataForStep,
192
193
  isAskDrivenInputStepType: () => isAskDrivenInputStepType,
193
194
  isInteractiveInputStepType: () => isInteractiveInputStepType,
194
195
  isManualOnboardingStep: () => isManualOnboardingStep,
195
196
  isRecordingDraftGenerating: () => isRecordingDraftGenerating,
197
+ observeDraftPreviewModeSignal: () => observeDraftPreviewModeSignal,
196
198
  persistActiveDraftPreview: () => persistActiveDraftPreview,
197
199
  readActiveDraftPreview: () => readActiveDraftPreview,
198
200
  shouldPromptForPreviewStart: () => shouldPromptForPreviewStart,
@@ -2918,6 +2920,159 @@ function clearPersistedRecordingSession() {
2918
2920
  }
2919
2921
  }
2920
2922
 
2923
+ // src/utils/draftPreview.ts
2924
+ var ACTIVE_DRAFT_PREVIEW_STORAGE_KEY = "modelnex:active-draft-preview";
2925
+ var PREVIEW_SESSION_SUPPRESSION_STORAGE_KEY = "modelnex:preview-session-suppressed";
2926
+ var SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY = "modelnex:suppressed-draft-preview";
2927
+ function getPreviewQueryParamName(experienceType) {
2928
+ return experienceType === "onboarding" ? "modelnex_test_workflow" : "modelnex_test_tour";
2929
+ }
2930
+ function buildDraftPreviewUrl(currentUrl, draft) {
2931
+ const url = new URL(currentUrl);
2932
+ url.searchParams.delete("modelnex_test_tour");
2933
+ url.searchParams.delete("modelnex_test_onboarding");
2934
+ url.searchParams.delete("modelnex_test_workflow");
2935
+ url.searchParams.set(getPreviewQueryParamName(draft.experienceType), draft.id);
2936
+ return url.toString();
2937
+ }
2938
+ function shouldPromptForPreviewStart(notificationType, _source) {
2939
+ const normalizedNotificationType = notificationType ?? "bubble_card";
2940
+ return normalizedNotificationType === "modal";
2941
+ }
2942
+ function hasDraftPreviewModeSignal() {
2943
+ if (typeof window === "undefined") return false;
2944
+ try {
2945
+ const params = new URLSearchParams(window.location.search);
2946
+ if (params.has("modelnex_test_tour") || params.has("modelnex_test_workflow") || params.has("modelnex_test_onboarding")) {
2947
+ return true;
2948
+ }
2949
+ } catch {
2950
+ }
2951
+ return readActiveDraftPreview() !== null;
2952
+ }
2953
+ function observeDraftPreviewModeSignal(listener, options) {
2954
+ if (typeof window === "undefined") return () => {
2955
+ };
2956
+ let currentValue = hasDraftPreviewModeSignal();
2957
+ const pollIntervalMs = options?.pollIntervalMs ?? 500;
2958
+ const syncPreviewModeSignal = () => {
2959
+ const nextValue = hasDraftPreviewModeSignal();
2960
+ if (nextValue === currentValue) return;
2961
+ currentValue = nextValue;
2962
+ listener(nextValue);
2963
+ };
2964
+ const intervalId = window.setInterval(syncPreviewModeSignal, pollIntervalMs);
2965
+ window.addEventListener("focus", syncPreviewModeSignal);
2966
+ window.addEventListener("pageshow", syncPreviewModeSignal);
2967
+ window.addEventListener("popstate", syncPreviewModeSignal);
2968
+ if (typeof document !== "undefined") {
2969
+ document.addEventListener("visibilitychange", syncPreviewModeSignal);
2970
+ }
2971
+ return () => {
2972
+ window.clearInterval(intervalId);
2973
+ window.removeEventListener("focus", syncPreviewModeSignal);
2974
+ window.removeEventListener("pageshow", syncPreviewModeSignal);
2975
+ window.removeEventListener("popstate", syncPreviewModeSignal);
2976
+ if (typeof document !== "undefined") {
2977
+ document.removeEventListener("visibilitychange", syncPreviewModeSignal);
2978
+ }
2979
+ };
2980
+ }
2981
+ function persistActiveDraftPreview(draft) {
2982
+ if (typeof window === "undefined") return;
2983
+ try {
2984
+ window.sessionStorage.setItem(ACTIVE_DRAFT_PREVIEW_STORAGE_KEY, JSON.stringify(draft));
2985
+ } catch {
2986
+ }
2987
+ }
2988
+ function readActiveDraftPreview() {
2989
+ if (typeof window === "undefined") return null;
2990
+ try {
2991
+ const raw = window.sessionStorage.getItem(ACTIVE_DRAFT_PREVIEW_STORAGE_KEY);
2992
+ if (!raw) return null;
2993
+ const parsed = JSON.parse(raw);
2994
+ if (!parsed || typeof parsed.id !== "string") return null;
2995
+ if (parsed.experienceType !== "tour" && parsed.experienceType !== "onboarding") return null;
2996
+ return {
2997
+ id: parsed.id,
2998
+ experienceType: parsed.experienceType
2999
+ };
3000
+ } catch {
3001
+ return null;
3002
+ }
3003
+ }
3004
+ function clearActiveDraftPreview(experienceType) {
3005
+ if (typeof window === "undefined") return;
3006
+ try {
3007
+ const activePreview = readActiveDraftPreview();
3008
+ if (experienceType && activePreview && activePreview.experienceType !== experienceType) {
3009
+ return;
3010
+ }
3011
+ window.sessionStorage.removeItem(ACTIVE_DRAFT_PREVIEW_STORAGE_KEY);
3012
+ } catch {
3013
+ }
3014
+ }
3015
+ function readSavedDraftPreview(storageKey) {
3016
+ if (typeof window === "undefined") return null;
3017
+ try {
3018
+ const raw = window.sessionStorage.getItem(storageKey);
3019
+ if (!raw) return null;
3020
+ const parsed = JSON.parse(raw);
3021
+ if (!parsed || typeof parsed.id !== "string") return null;
3022
+ if (parsed.experienceType !== "tour" && parsed.experienceType !== "onboarding") return null;
3023
+ return {
3024
+ id: parsed.id,
3025
+ experienceType: parsed.experienceType
3026
+ };
3027
+ } catch {
3028
+ return null;
3029
+ }
3030
+ }
3031
+ function readSuppressedDraftPreview() {
3032
+ return readSavedDraftPreview(SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY);
3033
+ }
3034
+ function persistSuppressedDraftPreview(draft) {
3035
+ if (typeof window === "undefined") return;
3036
+ try {
3037
+ window.sessionStorage.setItem(SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY, JSON.stringify(draft));
3038
+ } catch {
3039
+ }
3040
+ }
3041
+ function clearSuppressedDraftPreview(draft) {
3042
+ if (typeof window === "undefined") return;
3043
+ try {
3044
+ const suppressedDraft = readSuppressedDraftPreview();
3045
+ if (draft && suppressedDraft) {
3046
+ if (suppressedDraft.id !== draft.id || suppressedDraft.experienceType !== draft.experienceType) {
3047
+ return;
3048
+ }
3049
+ }
3050
+ window.sessionStorage.removeItem(SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY);
3051
+ } catch {
3052
+ }
3053
+ }
3054
+ function isSuppressedDraftPreview(draft) {
3055
+ const suppressedDraft = readSuppressedDraftPreview();
3056
+ return Boolean(
3057
+ suppressedDraft && suppressedDraft.id === draft.id && suppressedDraft.experienceType === draft.experienceType
3058
+ );
3059
+ }
3060
+ function persistPreviewSessionSuppression() {
3061
+ if (typeof window === "undefined") return;
3062
+ try {
3063
+ window.sessionStorage.setItem(PREVIEW_SESSION_SUPPRESSION_STORAGE_KEY, "true");
3064
+ } catch {
3065
+ }
3066
+ }
3067
+ function readPreviewSessionSuppression() {
3068
+ if (typeof window === "undefined") return false;
3069
+ try {
3070
+ return window.sessionStorage.getItem(PREVIEW_SESSION_SUPPRESSION_STORAGE_KEY) === "true";
3071
+ } catch {
3072
+ return false;
3073
+ }
3074
+ }
3075
+
2921
3076
  // src/hooks/useRunCommand.ts
2922
3077
  var import_react9 = require("react");
2923
3078
  function searchTaggedElementsForQuery(store, query, limit = 8) {
@@ -3053,120 +3208,6 @@ var import_react_dom = require("react-dom");
3053
3208
  // src/hooks/useExperiencePlaybackController.ts
3054
3209
  var import_react13 = require("react");
3055
3210
 
3056
- // src/utils/draftPreview.ts
3057
- var ACTIVE_DRAFT_PREVIEW_STORAGE_KEY = "modelnex:active-draft-preview";
3058
- var PREVIEW_SESSION_SUPPRESSION_STORAGE_KEY = "modelnex:preview-session-suppressed";
3059
- var SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY = "modelnex:suppressed-draft-preview";
3060
- function getPreviewQueryParamName(experienceType) {
3061
- return experienceType === "onboarding" ? "modelnex_test_workflow" : "modelnex_test_tour";
3062
- }
3063
- function buildDraftPreviewUrl(currentUrl, draft) {
3064
- const url = new URL(currentUrl);
3065
- url.searchParams.delete("modelnex_test_tour");
3066
- url.searchParams.delete("modelnex_test_onboarding");
3067
- url.searchParams.delete("modelnex_test_workflow");
3068
- url.searchParams.set(getPreviewQueryParamName(draft.experienceType), draft.id);
3069
- return url.toString();
3070
- }
3071
- function shouldPromptForPreviewStart(notificationType, _source) {
3072
- const normalizedNotificationType = notificationType ?? "bubble_card";
3073
- return normalizedNotificationType === "modal";
3074
- }
3075
- function persistActiveDraftPreview(draft) {
3076
- if (typeof window === "undefined") return;
3077
- try {
3078
- window.sessionStorage.setItem(ACTIVE_DRAFT_PREVIEW_STORAGE_KEY, JSON.stringify(draft));
3079
- } catch {
3080
- }
3081
- }
3082
- function readActiveDraftPreview() {
3083
- if (typeof window === "undefined") return null;
3084
- try {
3085
- const raw = window.sessionStorage.getItem(ACTIVE_DRAFT_PREVIEW_STORAGE_KEY);
3086
- if (!raw) return null;
3087
- const parsed = JSON.parse(raw);
3088
- if (!parsed || typeof parsed.id !== "string") return null;
3089
- if (parsed.experienceType !== "tour" && parsed.experienceType !== "onboarding") return null;
3090
- return {
3091
- id: parsed.id,
3092
- experienceType: parsed.experienceType
3093
- };
3094
- } catch {
3095
- return null;
3096
- }
3097
- }
3098
- function clearActiveDraftPreview(experienceType) {
3099
- if (typeof window === "undefined") return;
3100
- try {
3101
- const activePreview = readActiveDraftPreview();
3102
- if (experienceType && activePreview && activePreview.experienceType !== experienceType) {
3103
- return;
3104
- }
3105
- window.sessionStorage.removeItem(ACTIVE_DRAFT_PREVIEW_STORAGE_KEY);
3106
- } catch {
3107
- }
3108
- }
3109
- function readSavedDraftPreview(storageKey) {
3110
- if (typeof window === "undefined") return null;
3111
- try {
3112
- const raw = window.sessionStorage.getItem(storageKey);
3113
- if (!raw) return null;
3114
- const parsed = JSON.parse(raw);
3115
- if (!parsed || typeof parsed.id !== "string") return null;
3116
- if (parsed.experienceType !== "tour" && parsed.experienceType !== "onboarding") return null;
3117
- return {
3118
- id: parsed.id,
3119
- experienceType: parsed.experienceType
3120
- };
3121
- } catch {
3122
- return null;
3123
- }
3124
- }
3125
- function readSuppressedDraftPreview() {
3126
- return readSavedDraftPreview(SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY);
3127
- }
3128
- function persistSuppressedDraftPreview(draft) {
3129
- if (typeof window === "undefined") return;
3130
- try {
3131
- window.sessionStorage.setItem(SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY, JSON.stringify(draft));
3132
- } catch {
3133
- }
3134
- }
3135
- function clearSuppressedDraftPreview(draft) {
3136
- if (typeof window === "undefined") return;
3137
- try {
3138
- const suppressedDraft = readSuppressedDraftPreview();
3139
- if (draft && suppressedDraft) {
3140
- if (suppressedDraft.id !== draft.id || suppressedDraft.experienceType !== draft.experienceType) {
3141
- return;
3142
- }
3143
- }
3144
- window.sessionStorage.removeItem(SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY);
3145
- } catch {
3146
- }
3147
- }
3148
- function isSuppressedDraftPreview(draft) {
3149
- const suppressedDraft = readSuppressedDraftPreview();
3150
- return Boolean(
3151
- suppressedDraft && suppressedDraft.id === draft.id && suppressedDraft.experienceType === draft.experienceType
3152
- );
3153
- }
3154
- function persistPreviewSessionSuppression() {
3155
- if (typeof window === "undefined") return;
3156
- try {
3157
- window.sessionStorage.setItem(PREVIEW_SESSION_SUPPRESSION_STORAGE_KEY, "true");
3158
- } catch {
3159
- }
3160
- }
3161
- function readPreviewSessionSuppression() {
3162
- if (typeof window === "undefined") return false;
3163
- try {
3164
- return window.sessionStorage.getItem(PREVIEW_SESSION_SUPPRESSION_STORAGE_KEY) === "true";
3165
- } catch {
3166
- return false;
3167
- }
3168
- }
3169
-
3170
3211
  // src/utils/locationSignature.ts
3171
3212
  function getLocationSignature(locationLike) {
3172
3213
  if (!locationLike) return "";
@@ -9450,6 +9491,7 @@ function ModelNexChatBubble({
9450
9491
  const setRecordingMode = ctx?.setRecordingMode ?? (() => {
9451
9492
  });
9452
9493
  const devMode = ctx?.devMode ?? false;
9494
+ const authoringMode = ctx?.authoringMode ?? devMode;
9453
9495
  const [recordingTourName, setRecordingTourName] = (0, import_react18.useState)("");
9454
9496
  const [recordingTargetTypes, setRecordingTargetTypes] = (0, import_react18.useState)("admin");
9455
9497
  const [showStopModal, setShowStopModal] = (0, import_react18.useState)(false);
@@ -9578,11 +9620,11 @@ function ModelNexChatBubble({
9578
9620
  }
9579
9621
  }, [ctx]);
9580
9622
  (0, import_react18.useEffect)(() => {
9581
- if (devMode && ctx?.extractedElements.length) {
9623
+ if (authoringMode && ctx?.extractedElements.length) {
9582
9624
  const timer = setTimeout(handleAutoTag, 1e3);
9583
9625
  return () => clearTimeout(timer);
9584
9626
  }
9585
- }, [devMode, handleAutoTag, ctx?.extractedElements.length, window.location.pathname]);
9627
+ }, [authoringMode, handleAutoTag, ctx?.extractedElements.length, window.location.pathname]);
9586
9628
  const onboardingReviewToggle = getReviewModeToggleConfig(onboardingPlayback.playbackState);
9587
9629
  const pendingPrompt = playbackController.pendingPrompt;
9588
9630
  const pendingNotificationType = (onboardingPlayback.pendingTour || tourPlayback.pendingTour)?.notificationType ?? "bubble_card";
@@ -9943,7 +9985,7 @@ function ModelNexChatBubble({
9943
9985
  content: summary || fallbackContent,
9944
9986
  summary: summary ?? void 0,
9945
9987
  nextSteps: nextSteps ?? void 0,
9946
- debug: devMode ? data?.debug ?? void 0 : void 0
9988
+ debug: authoringMode ? data?.debug ?? void 0 : void 0
9947
9989
  }
9948
9990
  ]);
9949
9991
  } catch (err) {
@@ -10231,7 +10273,7 @@ function ModelNexChatBubble({
10231
10273
  children: voice.isMuted ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(VolumeMuteIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(VolumeIcon, {})
10232
10274
  }
10233
10275
  ) }),
10234
- devMode && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", background: "var(--modelnex-bg-secondary, #f4f4f5)", borderRadius: "12px", padding: "2px", gap: "2px", marginRight: "4px" }, children: (!recordingMode || activeRecordingExperienceType === "onboarding") && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Tooltip, { title: recordingMode ? "Stop & Save Workflow" : "Record Workflow", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
10276
+ authoringMode && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", background: "var(--modelnex-bg-secondary, #f4f4f5)", borderRadius: "12px", padding: "2px", gap: "2px", marginRight: "4px" }, children: (!recordingMode || activeRecordingExperienceType === "onboarding") && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Tooltip, { title: recordingMode ? "Stop & Save Workflow" : "Record Workflow", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
10235
10277
  "button",
10236
10278
  {
10237
10279
  onClick: () => {
@@ -10987,7 +11029,7 @@ function ModelNexChatBubble({
10987
11029
  )
10988
11030
  }
10989
11031
  ),
10990
- msg.role === "assistant" && devMode && msg.debug && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(AgentTraces, { debug: msg.debug, command: messages[i - 1]?.content ?? "" })
11032
+ msg.role === "assistant" && authoringMode && msg.debug && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(AgentTraces, { debug: msg.debug, command: messages[i - 1]?.content ?? "" })
10991
11033
  ] }, i)),
10992
11034
  loading && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: { display: "flex", justifyContent: "flex-start" }, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
10993
11035
  "div",
@@ -11988,7 +12030,9 @@ var ModelNexProvider = ({
11988
12030
  const [actions, setActions] = (0, import_react21.useState)(/* @__PURE__ */ new Map());
11989
12031
  const [validatedBrowserDevMode, setValidatedBrowserDevMode] = (0, import_react21.useState)(false);
11990
12032
  const [resolvedDevModeKey, setResolvedDevModeKey] = (0, import_react21.useState)(() => resolveInjectedDevModeKey());
12033
+ const [previewRuntimeMode, setPreviewRuntimeMode] = (0, import_react21.useState)(() => hasDraftPreviewModeSignal());
11991
12034
  (0, import_react21.useEffect)(() => observeInjectedDevModeKey(setResolvedDevModeKey), []);
12035
+ (0, import_react21.useEffect)(() => observeDraftPreviewModeSignal(setPreviewRuntimeMode), []);
11992
12036
  (0, import_react21.useEffect)(() => {
11993
12037
  let cancelled = false;
11994
12038
  if (!websiteId || !resolvedDevModeKey) {
@@ -12005,7 +12049,7 @@ var ModelNexProvider = ({
12005
12049
  cancelled = true;
12006
12050
  };
12007
12051
  }, [resolvedDevModeKey, serverUrl, websiteId]);
12008
- const effectiveDevMode = validatedBrowserDevMode;
12052
+ const effectiveDevMode = validatedBrowserDevMode || previewRuntimeMode;
12009
12053
  const registerAction = (0, import_react21.useCallback)((action) => {
12010
12054
  setActions((prev) => {
12011
12055
  const next = new Map(prev);
@@ -12102,9 +12146,10 @@ var ModelNexProvider = ({
12102
12146
  voiceMuted,
12103
12147
  setVoiceMuted,
12104
12148
  socketId,
12105
- devMode: effectiveDevMode
12149
+ devMode: effectiveDevMode,
12150
+ authoringMode: validatedBrowserDevMode
12106
12151
  }),
12107
- [serverUrl, commandUrl, registerAction, unregisterAction, activeAgentActions, stagingFields, highlightActions, studioMode, recordingMode, extractedElements, tagStore, chatMessages, websiteId, userProfile?.userId, userProfile?.type, userProfile?.isNewUser, toursApiBase, voiceMuted, socketId, effectiveDevMode]
12152
+ [serverUrl, commandUrl, registerAction, unregisterAction, activeAgentActions, stagingFields, highlightActions, studioMode, recordingMode, extractedElements, tagStore, chatMessages, websiteId, userProfile?.userId, userProfile?.type, userProfile?.isNewUser, toursApiBase, voiceMuted, socketId, effectiveDevMode, validatedBrowserDevMode]
12108
12153
  );
12109
12154
  return import_react21.default.createElement(
12110
12155
  ModelNexContext.Provider,
@@ -12135,11 +12180,13 @@ var ModelNexProvider = ({
12135
12180
  getPreviewQueryParamName,
12136
12181
  getRecordingDraftActionLabel,
12137
12182
  getRecordingDraftStatusMessage,
12183
+ hasDraftPreviewModeSignal,
12138
12184
  inferOnboardingMetadataForStep,
12139
12185
  isAskDrivenInputStepType,
12140
12186
  isInteractiveInputStepType,
12141
12187
  isManualOnboardingStep,
12142
12188
  isRecordingDraftGenerating,
12189
+ observeDraftPreviewModeSignal,
12143
12190
  persistActiveDraftPreview,
12144
12191
  readActiveDraftPreview,
12145
12192
  shouldPromptForPreviewStart,
package/dist/index.mjs CHANGED
@@ -2709,6 +2709,159 @@ function clearPersistedRecordingSession() {
2709
2709
  }
2710
2710
  }
2711
2711
 
2712
+ // src/utils/draftPreview.ts
2713
+ var ACTIVE_DRAFT_PREVIEW_STORAGE_KEY = "modelnex:active-draft-preview";
2714
+ var PREVIEW_SESSION_SUPPRESSION_STORAGE_KEY = "modelnex:preview-session-suppressed";
2715
+ var SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY = "modelnex:suppressed-draft-preview";
2716
+ function getPreviewQueryParamName(experienceType) {
2717
+ return experienceType === "onboarding" ? "modelnex_test_workflow" : "modelnex_test_tour";
2718
+ }
2719
+ function buildDraftPreviewUrl(currentUrl, draft) {
2720
+ const url = new URL(currentUrl);
2721
+ url.searchParams.delete("modelnex_test_tour");
2722
+ url.searchParams.delete("modelnex_test_onboarding");
2723
+ url.searchParams.delete("modelnex_test_workflow");
2724
+ url.searchParams.set(getPreviewQueryParamName(draft.experienceType), draft.id);
2725
+ return url.toString();
2726
+ }
2727
+ function shouldPromptForPreviewStart(notificationType, _source) {
2728
+ const normalizedNotificationType = notificationType ?? "bubble_card";
2729
+ return normalizedNotificationType === "modal";
2730
+ }
2731
+ function hasDraftPreviewModeSignal() {
2732
+ if (typeof window === "undefined") return false;
2733
+ try {
2734
+ const params = new URLSearchParams(window.location.search);
2735
+ if (params.has("modelnex_test_tour") || params.has("modelnex_test_workflow") || params.has("modelnex_test_onboarding")) {
2736
+ return true;
2737
+ }
2738
+ } catch {
2739
+ }
2740
+ return readActiveDraftPreview() !== null;
2741
+ }
2742
+ function observeDraftPreviewModeSignal(listener, options) {
2743
+ if (typeof window === "undefined") return () => {
2744
+ };
2745
+ let currentValue = hasDraftPreviewModeSignal();
2746
+ const pollIntervalMs = options?.pollIntervalMs ?? 500;
2747
+ const syncPreviewModeSignal = () => {
2748
+ const nextValue = hasDraftPreviewModeSignal();
2749
+ if (nextValue === currentValue) return;
2750
+ currentValue = nextValue;
2751
+ listener(nextValue);
2752
+ };
2753
+ const intervalId = window.setInterval(syncPreviewModeSignal, pollIntervalMs);
2754
+ window.addEventListener("focus", syncPreviewModeSignal);
2755
+ window.addEventListener("pageshow", syncPreviewModeSignal);
2756
+ window.addEventListener("popstate", syncPreviewModeSignal);
2757
+ if (typeof document !== "undefined") {
2758
+ document.addEventListener("visibilitychange", syncPreviewModeSignal);
2759
+ }
2760
+ return () => {
2761
+ window.clearInterval(intervalId);
2762
+ window.removeEventListener("focus", syncPreviewModeSignal);
2763
+ window.removeEventListener("pageshow", syncPreviewModeSignal);
2764
+ window.removeEventListener("popstate", syncPreviewModeSignal);
2765
+ if (typeof document !== "undefined") {
2766
+ document.removeEventListener("visibilitychange", syncPreviewModeSignal);
2767
+ }
2768
+ };
2769
+ }
2770
+ function persistActiveDraftPreview(draft) {
2771
+ if (typeof window === "undefined") return;
2772
+ try {
2773
+ window.sessionStorage.setItem(ACTIVE_DRAFT_PREVIEW_STORAGE_KEY, JSON.stringify(draft));
2774
+ } catch {
2775
+ }
2776
+ }
2777
+ function readActiveDraftPreview() {
2778
+ if (typeof window === "undefined") return null;
2779
+ try {
2780
+ const raw = window.sessionStorage.getItem(ACTIVE_DRAFT_PREVIEW_STORAGE_KEY);
2781
+ if (!raw) return null;
2782
+ const parsed = JSON.parse(raw);
2783
+ if (!parsed || typeof parsed.id !== "string") return null;
2784
+ if (parsed.experienceType !== "tour" && parsed.experienceType !== "onboarding") return null;
2785
+ return {
2786
+ id: parsed.id,
2787
+ experienceType: parsed.experienceType
2788
+ };
2789
+ } catch {
2790
+ return null;
2791
+ }
2792
+ }
2793
+ function clearActiveDraftPreview(experienceType) {
2794
+ if (typeof window === "undefined") return;
2795
+ try {
2796
+ const activePreview = readActiveDraftPreview();
2797
+ if (experienceType && activePreview && activePreview.experienceType !== experienceType) {
2798
+ return;
2799
+ }
2800
+ window.sessionStorage.removeItem(ACTIVE_DRAFT_PREVIEW_STORAGE_KEY);
2801
+ } catch {
2802
+ }
2803
+ }
2804
+ function readSavedDraftPreview(storageKey) {
2805
+ if (typeof window === "undefined") return null;
2806
+ try {
2807
+ const raw = window.sessionStorage.getItem(storageKey);
2808
+ if (!raw) return null;
2809
+ const parsed = JSON.parse(raw);
2810
+ if (!parsed || typeof parsed.id !== "string") return null;
2811
+ if (parsed.experienceType !== "tour" && parsed.experienceType !== "onboarding") return null;
2812
+ return {
2813
+ id: parsed.id,
2814
+ experienceType: parsed.experienceType
2815
+ };
2816
+ } catch {
2817
+ return null;
2818
+ }
2819
+ }
2820
+ function readSuppressedDraftPreview() {
2821
+ return readSavedDraftPreview(SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY);
2822
+ }
2823
+ function persistSuppressedDraftPreview(draft) {
2824
+ if (typeof window === "undefined") return;
2825
+ try {
2826
+ window.sessionStorage.setItem(SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY, JSON.stringify(draft));
2827
+ } catch {
2828
+ }
2829
+ }
2830
+ function clearSuppressedDraftPreview(draft) {
2831
+ if (typeof window === "undefined") return;
2832
+ try {
2833
+ const suppressedDraft = readSuppressedDraftPreview();
2834
+ if (draft && suppressedDraft) {
2835
+ if (suppressedDraft.id !== draft.id || suppressedDraft.experienceType !== draft.experienceType) {
2836
+ return;
2837
+ }
2838
+ }
2839
+ window.sessionStorage.removeItem(SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY);
2840
+ } catch {
2841
+ }
2842
+ }
2843
+ function isSuppressedDraftPreview(draft) {
2844
+ const suppressedDraft = readSuppressedDraftPreview();
2845
+ return Boolean(
2846
+ suppressedDraft && suppressedDraft.id === draft.id && suppressedDraft.experienceType === draft.experienceType
2847
+ );
2848
+ }
2849
+ function persistPreviewSessionSuppression() {
2850
+ if (typeof window === "undefined") return;
2851
+ try {
2852
+ window.sessionStorage.setItem(PREVIEW_SESSION_SUPPRESSION_STORAGE_KEY, "true");
2853
+ } catch {
2854
+ }
2855
+ }
2856
+ function readPreviewSessionSuppression() {
2857
+ if (typeof window === "undefined") return false;
2858
+ try {
2859
+ return window.sessionStorage.getItem(PREVIEW_SESSION_SUPPRESSION_STORAGE_KEY) === "true";
2860
+ } catch {
2861
+ return false;
2862
+ }
2863
+ }
2864
+
2712
2865
  // src/hooks/useRunCommand.ts
2713
2866
  import { useCallback as useCallback5, useContext as useContext2 } from "react";
2714
2867
  function searchTaggedElementsForQuery(store, query, limit = 8) {
@@ -2844,120 +2997,6 @@ import { createPortal, flushSync } from "react-dom";
2844
2997
  // src/hooks/useExperiencePlaybackController.ts
2845
2998
  import { useCallback as useCallback8, useEffect as useEffect12, useRef as useRef9, useState as useState8 } from "react";
2846
2999
 
2847
- // src/utils/draftPreview.ts
2848
- var ACTIVE_DRAFT_PREVIEW_STORAGE_KEY = "modelnex:active-draft-preview";
2849
- var PREVIEW_SESSION_SUPPRESSION_STORAGE_KEY = "modelnex:preview-session-suppressed";
2850
- var SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY = "modelnex:suppressed-draft-preview";
2851
- function getPreviewQueryParamName(experienceType) {
2852
- return experienceType === "onboarding" ? "modelnex_test_workflow" : "modelnex_test_tour";
2853
- }
2854
- function buildDraftPreviewUrl(currentUrl, draft) {
2855
- const url = new URL(currentUrl);
2856
- url.searchParams.delete("modelnex_test_tour");
2857
- url.searchParams.delete("modelnex_test_onboarding");
2858
- url.searchParams.delete("modelnex_test_workflow");
2859
- url.searchParams.set(getPreviewQueryParamName(draft.experienceType), draft.id);
2860
- return url.toString();
2861
- }
2862
- function shouldPromptForPreviewStart(notificationType, _source) {
2863
- const normalizedNotificationType = notificationType ?? "bubble_card";
2864
- return normalizedNotificationType === "modal";
2865
- }
2866
- function persistActiveDraftPreview(draft) {
2867
- if (typeof window === "undefined") return;
2868
- try {
2869
- window.sessionStorage.setItem(ACTIVE_DRAFT_PREVIEW_STORAGE_KEY, JSON.stringify(draft));
2870
- } catch {
2871
- }
2872
- }
2873
- function readActiveDraftPreview() {
2874
- if (typeof window === "undefined") return null;
2875
- try {
2876
- const raw = window.sessionStorage.getItem(ACTIVE_DRAFT_PREVIEW_STORAGE_KEY);
2877
- if (!raw) return null;
2878
- const parsed = JSON.parse(raw);
2879
- if (!parsed || typeof parsed.id !== "string") return null;
2880
- if (parsed.experienceType !== "tour" && parsed.experienceType !== "onboarding") return null;
2881
- return {
2882
- id: parsed.id,
2883
- experienceType: parsed.experienceType
2884
- };
2885
- } catch {
2886
- return null;
2887
- }
2888
- }
2889
- function clearActiveDraftPreview(experienceType) {
2890
- if (typeof window === "undefined") return;
2891
- try {
2892
- const activePreview = readActiveDraftPreview();
2893
- if (experienceType && activePreview && activePreview.experienceType !== experienceType) {
2894
- return;
2895
- }
2896
- window.sessionStorage.removeItem(ACTIVE_DRAFT_PREVIEW_STORAGE_KEY);
2897
- } catch {
2898
- }
2899
- }
2900
- function readSavedDraftPreview(storageKey) {
2901
- if (typeof window === "undefined") return null;
2902
- try {
2903
- const raw = window.sessionStorage.getItem(storageKey);
2904
- if (!raw) return null;
2905
- const parsed = JSON.parse(raw);
2906
- if (!parsed || typeof parsed.id !== "string") return null;
2907
- if (parsed.experienceType !== "tour" && parsed.experienceType !== "onboarding") return null;
2908
- return {
2909
- id: parsed.id,
2910
- experienceType: parsed.experienceType
2911
- };
2912
- } catch {
2913
- return null;
2914
- }
2915
- }
2916
- function readSuppressedDraftPreview() {
2917
- return readSavedDraftPreview(SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY);
2918
- }
2919
- function persistSuppressedDraftPreview(draft) {
2920
- if (typeof window === "undefined") return;
2921
- try {
2922
- window.sessionStorage.setItem(SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY, JSON.stringify(draft));
2923
- } catch {
2924
- }
2925
- }
2926
- function clearSuppressedDraftPreview(draft) {
2927
- if (typeof window === "undefined") return;
2928
- try {
2929
- const suppressedDraft = readSuppressedDraftPreview();
2930
- if (draft && suppressedDraft) {
2931
- if (suppressedDraft.id !== draft.id || suppressedDraft.experienceType !== draft.experienceType) {
2932
- return;
2933
- }
2934
- }
2935
- window.sessionStorage.removeItem(SUPPRESSED_DRAFT_PREVIEW_STORAGE_KEY);
2936
- } catch {
2937
- }
2938
- }
2939
- function isSuppressedDraftPreview(draft) {
2940
- const suppressedDraft = readSuppressedDraftPreview();
2941
- return Boolean(
2942
- suppressedDraft && suppressedDraft.id === draft.id && suppressedDraft.experienceType === draft.experienceType
2943
- );
2944
- }
2945
- function persistPreviewSessionSuppression() {
2946
- if (typeof window === "undefined") return;
2947
- try {
2948
- window.sessionStorage.setItem(PREVIEW_SESSION_SUPPRESSION_STORAGE_KEY, "true");
2949
- } catch {
2950
- }
2951
- }
2952
- function readPreviewSessionSuppression() {
2953
- if (typeof window === "undefined") return false;
2954
- try {
2955
- return window.sessionStorage.getItem(PREVIEW_SESSION_SUPPRESSION_STORAGE_KEY) === "true";
2956
- } catch {
2957
- return false;
2958
- }
2959
- }
2960
-
2961
3000
  // src/utils/locationSignature.ts
2962
3001
  function getLocationSignature(locationLike) {
2963
3002
  if (!locationLike) return "";
@@ -9240,6 +9279,7 @@ function ModelNexChatBubble({
9240
9279
  const setRecordingMode = ctx?.setRecordingMode ?? (() => {
9241
9280
  });
9242
9281
  const devMode = ctx?.devMode ?? false;
9282
+ const authoringMode = ctx?.authoringMode ?? devMode;
9243
9283
  const [recordingTourName, setRecordingTourName] = useState13("");
9244
9284
  const [recordingTargetTypes, setRecordingTargetTypes] = useState13("admin");
9245
9285
  const [showStopModal, setShowStopModal] = useState13(false);
@@ -9368,11 +9408,11 @@ function ModelNexChatBubble({
9368
9408
  }
9369
9409
  }, [ctx]);
9370
9410
  useEffect17(() => {
9371
- if (devMode && ctx?.extractedElements.length) {
9411
+ if (authoringMode && ctx?.extractedElements.length) {
9372
9412
  const timer = setTimeout(handleAutoTag, 1e3);
9373
9413
  return () => clearTimeout(timer);
9374
9414
  }
9375
- }, [devMode, handleAutoTag, ctx?.extractedElements.length, window.location.pathname]);
9415
+ }, [authoringMode, handleAutoTag, ctx?.extractedElements.length, window.location.pathname]);
9376
9416
  const onboardingReviewToggle = getReviewModeToggleConfig(onboardingPlayback.playbackState);
9377
9417
  const pendingPrompt = playbackController.pendingPrompt;
9378
9418
  const pendingNotificationType = (onboardingPlayback.pendingTour || tourPlayback.pendingTour)?.notificationType ?? "bubble_card";
@@ -9733,7 +9773,7 @@ function ModelNexChatBubble({
9733
9773
  content: summary || fallbackContent,
9734
9774
  summary: summary ?? void 0,
9735
9775
  nextSteps: nextSteps ?? void 0,
9736
- debug: devMode ? data?.debug ?? void 0 : void 0
9776
+ debug: authoringMode ? data?.debug ?? void 0 : void 0
9737
9777
  }
9738
9778
  ]);
9739
9779
  } catch (err) {
@@ -10021,7 +10061,7 @@ function ModelNexChatBubble({
10021
10061
  children: voice.isMuted ? /* @__PURE__ */ jsx4(VolumeMuteIcon, {}) : /* @__PURE__ */ jsx4(VolumeIcon, {})
10022
10062
  }
10023
10063
  ) }),
10024
- devMode && /* @__PURE__ */ jsx4("div", { style: { display: "flex", background: "var(--modelnex-bg-secondary, #f4f4f5)", borderRadius: "12px", padding: "2px", gap: "2px", marginRight: "4px" }, children: (!recordingMode || activeRecordingExperienceType === "onboarding") && /* @__PURE__ */ jsx4(Tooltip, { title: recordingMode ? "Stop & Save Workflow" : "Record Workflow", children: /* @__PURE__ */ jsx4(
10064
+ authoringMode && /* @__PURE__ */ jsx4("div", { style: { display: "flex", background: "var(--modelnex-bg-secondary, #f4f4f5)", borderRadius: "12px", padding: "2px", gap: "2px", marginRight: "4px" }, children: (!recordingMode || activeRecordingExperienceType === "onboarding") && /* @__PURE__ */ jsx4(Tooltip, { title: recordingMode ? "Stop & Save Workflow" : "Record Workflow", children: /* @__PURE__ */ jsx4(
10025
10065
  "button",
10026
10066
  {
10027
10067
  onClick: () => {
@@ -10777,7 +10817,7 @@ function ModelNexChatBubble({
10777
10817
  )
10778
10818
  }
10779
10819
  ),
10780
- msg.role === "assistant" && devMode && msg.debug && /* @__PURE__ */ jsx4(AgentTraces, { debug: msg.debug, command: messages[i - 1]?.content ?? "" })
10820
+ msg.role === "assistant" && authoringMode && msg.debug && /* @__PURE__ */ jsx4(AgentTraces, { debug: msg.debug, command: messages[i - 1]?.content ?? "" })
10781
10821
  ] }, i)),
10782
10822
  loading && /* @__PURE__ */ jsx4("div", { style: { display: "flex", justifyContent: "flex-start" }, children: /* @__PURE__ */ jsxs3(
10783
10823
  "div",
@@ -11778,7 +11818,9 @@ var ModelNexProvider = ({
11778
11818
  const [actions, setActions] = useState15(/* @__PURE__ */ new Map());
11779
11819
  const [validatedBrowserDevMode, setValidatedBrowserDevMode] = useState15(false);
11780
11820
  const [resolvedDevModeKey, setResolvedDevModeKey] = useState15(() => resolveInjectedDevModeKey());
11821
+ const [previewRuntimeMode, setPreviewRuntimeMode] = useState15(() => hasDraftPreviewModeSignal());
11781
11822
  useEffect19(() => observeInjectedDevModeKey(setResolvedDevModeKey), []);
11823
+ useEffect19(() => observeDraftPreviewModeSignal(setPreviewRuntimeMode), []);
11782
11824
  useEffect19(() => {
11783
11825
  let cancelled = false;
11784
11826
  if (!websiteId || !resolvedDevModeKey) {
@@ -11795,7 +11837,7 @@ var ModelNexProvider = ({
11795
11837
  cancelled = true;
11796
11838
  };
11797
11839
  }, [resolvedDevModeKey, serverUrl, websiteId]);
11798
- const effectiveDevMode = validatedBrowserDevMode;
11840
+ const effectiveDevMode = validatedBrowserDevMode || previewRuntimeMode;
11799
11841
  const registerAction = useCallback14((action) => {
11800
11842
  setActions((prev) => {
11801
11843
  const next = new Map(prev);
@@ -11892,9 +11934,10 @@ var ModelNexProvider = ({
11892
11934
  voiceMuted,
11893
11935
  setVoiceMuted,
11894
11936
  socketId,
11895
- devMode: effectiveDevMode
11937
+ devMode: effectiveDevMode,
11938
+ authoringMode: validatedBrowserDevMode
11896
11939
  }),
11897
- [serverUrl, commandUrl, registerAction, unregisterAction, activeAgentActions, stagingFields, highlightActions, studioMode, recordingMode, extractedElements, tagStore, chatMessages, websiteId, userProfile?.userId, userProfile?.type, userProfile?.isNewUser, toursApiBase, voiceMuted, socketId, effectiveDevMode]
11940
+ [serverUrl, commandUrl, registerAction, unregisterAction, activeAgentActions, stagingFields, highlightActions, studioMode, recordingMode, extractedElements, tagStore, chatMessages, websiteId, userProfile?.userId, userProfile?.type, userProfile?.isNewUser, toursApiBase, voiceMuted, socketId, effectiveDevMode, validatedBrowserDevMode]
11898
11941
  );
11899
11942
  return React8.createElement(
11900
11943
  ModelNexContext.Provider,
@@ -11924,11 +11967,13 @@ export {
11924
11967
  getPreviewQueryParamName,
11925
11968
  getRecordingDraftActionLabel,
11926
11969
  getRecordingDraftStatusMessage,
11970
+ hasDraftPreviewModeSignal,
11927
11971
  inferOnboardingMetadataForStep,
11928
11972
  isAskDrivenInputStepType,
11929
11973
  isInteractiveInputStepType,
11930
11974
  isManualOnboardingStep,
11931
11975
  isRecordingDraftGenerating,
11976
+ observeDraftPreviewModeSignal,
11932
11977
  persistActiveDraftPreview,
11933
11978
  readActiveDraftPreview,
11934
11979
  shouldPromptForPreviewStart,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modelnex/sdk",
3
- "version": "0.5.36",
3
+ "version": "0.5.37",
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",