@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 +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +169 -122
- package/dist/index.mjs +167 -122
- package/package.json +1 -1
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 (
|
|
9623
|
+
if (authoringMode && ctx?.extractedElements.length) {
|
|
9582
9624
|
const timer = setTimeout(handleAutoTag, 1e3);
|
|
9583
9625
|
return () => clearTimeout(timer);
|
|
9584
9626
|
}
|
|
9585
|
-
}, [
|
|
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:
|
|
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
|
-
|
|
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" &&
|
|
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 (
|
|
9411
|
+
if (authoringMode && ctx?.extractedElements.length) {
|
|
9372
9412
|
const timer = setTimeout(handleAutoTag, 1e3);
|
|
9373
9413
|
return () => clearTimeout(timer);
|
|
9374
9414
|
}
|
|
9375
|
-
}, [
|
|
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:
|
|
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
|
-
|
|
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" &&
|
|
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,
|