@explorer02/cfm-survey-sdk 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/cli/index.js +94 -83
  2. package/dist/cli/index.mjs +94 -83
  3. package/package.json +1 -1
  4. package/templates/docs/00-integration/client-lib-folder.md +1 -0
  5. package/templates/docs/00-integration/wizard-chrome-contract.md +2 -1
  6. package/templates/docs/00-integration/wizard-preview-build-guide.md +17 -0
  7. package/templates/docs/01-components/03-rating-scale.md +8 -3
  8. package/templates/docs/02-reference/value-derivation.md +2 -0
  9. package/templates/docs/03-ui-specs/01-rating.md +15 -1
  10. package/templates/docs/templates/CsatMatrixScale.tsx +18 -24
  11. package/templates/docs/templates/CustomSliderTrack.tsx +5 -3
  12. package/templates/docs/templates/FileUploadScale.tsx +143 -18
  13. package/templates/docs/templates/Header.tsx +1 -0
  14. package/templates/docs/templates/HeatmapScale.tsx +11 -2
  15. package/templates/docs/templates/LanguageSelector.tsx +42 -19
  16. package/templates/docs/templates/LikertMatrixScale.tsx +43 -33
  17. package/templates/docs/templates/MatrixDropdown.tsx +12 -11
  18. package/templates/docs/templates/Question.tsx +109 -44
  19. package/templates/docs/templates/RankOrderScale.tsx +22 -5
  20. package/templates/docs/templates/RatingScale.tsx +77 -39
  21. package/templates/docs/templates/SliderMatrixScale.tsx +44 -16
  22. package/templates/docs/templates/selectionStyles.ts +90 -2
  23. package/templates/docs/templates/surveyUiIcons.tsx +2 -2
  24. package/templates/docs/templates/surveyUiScaleUtils.ts +52 -5
  25. package/templates/docs/templates/uiConfig.ts +56 -0
  26. package/templates/preview-harness/preview-bridge.inline.js +44 -0
  27. package/templates/preview-harness/previewPages.js +76 -51
  28. package/templates/preview-harness/previewPages.ts +7 -34
  29. package/templates/preview-harness/vite-app/src/PreviewConfigContext.tsx +7 -0
  30. package/templates/preview-harness/vite-app/src/QuestionPreview.tsx +59 -30
  31. package/templates/preview-harness/vite-app/src/SurveyPagePreview.tsx +36 -8
  32. package/templates/preview-harness/vite-app/src/fixtures/questions.ts +182 -82
  33. package/templates/previewBridge.ts +33 -0
  34. package/templates/survey-theme.css +13 -4
  35. package/templates/wizard-dist/assets/{PreviewMock-Bax7oRAL.js → PreviewMock-DbbLpHdF.js} +1 -1
  36. package/templates/wizard-dist/assets/TypePanel-DQbV2iCf.js +1 -0
  37. package/templates/wizard-dist/assets/index-CY7WMJ93.js +34 -0
  38. package/templates/wizard-dist/index.html +1 -1
  39. package/templates/wizard-dist/assets/TypePanel-D2t4FPSd.js +0 -1
  40. package/templates/wizard-dist/assets/index-c5lka74l.js +0 -34
@@ -1,39 +1,71 @@
1
1
  #!/usr/bin/env node
2
- var jo=Object.defineProperty;var we=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(o,t)=>(typeof require<"u"?require:o)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var B=(e,o)=>()=>(e&&(o=e(e=0)),o);var Ie=(e,o)=>{for(var t in o)jo(e,t,{get:o[t],enumerable:!0})};var c,U=B(()=>{"use strict";c={reset:"\x1B[0m",bold:"\x1B[1m",green:"\x1B[32m",red:"\x1B[31m",cyan:"\x1B[36m",yellow:"\x1B[33m",dim:"\x1B[2m"}});var Q,be=B(()=>{"use strict";Q=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"]});function Mo(e){let o={};for(let t of e)qe[t]&&(o[t]={...qe[t]});return o}function Uo(e=[],o){return{version:"1.0",instanceId:o,surveyTypes:e,global:{surveyTitle:"Customer Feedback Survey",companyName:"Sprinklr",browserTabTitle:"Customer Feedback Survey",thankYouMessage:"Thank you for your valuable feedback!",logo:{fileName:null,url:null},header:{height:120,logoBoxWidth:120,logoBoxHeight:120,logoPadding:10,logoPlacement:"left",showCompanyName:!0,companyNamePlacement:"left",companyNameFontSize:18,companyNameFontWeight:600,companyNameColor:"#1A1F36",backgroundColor:"#FFFFFF",shadowEnabled:!0,borderBottomColor:"#E5E7EB",contentPaddingX:40},footer:{backgroundColor:"#262626",textColor:"#9CA3AF",linkColor:"#9CA3AF",linkHoverColor:"#FFFFFF",showLogo:!0,logoWidth:120,logoHeight:32,logoPlacement:"left",copyrightText:"\xA9 Company Name",layout:"row",paddingY:24,paddingX:40,links:[]},theme:{pageBackground:"#FFFFFF",cardBackground:"#FFFFFF",cardBorderColor:"#E5E7EB",cardPadding:24,cardShadowEnabled:!0,selectedBackground:"#E8F5FD",zebraRowColor:"rgba(249,250,251,0.8)",rowBandColor:"#F3F4F6",validationBorder:"#333333",validationBackground:"#D9D9D9",tooltipBackground:"#1F2937",progressTrackHeight:12,progressTrackColor:"#E5E7EB",progressFillColor:"#1A1F36",stickyChromePaddingTop:16,stickyChromePaddingBottom:20,languageSelectorBackground:"#FFFFFF",languageSelectorTextColor:"#2563EB",languageSelectorBorderColor:"#2563EB"},layout:{showHeader:!0,showFooter:!0,showProgressBar:!0,showLanguageSwitcher:!1,showNextButton:!0,showBackButton:!0,showQuestionNumbers:!0,showRequiredAsterisk:!0,width:"standard",borderStyle:"rounded",fontStyle:"modern"},buttons:{next:"Next",back:"Back",submit:"Submit"},colorScheme:{..._},colorSource:"auto",typography:{fontFamily:"Inter, sans-serif",headingWeight:700},motion:{enabled:!1,durationMs:200}},questionTypes:Mo(e),placeholders:{firstName:"Alex",lastName:"Customer",email:"alex@example.com"},customFields:{},debug:{enabled:!1,sampleAnswers:{}},deploy:{target:"aws",autoDeploy:!1}}}function H(e,o){return{...e,...o??{}}}function Qe(e){let o=(e.surveyTypes??[]).filter(r=>Q.includes(r)),t=Uo(o,e.instanceId),n=e.global??{},i=t.global,s={...t.questionTypes};if(e.questionTypes)for(let[r,a]of Object.entries(e.questionTypes))s[r]={...s[r]??{},...a};return{...t,...e,configuredAt:void 0,surveyTypes:o.length?o:t.surveyTypes,global:{...i,...n,header:H(i.header,n.header),footer:H(i.footer,n.footer),theme:H(i.theme,n.theme),layout:H(i.layout,n.layout),buttons:H(i.buttons,n.buttons),logo:H(i.logo,n.logo),colorScheme:H(i.colorScheme,n.colorScheme),typography:H(i.typography,n.typography),motion:H(i.motion,n.motion)},questionTypes:s,placeholders:{...t.placeholders,...e.placeholders??{}},customFields:{...t.customFields,...e.customFields??{}},debug:{enabled:e.debug?.enabled??t.debug?.enabled??!1,sampleAnswers:e.debug?.sampleAnswers??t.debug?.sampleAnswers},deploy:{...t.deploy,...e.deploy??{}}}}var _,qe,Ge=B(()=>{"use strict";be();_={primary:"#1A1F36",secondary:"#E8F5FD",accent:"#00B5AD",background:"#FFFFFF",text:"#1A1F36",buttonText:"#FFFFFF"},qe={MCQ:{cardStyle:"outlined",selectedAccent:_.accent,optionGap:8,borderRadius:8,cardPadding:12,selectedBackground:_.secondary,hoverBorderColor:_.accent},TEXTFIELD:{inputRadius:8,focusRing:_.accent,borderColor:"#E5E7EB",inputPadding:12,inputHeight:44,placeholderColor:"#9CA3AF"},NPS_SCALE:{buttonStyle:"standard",selectedFill:_.secondary,labelColor:_.text,trackBarColor:"#F2F2F2",trackHighlightColor:"#FBE8F3",cellSize:40,cellGap:4},CFM_MATRIX:{rowLabelWidth:180,cellSelectedColor:_.accent,headerStyle:"bold",bipolarColumnWidthPercent:25,carouselDotColor:"#2563EB",cellPadding:8},CSAT_MATRIX:{rowLabelWidth:180,cellSelectedColor:_.accent,headerStyle:"bold",bipolarColumnWidthPercent:25,carouselDotColor:_.primary,cellPadding:8,accentColor:_.accent,emojiSize:24,unselectedOpacity:.5,selectedRingColor:_.accent,cellSize:40,tooltipBg:"#1F2937"},RATING_MATRIX:{starColor:"#F59E0B",badgeColor:_.primary,rowLabelWidth:180,unselectedStarOpacity:.5},SLIDER_MATRIX:{trackColor:_.accent,thumbColor:_.primary,tickColor:"#9CA3AF",rowLabelWidth:180,rowBandColor:"#F3F4F6",tickBadgeSize:28},FILE_UPLOAD:{dropzoneStyle:"dashed",accentColor:_.accent,dropzonePadding:24},TEXT_AND_MEDIA:{mediaMaxWidth:100,mediaRadius:8,captionColor:"#6B7280",captionSize:14},HEATMAP:{pinColor:_.accent,pinSize:12,pinBorderColor:"#FFFFFF",overlayOpacity:.3},RANK_ORDER:{itemBg:"#F9FAFB",dragHandleColor:"#9CA3AF",rankBadgeColor:_.primary,itemPadding:12,itemGap:8}}});import*as Ce from"fs";import*as ue from"path";function oo(e){let o={},t=/--cfm-[\w-]+\s*:\s*([^;]+);/g,n;for(;(n=t.exec(e))!==null;){let i=n[0].split(":")[0].trim(),s=n[1].trim();o[i]=s}return o}function b(e){if(!e)return;let o=parseFloat(e.replace(/px$/,""));return Number.isFinite(o)?o:void 0}function eo(e){if(!e)return;let o=parseFloat(e.replace(/%$/,""));return Number.isFinite(o)?o:void 0}function ge(e){if(!e)return;let o=parseFloat(e);return Number.isFinite(o)?o:void 0}function to(e){let o={global:{},questionTypes:{}},t=o.global,n={},i={},s={},r={},a={},l={},y={},m=o.questionTypes;if(e["--cfm-primary"]&&(n.primary=e["--cfm-primary"]),e["--cfm-secondary"]&&(n.secondary=e["--cfm-secondary"]),e["--cfm-accent"]&&(n.accent=e["--cfm-accent"]),e["--cfm-background"]&&(n.background=e["--cfm-background"]),e["--cfm-text"]&&(n.text=e["--cfm-text"]),e["--cfm-button-text"]&&(n.buttonText=e["--cfm-button-text"]),e["--cfm-max-width"]&&Ke[e["--cfm-max-width"]]&&(a.width=Ke[e["--cfm-max-width"]]),e["--cfm-border-radius"]&&Ye[e["--cfm-border-radius"]]&&(a.borderStyle=Ye[e["--cfm-border-radius"]]),e["--cfm-font-family"]&&(l.fontFamily=e["--cfm-font-family"],Ze[e["--cfm-font-family"]]&&(a.fontStyle=Ze[e["--cfm-font-family"]])),e["--cfm-heading-weight"]&&(l.headingWeight=ge(e["--cfm-heading-weight"])),e["--cfm-motion-duration"]){let A=b(e["--cfm-motion-duration"]);A!==void 0&&(y.durationMs=A,y.enabled=A>0)}e["--cfm-header-height"]&&(i.height=b(e["--cfm-header-height"])),e["--cfm-header-logo-width"]&&(i.logoBoxWidth=b(e["--cfm-header-logo-width"])),e["--cfm-header-logo-height"]&&(i.logoBoxHeight=b(e["--cfm-header-logo-height"])),e["--cfm-header-logo-padding"]&&(i.logoPadding=b(e["--cfm-header-logo-padding"])),e["--cfm-header-bg"]&&(i.backgroundColor=e["--cfm-header-bg"]),e["--cfm-header-company-color"]&&(i.companyNameColor=e["--cfm-header-company-color"]),e["--cfm-header-company-size"]&&(i.companyNameFontSize=b(e["--cfm-header-company-size"])),e["--cfm-header-company-weight"]&&(i.companyNameFontWeight=ge(e["--cfm-header-company-weight"])),e["--cfm-header-border"]&&(i.borderBottomColor=e["--cfm-header-border"]),e["--cfm-header-padding-x"]&&(i.contentPaddingX=b(e["--cfm-header-padding-x"])),e["--cfm-footer-bg"]&&(s.backgroundColor=e["--cfm-footer-bg"]),e["--cfm-footer-text"]&&(s.textColor=e["--cfm-footer-text"]),e["--cfm-footer-link"]&&(s.linkColor=e["--cfm-footer-link"]),e["--cfm-footer-link-hover"]&&(s.linkHoverColor=e["--cfm-footer-link-hover"]),e["--cfm-footer-logo-width"]&&(s.logoWidth=b(e["--cfm-footer-logo-width"])),e["--cfm-footer-logo-height"]&&(s.logoHeight=b(e["--cfm-footer-logo-height"])),e["--cfm-footer-padding-y"]&&(s.paddingY=b(e["--cfm-footer-padding-y"])),e["--cfm-footer-padding-x"]&&(s.paddingX=b(e["--cfm-footer-padding-x"])),e["--cfm-background"]&&(r.pageBackground=e["--cfm-background"]),e["--cfm-card-bg"]&&(r.cardBackground=e["--cfm-card-bg"]),e["--cfm-card-border-color"]&&(r.cardBorderColor=e["--cfm-card-border-color"]),e["--cfm-card-padding"]&&(r.cardPadding=b(e["--cfm-card-padding"])),e["--cfm-card-shadow"]&&(r.cardShadowEnabled=e["--cfm-card-shadow"]!=="none"),e["--cfm-selected-bg"]&&(r.selectedBackground=e["--cfm-selected-bg"]),e["--cfm-zebra-row"]&&(r.zebraRowColor=e["--cfm-zebra-row"]),e["--cfm-row-band"]&&(r.rowBandColor=e["--cfm-row-band"]),e["--cfm-validation-border"]&&(r.validationBorder=e["--cfm-validation-border"]),e["--cfm-validation-bg"]&&(r.validationBackground=e["--cfm-validation-bg"]),e["--cfm-tooltip-bg"]&&(r.tooltipBackground=e["--cfm-tooltip-bg"]),e["--cfm-progress-height"]&&(r.progressTrackHeight=b(e["--cfm-progress-height"])),e["--cfm-progress-track"]&&(r.progressTrackColor=e["--cfm-progress-track"]),e["--cfm-progress-fill"]&&(r.progressFillColor=e["--cfm-progress-fill"]),e["--cfm-sticky-pt"]&&(r.stickyChromePaddingTop=b(e["--cfm-sticky-pt"])),e["--cfm-sticky-pb"]&&(r.stickyChromePaddingBottom=b(e["--cfm-sticky-pb"]));let C={};e["--cfm-mcq-selected-accent"]&&(C.selectedAccent=e["--cfm-mcq-selected-accent"]),e["--cfm-mcq-border-radius"]&&(C.borderRadius=b(e["--cfm-mcq-border-radius"])),e["--cfm-mcq-option-gap"]&&(C.optionGap=b(e["--cfm-mcq-option-gap"])),e["--cfm-mcq-card-padding"]&&(C.cardPadding=b(e["--cfm-mcq-card-padding"])),e["--cfm-mcq-selected-bg"]&&(C.selectedBackground=e["--cfm-mcq-selected-bg"]),e["--cfm-mcq-hover-border"]&&(C.hoverBorderColor=e["--cfm-mcq-hover-border"]),Object.keys(C).length&&(m.MCQ=C);let S={};e["--cfm-input-radius"]&&(S.inputRadius=b(e["--cfm-input-radius"])),e["--cfm-input-focus-ring"]&&(S.focusRing=e["--cfm-input-focus-ring"]),e["--cfm-input-border"]&&(S.borderColor=e["--cfm-input-border"]),e["--cfm-input-padding"]&&(S.inputPadding=b(e["--cfm-input-padding"])),e["--cfm-input-height"]&&(S.inputHeight=b(e["--cfm-input-height"])),e["--cfm-input-placeholder"]&&(S.placeholderColor=e["--cfm-input-placeholder"]),Object.keys(S).length&&(m.TEXTFIELD=S);let E={};e["--cfm-nps-selected-fill"]&&(E.selectedFill=e["--cfm-nps-selected-fill"]),e["--cfm-nps-label-color"]&&(E.labelColor=e["--cfm-nps-label-color"]),e["--cfm-nps-track-bar"]&&(E.trackBarColor=e["--cfm-nps-track-bar"]),e["--cfm-nps-track-highlight"]&&(E.trackHighlightColor=e["--cfm-nps-track-highlight"]),e["--cfm-nps-cell-size"]&&(E.cellSize=b(e["--cfm-nps-cell-size"])),e["--cfm-nps-cell-gap"]&&(E.cellGap=b(e["--cfm-nps-cell-gap"])),Object.keys(E).length&&(m.NPS_SCALE=E);let v=b(e["--cfm-matrix-row-width"]),x={};v!==void 0&&(x.rowLabelWidth=v),e["--cfm-matrix-selected"]&&(x.cellSelectedColor=e["--cfm-matrix-selected"]),e["--cfm-matrix-bipolar-width"]&&(x.bipolarColumnWidthPercent=eo(e["--cfm-matrix-bipolar-width"])),e["--cfm-matrix-carousel-dot"]&&(x.carouselDotColor=e["--cfm-matrix-carousel-dot"]),e["--cfm-matrix-cell-padding"]&&(x.cellPadding=b(e["--cfm-matrix-cell-padding"])),Object.keys(x).length&&(m.CFM_MATRIX=x);let d={...x};e["--cfm-csat-accent"]&&(d.accentColor=e["--cfm-csat-accent"]),e["--cfm-csat-emoji-size"]&&(d.emojiSize=b(e["--cfm-csat-emoji-size"])),e["--cfm-csat-unselected-opacity"]&&(d.unselectedOpacity=ge(e["--cfm-csat-unselected-opacity"])),e["--cfm-csat-ring-color"]&&(d.selectedRingColor=e["--cfm-csat-ring-color"]),e["--cfm-csat-cell-size"]&&(d.cellSize=b(e["--cfm-csat-cell-size"])),e["--cfm-csat-tooltip-bg"]&&(d.tooltipBg=e["--cfm-csat-tooltip-bg"]),(Object.keys(d).length>Object.keys(x).length||e["--cfm-csat-accent"])&&(m.CSAT_MATRIX=d);let f={};e["--cfm-star-color"]&&(f.starColor=e["--cfm-star-color"]),e["--cfm-badge-color"]&&(f.badgeColor=e["--cfm-badge-color"]),v!==void 0&&(f.rowLabelWidth=v),e["--cfm-star-unselected-opacity"]&&(f.unselectedStarOpacity=ge(e["--cfm-star-unselected-opacity"])),Object.keys(f).length&&(m.RATING_MATRIX=f);let T={};e["--cfm-slider-track"]&&(T.trackColor=e["--cfm-slider-track"]),e["--cfm-slider-thumb"]&&(T.thumbColor=e["--cfm-slider-thumb"]),e["--cfm-slider-tick"]&&(T.tickColor=e["--cfm-slider-tick"]),v!==void 0&&(T.rowLabelWidth=v),e["--cfm-slider-row-band"]&&(T.rowBandColor=e["--cfm-slider-row-band"]),e["--cfm-slider-tick-size"]&&(T.tickBadgeSize=b(e["--cfm-slider-tick-size"])),Object.keys(T).length&&(m.SLIDER_MATRIX=T);let $={};e["--cfm-upload-accent"]&&($.accentColor=e["--cfm-upload-accent"]),e["--cfm-upload-padding"]&&($.dropzonePadding=b(e["--cfm-upload-padding"])),Object.keys($).length&&(m.FILE_UPLOAD=$);let h={};e["--cfm-media-max-width"]&&(h.mediaMaxWidth=eo(e["--cfm-media-max-width"])),e["--cfm-media-radius"]&&(h.mediaRadius=b(e["--cfm-media-radius"])),e["--cfm-media-caption-color"]&&(h.captionColor=e["--cfm-media-caption-color"]),e["--cfm-media-caption-size"]&&(h.captionSize=b(e["--cfm-media-caption-size"])),Object.keys(h).length&&(m.TEXT_AND_MEDIA=h);let P={};e["--cfm-heatmap-pin"]&&(P.pinColor=e["--cfm-heatmap-pin"]),e["--cfm-heatmap-pin-size"]&&(P.pinSize=b(e["--cfm-heatmap-pin-size"])),e["--cfm-heatmap-pin-border"]&&(P.pinBorderColor=e["--cfm-heatmap-pin-border"]),e["--cfm-heatmap-overlay-opacity"]&&(P.overlayOpacity=ge(e["--cfm-heatmap-overlay-opacity"])),Object.keys(P).length&&(m.HEATMAP=P);let w={};return e["--cfm-rank-item-bg"]&&(w.itemBg=e["--cfm-rank-item-bg"]),e["--cfm-rank-badge"]&&(w.rankBadgeColor=e["--cfm-rank-badge"]),e["--cfm-rank-handle"]&&(w.dragHandleColor=e["--cfm-rank-handle"]),e["--cfm-rank-item-padding"]&&(w.itemPadding=b(e["--cfm-rank-item-padding"])),e["--cfm-rank-item-gap"]&&(w.itemGap=b(e["--cfm-rank-item-gap"])),Object.keys(w).length&&(m.RANK_ORDER=w),Object.keys(n).length&&(t.colorScheme=n),Object.keys(i).length&&(t.header=i),Object.keys(s).length&&(t.footer=s),Object.keys(r).length&&(t.theme=r),Object.keys(a).length&&(t.layout=a),Object.keys(l).length&&(t.typography=l),Object.keys(y).length&&(t.motion=y),o}function ne(e){let o=[ue.join(e,"src","styles","survey-theme.css"),ue.join(e,"src","app","survey-theme.css"),ue.join(e,"src","styles","globals.css"),ue.join(e,"src","app","globals.css")];for(let t of o)if(Ce.existsSync(t)&&Ce.readFileSync(t,"utf8").includes("--cfm-"))return t;return null}var Ke,Ye,Ze,$e=B(()=>{"use strict";Ke={"36rem":"narrow","48rem":"standard","64rem":"wide"},Ye={"0px":"sharp","12px":"rounded","9999px":"pill"},Ze={"system-ui, sans-serif":"system","Inter, sans-serif":"modern","Georgia, serif":"serif"}});import*as xe from"fs";import*as no from"path";function Bo(e){for(let o of zo){let t=no.join(e,o);if(xe.existsSync(t))return t}return null}function Wo(e){let o=e.trim();if(!o||o.startsWith("http")||o.startsWith("data:"))return null;let t=o.split("?")[0];return t.startsWith("/")?t.slice(1):t}function io(e){let o=Bo(e);if(!o)return null;let t=xe.readFileSync(o,"utf8"),n=t.match(/data-cfm-logo[\s\S]*?src=["']([^"']+)["']/i)??t.match(/src=["']([^"']+)["'][\s\S]*?data-cfm-logo/i);if(n){let r=Wo(n[1]);if(r)return{mode:"image",publicPath:r,fileName:r}}let i=t.match(/data-cfm-logo-text[^>]*>([^<]+)</i);if(i)return{mode:"text",label:i[1].trim()};let s=t.match(/data-cfm-company[^>]*>([^<]+)</i);return s&&!n?{mode:"text",label:s[1].trim()}:null}var zo,ro=B(()=>{"use strict";zo=["src/components/Header.tsx","components/Header.tsx","app/components/Header.tsx"]});var fo={};Ie(fo,{logSeedSource:()=>Fe,resolveInitialConfig:()=>re,writeResolvedUiConfig:()=>Ne});import*as W from"fs";import*as V from"path";function je(e){return e.filter(o=>Q.includes(o))}function so(e){try{let o=JSON.parse(W.readFileSync(e,"utf8"));return o.version!=="1.0"?null:(delete o.configuredAt,o)}catch{return null}}function Vo(e){let o={global:{}};if(!W.existsSync(e))return o;let t=W.readFileSync(e,"utf8"),n=new Set;for(let s of Q)t.includes(s)&&n.add(s);n.size&&(o.surveyTypes=[...n]);let i=t.match(/\*\*Branding source:\*\*\s*(.+)/i);if(i){let s=i[1].trim(),r=s.match(/company[:\s]+([^,;]+)/i),a=s.match(/title[:\s]+([^,;]+)/i);if(r&&(o.global.companyName=r[1].trim()),a){let l=a[1].trim();o.global.surveyTitle=l,o.global.browserTabTitle=l}}return o}function lo(e,o){let t=V.join(e,o);if(!W.existsSync(t))return null;let n=W.readFileSync(t);if(n.length>Jo)return{fileName:o,dataUrl:""};let i=V.extname(o).toLowerCase(),s=Ho[i]??"application/octet-stream";return{fileName:o,dataUrl:`data:${s};base64,${n.toString("base64")}`}}function co(e,o){if(!o)return null;if(o.url&&typeof o.url=="string")return{fileName:o.fileName??null,url:o.url};if(o.fileName){let t=lo(e,o.fileName);if(t)return{fileName:t.fileName,url:t.dataUrl||null}}return o.fileName===null&&o.url===null?{fileName:null,url:null}:null}function ao(e,o){let t=e.global??{},n=o.global??{},i=e.questionTypes??{},s=o.questionTypes??{},r={...i};for(let[a,l]of Object.entries(s))r[a]={...r[a]??{},...l};return{...e,...o,surveyTypes:o.surveyTypes??e.surveyTypes,global:{...t,...n,header:{...t.header,...n.header},footer:{...t.footer,...n.footer},theme:{...t.theme,...n.theme},layout:{...t.layout,...n.layout},buttons:{...t.buttons,...n.buttons},logo:{...t.logo,...n.logo},colorScheme:{...t.colorScheme,...n.colorScheme},typography:{...t.typography,...n.typography},motion:{...t.motion,...n.motion}},questionTypes:r,placeholders:{...e.placeholders,...o.placeholders},customFields:{...e.customFields,...o.customFields},deploy:{...e.deploy,...o.deploy}}}function re(e){let o=e.projectRoot??process.env.INIT_CWD??process.cwd(),t=V.join(o,"survey-ui-config.json"),n=V.join(o,"implementation_plan.md"),i=V.join(o,"public"),s=je(e.surveyTypes),r={},a="defaults",l=ne(o);if(l){let w=W.readFileSync(l,"utf8"),A=oo(w);Object.keys(A).length>0&&(r=to(A),a="survey-theme.css")}let y=Vo(n);r=ao(r,y);let m=so(t);m&&(r=ao(r,m),a="survey-ui-config.json");let C=V.join(o,"survey-ui-config.final.json"),S=so(C),E=!!m?.configuredAt,v=!!S?.configuredAt;if(S&&v&&!E){let w=co(i,S.global?.logo);w&&(r.global={...r.global??{},logo:{fileName:w.fileName,url:w.url}})}let x=co(i,r.global?.logo),d=io(o),f=!!m?.configuredAt,T=x?.fileName!=null&&/^logo_\d+_/i.test(x.fileName),$=d?.mode==="image"?d.fileName:null,h=!f&&T&&$!=null&&x?.fileName!==$;if(x&&!h)r.global={...r.global??{},logo:{fileName:x.fileName,url:x.url}};else if(d?.mode==="image"){let w=lo(i,d.fileName);r.global={...r.global??{},logo:{fileName:d.fileName,url:w?.dataUrl||null}}}else d?.mode==="text"&&(r.global={...r.global??{},logo:{fileName:null,url:null},companyName:r.global?.companyName??d.label});return r.surveyTypes=je(r.surveyTypes??s),r.surveyTypes?.length||(r.surveyTypes=s),e.instanceId&&(r.instanceId=e.instanceId),{config:Qe(r),source:a}}function Fe(e){console.log(e==="survey-ui-config.json"?`${ie.dim} Seeding wizard from survey-ui-config.json${ie.reset}`:e==="survey-theme.css"?`${ie.dim} Seeding wizard from survey-theme.css + defaults${ie.reset}`:`${ie.dim} Seeding wizard from SDK defaults${ie.reset}`)}function Ne(e={}){let o=e.projectRoot??process.env.INIT_CWD??process.cwd(),t=e.surveyTypes??je(Q),{config:n}=re({projectRoot:o,surveyTypes:t,instanceId:e.instanceId}),i=V.join(o,"survey-ui-config.json");return W.writeFileSync(i,JSON.stringify(n,null,2),"utf8"),i}var ie,Jo,Ho,pe=B(()=>{"use strict";U();Ge();$e();be();ro();ie=c,Jo=512e3,Ho={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml"}});import*as ae from"fs";import*as le from"path";function yo(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function wo(e,o){return JSON.stringify(e)===JSON.stringify(o)}function ce(e){return typeof e=="string"&&e.startsWith("data:")&&e.length>80?`${e.slice(0,48)}\u2026 (${e.length} chars)`:e}function So(e,o,t,n){if(wo(e,o)){n.unchangedCount+=1;return}if(e===void 0&&o!==void 0){n.added.push({path:t,before:void 0,after:ce(o)});return}if(e!==void 0&&o===void 0){n.removed.push({path:t,before:ce(e),after:void 0});return}if(Array.isArray(e)&&Array.isArray(o)){wo(e,o)?n.unchangedCount+=1:n.changed.push({path:t,before:ce(e),after:ce(o)});return}if(yo(e)&&yo(o)){let i=new Set([...Object.keys(e),...Object.keys(o)]);for(let s of i){if(ct.has(s)&&t==="")continue;let r=t?`${t}.${s}`:s;So(e[s],o[s],r,n)}return}n.changed.push({path:t,before:ce(e),after:ce(o)})}function Me(e,o){let t={changed:[],added:[],removed:[],unchangedCount:0};return So(e,o,"",t),t}function ke(e){let o=["# UI Config Diff (seed \u2192 final)","",`**Changed:** ${e.changed.length} \xB7 **Added:** ${e.added.length} \xB7 **Removed:** ${e.removed.length}`,"","> Review only \u2014 run `npx cfm-sdk confirm-ui-config` to apply final config to the project.",""],t=(n,i)=>{if(i.length){o.push(`## ${n}`,"");for(let s of i)o.push(`### \`${s.path}\``),o.push(`- **Before:** \`${JSON.stringify(s.before)}\``),o.push(`- **After:** \`${JSON.stringify(s.after)}\``),o.push("")}};return t("Changed",e.changed),t("Added",e.added),t("Removed",e.removed),!e.changed.length&&!e.added.length&&!e.removed.length&&o.push("_No differences \u2014 final config matches seed._",""),o.join(`
3
- `)}function K(e){return{seedPath:le.join(e,"survey-ui-config.seed.json"),finalPath:le.join(e,"survey-ui-config.final.json"),diffJsonPath:le.join(e,"survey-ui-config.diff.json"),diffMdPath:le.join(e,"survey-ui-config.diff.md"),activeConfigPath:le.join(e,"survey-ui-config.json")}}function Pe(e,o,t){let n=K(e),i=Me(o,t);return ae.writeFileSync(n.seedPath,JSON.stringify(o,null,2),"utf8"),ae.writeFileSync(n.finalPath,JSON.stringify(t,null,2),"utf8"),ae.writeFileSync(n.diffJsonPath,JSON.stringify(i,null,2),"utf8"),ae.writeFileSync(n.diffMdPath,ke(i),"utf8"),ae.writeFileSync(n.activeConfigPath,JSON.stringify(o,null,2),"utf8"),i}var ct,Ee=B(()=>{"use strict";ct=new Set(["configuredAt","instanceId"])});import*as Y from"fs";import*as Co from"http";import*as $o from"https";import*as Ue from"path";function ve(e){if(!e.config)return null;let o=JSON.parse(JSON.stringify(e.config)),n=o.global?.logo;return e.logoUrl&&n&&(n.url=e.logoUrl),o}function bo(e){return new Promise((o,t)=>{let n=new URL(e);(n.protocol==="https:"?$o:Co).get(n,s=>{if((s.statusCode??500)>=400){t(new Error(`Logo download failed HTTP ${s.statusCode}`));return}let r=[];s.on("data",a=>r.push(a)),s.on("end",()=>o(Buffer.concat(r)))}).on("error",t)})}async function at(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?$o:Co).request(i,{method:"GET",headers:o.headers??{}},a=>{let l="";a.on("data",y=>l+=y),a.on("end",()=>{if((a.statusCode??500)>=400){n(new Error(`HTTP ${a.statusCode}: ${l}`));return}try{t(JSON.parse(l))}catch{n(new Error(`Invalid JSON: ${l.slice(0,200)}`))}})});r.on("error",n),r.end()})}async function Z(e){let{projectRoot:o,fileName:t,logoUrl:n,jwt:i,apiBase:s,surveyId:r}=e,a=Ue.join(o,"public");Y.existsSync(a)||Y.mkdirSync(a,{recursive:!0});let l=Ue.join(a,t);if(n){let y=await bo(n);return Y.writeFileSync(l,y),l}if(i&&s&&r){let y=await at(`${s.replace(/\/$/,"")}/wizard/logo/${encodeURIComponent(r)}/${encodeURIComponent(t)}`,{headers:{Authorization:`Bearer ${i}`}}),m=await bo(y.downloadUrl);return Y.writeFileSync(l,m),l}throw new Error("Logo download requires logoUrl from wizard poll or CFM_INSTANCE_ID + CFM_DEPLOY_API_BASE")}var Re=B(()=>{"use strict"});var Eo={};Ie(Eo,{runConfirmUiConfig:()=>pt});import*as J from"fs";function ut(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function pt(e={}){let o=process.env.INIT_CWD??process.cwd(),t=K(o);if(!J.existsSync(t.finalPath))throw new Error(`Missing ${t.finalPath}. Run customize-ui with --review and complete the wizard first.`);let n=JSON.parse(J.readFileSync(J.existsSync(t.seedPath)?t.seedPath:t.activeConfigPath,"utf8")),i=JSON.parse(J.readFileSync(t.finalPath,"utf8")),s=Me(n,i);if(console.log(`
4
- ${z.bold}${z.cyan}\u{1F4CB} UI config review${z.reset}
5
- `),console.log(ke(s)),e.diffOnly){J.writeFileSync(t.diffJsonPath,JSON.stringify(s,null,2),"utf8"),J.writeFileSync(t.diffMdPath,ke(s),"utf8"),console.log(`${z.dim} Updated ${t.diffMdPath}${z.reset}`);return}J.writeFileSync(t.activeConfigPath,JSON.stringify(i,null,2),"utf8"),console.log(`${z.green}\u2705 Applied final config \u2192 ${t.activeConfigPath}${z.reset}`);let r=i.global?.logo;if(!r?.fileName)return;let a=process.env.CFM_INSTANCE_ID,l=(process.env.CFM_DEPLOY_API_BASE??"").replace(/\/$/,""),y=a?ut(a):null;try{await Z({projectRoot:o,fileName:r.fileName,logoUrl:r.url,jwt:a??void 0,apiBase:l||void 0,surveyId:y??void 0}),console.log(`${z.green} Logo saved to public/${r.fileName}${z.reset}`),r.url&&console.log(`${z.dim} Public logo URL: ${r.url}${z.reset}`)}catch(m){console.log(`${z.yellow} Logo not downloaded \u2014 ${m instanceof Error?m.message:String(m)}${z.reset}`)}}var z,vo=B(()=>{"use strict";U();Ee();Re();z=c});var Ro={};Ie(Ro,{runFetchUiConfig:()=>St});import*as ye from"fs";import*as mt from"http";import*as ht from"https";async function yt(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?ht:mt).request(i,{method:"GET",headers:o.headers??{}},a=>{let l="";a.on("data",y=>l+=y),a.on("end",()=>{if((a.statusCode??500)>=400){n(new Error(`HTTP ${a.statusCode}: ${l}`));return}try{t(JSON.parse(l))}catch{n(new Error(`Invalid JSON: ${l.slice(0,200)}`))}})});r.on("error",n),r.end()})}function wt(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function St(e={}){let o=process.env.CFM_INSTANCE_ID,t=(process.env.CFM_DEPLOY_API_BASE??"").replace(/\/$/,""),n=e.sessionId??process.env.CFM_WIZARD_SESSION_ID;if(!o)throw new Error("CFM_INSTANCE_ID (JWT) is required");if(!t)throw new Error("CFM_DEPLOY_API_BASE is required");if(!n)throw new Error("CFM_WIZARD_SESSION_ID or --session= is required");let i=wt(o);if(!i)throw new Error("Could not parse surveyId from CFM_INSTANCE_ID JWT");let s=process.env.INIT_CWD??process.cwd(),r=K(s),a=ye.existsSync(r.seedPath)?r.seedPath:r.activeConfigPath;if(!ye.existsSync(a))throw new Error(`Missing seed config at ${a}. Run customize-ui --review first.`);let l=await yt(`${t}/wizard/config/${encodeURIComponent(i)}?sessionId=${encodeURIComponent(n)}`,{headers:{Authorization:`Bearer ${o}`}});if(l.status!=="ready"||!l.config)throw new Error(`Wizard not complete yet (status: ${l.status})`);let y=ve(l)??l.config,m=JSON.parse(ye.readFileSync(a,"utf8")),C=Pe(s,m,y),S=y.global?.logo;if(S?.fileName)try{await Z({projectRoot:s,fileName:S.fileName,logoUrl:l.logoUrl,jwt:o,apiBase:t,surveyId:i}),console.log(`${L.green} Logo saved to public/${S.fileName}${L.reset}`)}catch(E){console.warn(`${L.yellow} Logo download failed: ${E}${L.reset}`)}console.log(`
6
- ${L.green}\u2705 Fetched final config (review mode)${L.reset}`),console.log(`${L.green} Final: ${r.finalPath}${L.reset}`),console.log(`${L.green} Diff: ${r.diffMdPath}${L.reset}`),console.log(`${L.yellow} ${C.changed.length} changed, ${C.added.length} added, ${C.removed.length} removed${L.reset}`),console.log(`${L.dim} Apply when ready: npx cfm-sdk confirm-ui-config${L.reset}`)}var L,Io=B(()=>{"use strict";U();Ee();Re();L=c});U();U();import{execSync as Be,spawn as Fo}from"child_process";function oe(e){try{let o=process.platform==="win32"?`where ${e}`:`command -v ${e}`;return Be(o,{stdio:"ignore"}),!0}catch{return!1}}var No={stdio:"inherit",shell:process.platform==="win32"?"cmd.exe":"/bin/sh"};function de(e,o){try{let t=`${e} ${o.join(" ")}`;return Be(t,No),!0}catch{return!1}}function Se(e,o){return new Promise(t=>{Fo(e,o,{stdio:"inherit",shell:!0}).on("close",i=>{t(i)})})}import Ao from"readline/promises";import{stdin as _o,stdout as Do}from"process";async function te(e){let o=Ao.createInterface({input:_o,output:Do});try{return(await o.question(e)).trim()}finally{o.close()}}async function We(){let e=parseInt(process.version.slice(1).split(".")[0],10);if(console.log(`${c.dim}Step 1/4: Checking Node.js version (current: ${process.version})...${c.reset}`),e<18){console.log(`\u26A0\uFE0F ${c.yellow}Outdated Node.js version detected. v18.0.0 or higher is required.${c.reset}`),console.log(`${c.dim}Note: If you already have a higher version installed via nvm, please run 'nvm use <version>' first.${c.reset}
7
- `);let o=await te("Would you like to install/upgrade Node.js v18+ automatically? (y/N): ");o.toLowerCase()==="y"||o.toLowerCase()==="yes"||(console.log(`
8
- \u274C ${c.red}Aborted. Please manually upgrade Node.js to v18+ and try again.${c.reset}
9
- `),process.exit(1));let n=process.platform==="win32",i=process.platform==="darwin";n?oe("winget")?(console.log(`
10
- \u{1F4E6} ${c.green}winget package manager found! Installing Node.js v18+ in background...${c.reset}`),de("winget",["upgrade","OpenJS.NodeJS","--silent","--accept-package-agreements","--accept-source-agreements"])?(console.log(`
11
- \u2714 ${c.green}Node.js installation triggered successfully. Please restart your terminal/command-prompt for changes to take effect.${c.reset}
2
+ var st=Object.defineProperty;var Pe=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(o,t)=>(typeof require<"u"?require:o)[t]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var z=(e,o)=>()=>(e&&(o=e(e=0)),o);var Ie=(e,o)=>{for(var t in o)st(e,t,{get:o[t],enumerable:!0})};var a,q=z(()=>{"use strict";a={reset:"\x1B[0m",bold:"\x1B[1m",green:"\x1B[32m",red:"\x1B[31m",cyan:"\x1B[36m",yellow:"\x1B[33m",dim:"\x1B[2m"}});var J,Se=z(()=>{"use strict";J=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"]});function gt(e){let o={};for(let t of e)go[t]&&(o[t]={...go[t]});return o}function pt(e=[],o){return{version:"1.0",instanceId:o,surveyTypes:e,global:{surveyTitle:"Customer Feedback Survey",companyName:"Sprinklr",browserTabTitle:"Customer Feedback Survey",thankYouMessage:"Thank you for your valuable feedback!",logo:{fileName:null,url:null},header:{height:120,logoBoxWidth:120,logoBoxHeight:120,logoPadding:10,logoPlacement:"left",showCompanyName:!0,companyNamePlacement:"left",companyNameFontSize:18,companyNameFontWeight:600,companyNameColor:"#1A1F36",backgroundColor:"#FFFFFF",shadowEnabled:!0,borderBottomColor:"#E5E7EB",contentPaddingX:40},footer:{backgroundColor:"#262626",textColor:"#9CA3AF",linkColor:"#9CA3AF",linkHoverColor:"#FFFFFF",showLogo:!0,logoWidth:120,logoHeight:32,logoPlacement:"left",copyrightText:"\xA9 Company Name",layout:"row",paddingY:24,paddingX:40,links:[]},theme:{pageBackground:"#FFFFFF",cardBackground:"#FFFFFF",cardBorderColor:"#E5E7EB",cardPadding:24,cardShadowEnabled:!0,selectedBackground:"#E8F5FD",zebraRowColor:"rgba(249,250,251,0.8)",rowBandColor:"#F3F4F6",validationBorder:"#333333",validationBackground:"#D9D9D9",tooltipBackground:"#1F2937",progressTrackHeight:12,progressTrackColor:"#E5E7EB",progressFillColor:"#1A1F36",stickyChromePaddingTop:16,stickyChromePaddingBottom:20,languageSelectorBackground:"#FFFFFF",languageSelectorTextColor:"#2563EB",languageSelectorBorderColor:"#2563EB"},layout:{showHeader:!0,showFooter:!0,showProgressBar:!0,showLanguageSwitcher:!1,showNextButton:!0,showBackButton:!0,showQuestionNumbers:!0,showRequiredAsterisk:!0,width:"standard",borderStyle:"rounded",fontStyle:"modern"},buttons:{next:"Next",back:"Back",submit:"Submit"},colorScheme:{...M},colorSource:"auto",typography:{fontFamily:"Inter, sans-serif",headingWeight:700},motion:{enabled:!1,durationMs:200}},questionTypes:gt(e),placeholders:{firstName:"Alex",lastName:"Customer",email:"alex@example.com"},customFields:{},debug:{enabled:!1,sampleAnswers:{}},deploy:{target:"aws",autoDeploy:!1}}}function Z(e,o){return{...e,...o??{}}}function je(e){let o=(e.surveyTypes??[]).filter(c=>J.includes(c)),t=[...new Set([...o,...J])],n=pt(t,e.instanceId),r=e.global??{},i=n.global,s={...n.questionTypes};if(e.questionTypes)for(let[c,d]of Object.entries(e.questionTypes))s[c]={...s[c]??{},...d};return{...n,...e,configuredAt:void 0,surveyTypes:o.length?o:n.surveyTypes,global:{...i,...r,header:Z(i.header,r.header),footer:Z(i.footer,r.footer),theme:Z(i.theme,r.theme),layout:Z(i.layout,r.layout),buttons:Z(i.buttons,r.buttons),logo:Z(i.logo,r.logo),colorScheme:Z(i.colorScheme,r.colorScheme),typography:Z(i.typography,r.typography),motion:Z(i.motion,r.motion)},questionTypes:s,placeholders:{...n.placeholders,...e.placeholders??{}},customFields:{...n.customFields,...e.customFields??{}},debug:{enabled:e.debug?.enabled??n.debug?.enabled??!1,sampleAnswers:e.debug?.sampleAnswers??n.debug?.sampleAnswers},deploy:{...n.deploy,...e.deploy??{}}}}var M,go,He=z(()=>{"use strict";Se();M={primary:"#1A1F36",secondary:"#E8F5FD",accent:"#00B5AD",background:"#FFFFFF",text:"#1A1F36",buttonText:"#FFFFFF"},go={MCQ:{cardStyle:"outlined",selectedAccent:M.accent,optionGap:8,borderRadius:8,cardPadding:12,selectedBackground:M.secondary,hoverBorderColor:M.accent},TEXTFIELD:{inputRadius:8,focusRing:M.accent,borderColor:"#E5E7EB",inputPadding:12,inputHeight:44,placeholderColor:"#9CA3AF"},NPS_SCALE:{buttonStyle:"standard",selectedFill:M.secondary,labelColor:M.text,trackBarColor:"#F2F2F2",trackHighlightColor:"#FBE8F3",cellSize:40,cellGap:4},CFM_MATRIX:{rowLabelWidth:180,cellSelectedColor:M.accent,headerStyle:"bold",bipolarColumnWidthPercent:25,carouselDotColor:"#2563EB",cellPadding:8},CSAT_MATRIX:{rowLabelWidth:180,cellSelectedColor:M.accent,headerStyle:"bold",bipolarColumnWidthPercent:25,carouselDotColor:M.primary,cellPadding:8,accentColor:M.accent,emojiSize:24,unselectedOpacity:.5,selectedRingColor:M.accent,cellSize:40,tooltipBg:"#1F2937"},RATING_MATRIX:{starColor:"#F59E0B",badgeColor:M.primary,rowLabelWidth:180,unselectedStarOpacity:.5},SLIDER_MATRIX:{trackColor:M.accent,thumbColor:M.primary,tickColor:"#9CA3AF",rowLabelWidth:180,rowBandColor:"#F3F4F6",tickBadgeSize:28},FILE_UPLOAD:{dropzoneStyle:"dashed",accentColor:M.accent,dropzonePadding:24},TEXT_AND_MEDIA:{mediaMaxWidth:100,mediaRadius:8,captionColor:"#6B7280",captionSize:14},HEATMAP:{pinColor:M.accent,pinSize:12,pinBorderColor:"#FFFFFF",overlayOpacity:.3},RANK_ORDER:{drag:{itemBg:"#F9FAFB",dragHandleColor:"#9CA3AF",rankBadgeColor:M.primary,itemPadding:12,itemGap:8},dropdown:{itemBg:"#F9FAFB",selectBorderColor:"#E5E7EB",rankBadgeColor:M.primary,itemPadding:12,itemGap:8}}}});import*as ve from"fs";import*as Te from"path";function bo(e){let o={},t=/--cfm-[\w-]+\s*:\s*([^;]+);/g,n;for(;(n=t.exec(e))!==null;){let r=n[0].split(":")[0].trim(),i=n[1].trim();o[r]=i}return o}function k(e){if(!e)return;let o=parseFloat(e.replace(/px$/,""));return Number.isFinite(o)?o:void 0}function wo(e){if(!e)return;let o=parseFloat(e.replace(/%$/,""));return Number.isFinite(o)?o:void 0}function Ce(e){if(!e)return;let o=parseFloat(e);return Number.isFinite(o)?o:void 0}function So(e){let o={global:{},questionTypes:{}},t=o.global,n={},r={},i={},s={},c={},d={},g={},w=o.questionTypes;if(e["--cfm-primary"]&&(n.primary=e["--cfm-primary"]),e["--cfm-secondary"]&&(n.secondary=e["--cfm-secondary"]),e["--cfm-accent"]&&(n.accent=e["--cfm-accent"]),e["--cfm-background"]&&(n.background=e["--cfm-background"]),e["--cfm-text"]&&(n.text=e["--cfm-text"]),e["--cfm-button-text"]&&(n.buttonText=e["--cfm-button-text"]),e["--cfm-max-width"]&&po[e["--cfm-max-width"]]&&(c.width=po[e["--cfm-max-width"]]),e["--cfm-border-radius"]&&yo[e["--cfm-border-radius"]]&&(c.borderStyle=yo[e["--cfm-border-radius"]]),e["--cfm-font-family"]&&(d.fontFamily=e["--cfm-font-family"],ho[e["--cfm-font-family"]]&&(c.fontStyle=ho[e["--cfm-font-family"]])),e["--cfm-heading-weight"]&&(d.headingWeight=Ce(e["--cfm-heading-weight"])),e["--cfm-motion-duration"]){let O=k(e["--cfm-motion-duration"]);O!==void 0&&(g.durationMs=O,g.enabled=O>0)}e["--cfm-header-height"]&&(r.height=k(e["--cfm-header-height"])),e["--cfm-header-logo-width"]&&(r.logoBoxWidth=k(e["--cfm-header-logo-width"])),e["--cfm-header-logo-height"]&&(r.logoBoxHeight=k(e["--cfm-header-logo-height"])),e["--cfm-header-logo-padding"]&&(r.logoPadding=k(e["--cfm-header-logo-padding"])),e["--cfm-header-bg"]&&(r.backgroundColor=e["--cfm-header-bg"]),e["--cfm-header-company-color"]&&(r.companyNameColor=e["--cfm-header-company-color"]),e["--cfm-header-company-size"]&&(r.companyNameFontSize=k(e["--cfm-header-company-size"])),e["--cfm-header-company-weight"]&&(r.companyNameFontWeight=Ce(e["--cfm-header-company-weight"])),e["--cfm-header-border"]&&(r.borderBottomColor=e["--cfm-header-border"]),e["--cfm-header-padding-x"]&&(r.contentPaddingX=k(e["--cfm-header-padding-x"])),e["--cfm-footer-bg"]&&(i.backgroundColor=e["--cfm-footer-bg"]),e["--cfm-footer-text"]&&(i.textColor=e["--cfm-footer-text"]),e["--cfm-footer-link"]&&(i.linkColor=e["--cfm-footer-link"]),e["--cfm-footer-link-hover"]&&(i.linkHoverColor=e["--cfm-footer-link-hover"]),e["--cfm-footer-logo-width"]&&(i.logoWidth=k(e["--cfm-footer-logo-width"])),e["--cfm-footer-logo-height"]&&(i.logoHeight=k(e["--cfm-footer-logo-height"])),e["--cfm-footer-padding-y"]&&(i.paddingY=k(e["--cfm-footer-padding-y"])),e["--cfm-footer-padding-x"]&&(i.paddingX=k(e["--cfm-footer-padding-x"])),e["--cfm-background"]&&(s.pageBackground=e["--cfm-background"]),e["--cfm-card-bg"]&&(s.cardBackground=e["--cfm-card-bg"]),e["--cfm-card-border-color"]&&(s.cardBorderColor=e["--cfm-card-border-color"]),e["--cfm-card-padding"]&&(s.cardPadding=k(e["--cfm-card-padding"])),e["--cfm-card-shadow"]&&(s.cardShadowEnabled=e["--cfm-card-shadow"]!=="none"),e["--cfm-selected-bg"]&&(s.selectedBackground=e["--cfm-selected-bg"]),e["--cfm-zebra-row"]&&(s.zebraRowColor=e["--cfm-zebra-row"]),e["--cfm-row-band"]&&(s.rowBandColor=e["--cfm-row-band"]),e["--cfm-validation-border"]&&(s.validationBorder=e["--cfm-validation-border"]),e["--cfm-validation-bg"]&&(s.validationBackground=e["--cfm-validation-bg"]),e["--cfm-tooltip-bg"]&&(s.tooltipBackground=e["--cfm-tooltip-bg"]),e["--cfm-progress-height"]&&(s.progressTrackHeight=k(e["--cfm-progress-height"])),e["--cfm-progress-track"]&&(s.progressTrackColor=e["--cfm-progress-track"]),e["--cfm-progress-fill"]&&(s.progressFillColor=e["--cfm-progress-fill"]),e["--cfm-sticky-pt"]&&(s.stickyChromePaddingTop=k(e["--cfm-sticky-pt"])),e["--cfm-sticky-pb"]&&(s.stickyChromePaddingBottom=k(e["--cfm-sticky-pb"]));let S={};e["--cfm-mcq-selected-accent"]&&(S.selectedAccent=e["--cfm-mcq-selected-accent"]),e["--cfm-mcq-border-radius"]&&(S.borderRadius=k(e["--cfm-mcq-border-radius"])),e["--cfm-mcq-option-gap"]&&(S.optionGap=k(e["--cfm-mcq-option-gap"])),e["--cfm-mcq-card-padding"]&&(S.cardPadding=k(e["--cfm-mcq-card-padding"])),e["--cfm-mcq-selected-bg"]&&(S.selectedBackground=e["--cfm-mcq-selected-bg"]),e["--cfm-mcq-hover-border"]&&(S.hoverBorderColor=e["--cfm-mcq-hover-border"]),Object.keys(S).length&&(w.MCQ=S);let x={};e["--cfm-input-radius"]&&(x.inputRadius=k(e["--cfm-input-radius"])),e["--cfm-input-focus-ring"]&&(x.focusRing=e["--cfm-input-focus-ring"]),e["--cfm-input-border"]&&(x.borderColor=e["--cfm-input-border"]),e["--cfm-input-padding"]&&(x.inputPadding=k(e["--cfm-input-padding"])),e["--cfm-input-height"]&&(x.inputHeight=k(e["--cfm-input-height"])),e["--cfm-input-placeholder"]&&(x.placeholderColor=e["--cfm-input-placeholder"]),Object.keys(x).length&&(w.TEXTFIELD=x);let E={};e["--cfm-nps-selected-fill"]&&(E.selectedFill=e["--cfm-nps-selected-fill"]),e["--cfm-nps-label-color"]&&(E.labelColor=e["--cfm-nps-label-color"]),e["--cfm-nps-track-bar"]&&(E.trackBarColor=e["--cfm-nps-track-bar"]),e["--cfm-nps-track-highlight"]&&(E.trackHighlightColor=e["--cfm-nps-track-highlight"]),e["--cfm-nps-cell-size"]&&(E.cellSize=k(e["--cfm-nps-cell-size"])),e["--cfm-nps-cell-gap"]&&(E.cellGap=k(e["--cfm-nps-cell-gap"])),Object.keys(E).length&&(w.NPS_SCALE=E);let A=k(e["--cfm-matrix-row-width"]),R={};A!==void 0&&(R.rowLabelWidth=A),e["--cfm-matrix-selected"]&&(R.cellSelectedColor=e["--cfm-matrix-selected"]),e["--cfm-matrix-bipolar-width"]&&(R.bipolarColumnWidthPercent=wo(e["--cfm-matrix-bipolar-width"])),e["--cfm-matrix-carousel-dot"]&&(R.carouselDotColor=e["--cfm-matrix-carousel-dot"]),e["--cfm-matrix-cell-padding"]&&(R.cellPadding=k(e["--cfm-matrix-cell-padding"])),Object.keys(R).length&&(w.CFM_MATRIX=R);let f={...R};e["--cfm-csat-accent"]&&(f.accentColor=e["--cfm-csat-accent"]),e["--cfm-csat-emoji-size"]&&(f.emojiSize=k(e["--cfm-csat-emoji-size"])),e["--cfm-csat-unselected-opacity"]&&(f.unselectedOpacity=Ce(e["--cfm-csat-unselected-opacity"])),e["--cfm-csat-ring-color"]&&(f.selectedRingColor=e["--cfm-csat-ring-color"]),e["--cfm-csat-cell-size"]&&(f.cellSize=k(e["--cfm-csat-cell-size"])),e["--cfm-csat-tooltip-bg"]&&(f.tooltipBg=e["--cfm-csat-tooltip-bg"]),(Object.keys(f).length>Object.keys(R).length||e["--cfm-csat-accent"])&&(w.CSAT_MATRIX=f);let y={};e["--cfm-star-color"]&&(y.starColor=e["--cfm-star-color"]),e["--cfm-badge-color"]&&(y.badgeColor=e["--cfm-badge-color"]),A!==void 0&&(y.rowLabelWidth=A),e["--cfm-star-unselected-opacity"]&&(y.unselectedStarOpacity=Ce(e["--cfm-star-unselected-opacity"])),Object.keys(y).length&&(w.RATING_MATRIX=y);let T={};e["--cfm-slider-track"]&&(T.trackColor=e["--cfm-slider-track"]),e["--cfm-slider-thumb"]&&(T.thumbColor=e["--cfm-slider-thumb"]),e["--cfm-slider-tick"]&&(T.tickColor=e["--cfm-slider-tick"]),A!==void 0&&(T.rowLabelWidth=A),e["--cfm-slider-row-band"]&&(T.rowBandColor=e["--cfm-slider-row-band"]),e["--cfm-slider-tick-size"]&&(T.tickBadgeSize=k(e["--cfm-slider-tick-size"])),Object.keys(T).length&&(w.SLIDER_MATRIX=T);let $={};e["--cfm-upload-accent"]&&($.accentColor=e["--cfm-upload-accent"]),e["--cfm-upload-padding"]&&($.dropzonePadding=k(e["--cfm-upload-padding"])),Object.keys($).length&&(w.FILE_UPLOAD=$);let h={};e["--cfm-media-max-width"]&&(h.mediaMaxWidth=wo(e["--cfm-media-max-width"])),e["--cfm-media-radius"]&&(h.mediaRadius=k(e["--cfm-media-radius"])),e["--cfm-media-caption-color"]&&(h.captionColor=e["--cfm-media-caption-color"]),e["--cfm-media-caption-size"]&&(h.captionSize=k(e["--cfm-media-caption-size"])),Object.keys(h).length&&(w.TEXT_AND_MEDIA=h);let F={};e["--cfm-heatmap-pin"]&&(F.pinColor=e["--cfm-heatmap-pin"]),e["--cfm-heatmap-pin-size"]&&(F.pinSize=k(e["--cfm-heatmap-pin-size"])),e["--cfm-heatmap-pin-border"]&&(F.pinBorderColor=e["--cfm-heatmap-pin-border"]),e["--cfm-heatmap-overlay-opacity"]&&(F.overlayOpacity=Ce(e["--cfm-heatmap-overlay-opacity"])),Object.keys(F).length&&(w.HEATMAP=F);let C={};return e["--cfm-rank-item-bg"]&&(C.itemBg=e["--cfm-rank-item-bg"]),e["--cfm-rank-badge"]&&(C.rankBadgeColor=e["--cfm-rank-badge"]),e["--cfm-rank-handle"]&&(C.dragHandleColor=e["--cfm-rank-handle"]),e["--cfm-rank-item-padding"]&&(C.itemPadding=k(e["--cfm-rank-item-padding"])),e["--cfm-rank-item-gap"]&&(C.itemGap=k(e["--cfm-rank-item-gap"])),Object.keys(C).length&&(w.RANK_ORDER=C),Object.keys(n).length&&(t.colorScheme=n),Object.keys(r).length&&(t.header=r),Object.keys(i).length&&(t.footer=i),Object.keys(s).length&&(t.theme=s),Object.keys(c).length&&(t.layout=c),Object.keys(d).length&&(t.typography=d),Object.keys(g).length&&(t.motion=g),o}function fe(e){let o=[Te.join(e,"src","styles","survey-theme.css"),Te.join(e,"src","app","survey-theme.css"),Te.join(e,"src","styles","globals.css"),Te.join(e,"src","app","globals.css")];for(let t of o)if(ve.existsSync(t)&&ve.readFileSync(t,"utf8").includes("--cfm-"))return t;return null}var po,yo,ho,_e=z(()=>{"use strict";po={"36rem":"narrow","48rem":"standard","64rem":"wide"},yo={"0px":"sharp","12px":"rounded","9999px":"pill"},ho={"system-ui, sans-serif":"system","Inter, sans-serif":"modern","Georgia, serif":"serif"}});import*as De from"fs";import*as Co from"path";function ht(e){for(let o of yt){let t=Co.join(e,o);if(De.existsSync(t))return t}return null}function wt(e){let o=e.trim();if(!o||o.startsWith("http")||o.startsWith("data:"))return null;let t=o.split("?")[0];return t.startsWith("/")?t.slice(1):t}function To(e){let o=ht(e);if(!o)return null;let t=De.readFileSync(o,"utf8"),n=t.match(/data-cfm-logo[\s\S]*?src=["']([^"']+)["']/i)??t.match(/src=["']([^"']+)["'][\s\S]*?data-cfm-logo/i);if(n){let s=wt(n[1]);if(s)return{mode:"image",publicPath:s,fileName:s}}let r=t.match(/data-cfm-logo-text[^>]*>([^<]+)</i);if(r)return{mode:"text",label:r[1].trim()};let i=t.match(/data-cfm-company[^>]*>([^<]+)</i);return i&&!n?{mode:"text",label:i[1].trim()}:null}var yt,xo=z(()=>{"use strict";yt=["src/components/Header.tsx","components/Header.tsx","app/components/Header.tsx"]});var Eo={};Ie(Eo,{logSeedSource:()=>Je,resolveInitialConfig:()=>me,writeResolvedUiConfig:()=>Ge});import*as G from"fs";import*as ee from"path";function Ve(e){return e.filter(o=>J.includes(o))}function $o(e){try{let o=JSON.parse(G.readFileSync(e,"utf8"));return o.version!=="1.0"?null:(delete o.configuredAt,o)}catch{return null}}function Ct(e){let o={global:{}};if(!G.existsSync(e))return o;let t=G.readFileSync(e,"utf8"),n=new Set;for(let i of J)t.includes(i)&&n.add(i);n.size&&(o.surveyTypes=[...n]);let r=t.match(/\*\*Branding source:\*\*\s*(.+)/i);if(r){let i=r[1].trim(),s=i.match(/company[:\s]+([^,;]+)/i),c=i.match(/title[:\s]+([^,;]+)/i);if(s&&(o.global.companyName=s[1].trim()),c){let d=c[1].trim();o.global.surveyTitle=d,o.global.browserTabTitle=d}}return o}function Ao(e,o){let t=ee.join(e,o);if(!G.existsSync(t))return null;let n=G.readFileSync(t);if(n.length>bt)return{fileName:o,dataUrl:""};let r=ee.extname(o).toLowerCase(),i=St[r]??"application/octet-stream";return{fileName:o,dataUrl:`data:${i};base64,${n.toString("base64")}`}}function Ro(e,o){if(!o)return null;if(o.url&&typeof o.url=="string")return{fileName:o.fileName??null,url:o.url};if(o.fileName){let t=Ao(e,o.fileName);if(t)return{fileName:t.fileName,url:t.dataUrl||null}}return o.fileName===null&&o.url===null?{fileName:null,url:null}:null}function ko(e,o){let t=e.global??{},n=o.global??{},r=e.questionTypes??{},i=o.questionTypes??{},s={...r};for(let[c,d]of Object.entries(i))s[c]={...s[c]??{},...d};return{...e,...o,surveyTypes:o.surveyTypes??e.surveyTypes,global:{...t,...n,header:{...t.header,...n.header},footer:{...t.footer,...n.footer},theme:{...t.theme,...n.theme},layout:{...t.layout,...n.layout},buttons:{...t.buttons,...n.buttons},logo:{...t.logo,...n.logo},colorScheme:{...t.colorScheme,...n.colorScheme},typography:{...t.typography,...n.typography},motion:{...t.motion,...n.motion}},questionTypes:s,placeholders:{...e.placeholders,...o.placeholders},customFields:{...e.customFields,...o.customFields},deploy:{...e.deploy,...o.deploy}}}function me(e){let o=e.projectRoot??process.env.INIT_CWD??process.cwd(),t=ee.join(o,"survey-ui-config.json"),n=ee.join(o,"implementation_plan.md"),r=ee.join(o,"public"),i=Ve(e.surveyTypes),s={},c="defaults",d=fe(o);if(d){let C=G.readFileSync(d,"utf8"),O=bo(C);Object.keys(O).length>0&&(s=So(O),c="survey-theme.css")}let g=Ct(n);s=ko(s,g);let w=$o(t);w&&(s=ko(s,w),c="survey-ui-config.json");let S=ee.join(o,"survey-ui-config.final.json"),x=$o(S),E=!!w?.configuredAt,A=!!x?.configuredAt;if(x&&A&&!E){let C=Ro(r,x.global?.logo);C&&(s.global={...s.global??{},logo:{fileName:C.fileName,url:C.url}})}let R=Ro(r,s.global?.logo),f=To(o),y=!!w?.configuredAt,T=R?.fileName!=null&&/^logo_\d+_/i.test(R.fileName),$=f?.mode==="image"?f.fileName:null,h=!y&&T&&$!=null&&R?.fileName!==$;if(R&&!h)s.global={...s.global??{},logo:{fileName:R.fileName,url:R.url}};else if(f?.mode==="image"){let C=Ao(r,f.fileName);s.global={...s.global??{},logo:{fileName:f.fileName,url:C?.dataUrl||null}}}else f?.mode==="text"&&(s.global={...s.global??{},logo:{fileName:null,url:null},companyName:s.global?.companyName??f.label});return s.surveyTypes=Ve(s.surveyTypes??i),s.surveyTypes?.length||(s.surveyTypes=i),e.instanceId&&(s.instanceId=e.instanceId),{config:je(s),source:c}}function Je(e){console.log(e==="survey-ui-config.json"?`${ue.dim} Seeding wizard from survey-ui-config.json${ue.reset}`:e==="survey-theme.css"?`${ue.dim} Seeding wizard from survey-theme.css + defaults${ue.reset}`:`${ue.dim} Seeding wizard from SDK defaults${ue.reset}`)}function Ge(e={}){let o=e.projectRoot??process.env.INIT_CWD??process.cwd(),t=e.surveyTypes??Ve(J),{config:n}=me({projectRoot:o,surveyTypes:t,instanceId:e.instanceId}),r=ee.join(o,"survey-ui-config.json");return G.writeFileSync(r,JSON.stringify(n,null,2),"utf8"),r}var ue,bt,St,xe=z(()=>{"use strict";q();He();_e();Se();xo();ue=a,bt=512e3,St={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml"}});function W(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function b(e,o){return typeof e=="number"&&Number.isFinite(e)?e:o}function l(e,o){return typeof e=="string"&&e.length?e:o}function eo(e){return e==="left"?"1":e==="center"?"2":"3"}function Me(e){return e==="left"?"start":e==="center"?"center":"end"}function vt(e){let o=l(e.logoPlacement,"left"),t=l(e.companyNamePlacement,"left"),n={"--cfm-header-brand-gap":"16px","--cfm-header-company-margin-top":"0","--cfm-header-company-margin-left":"0","--cfm-header-company-margin-right":"0"};return o==="left"&&t==="left"?{...n,"--cfm-header-logo-col":"1","--cfm-header-logo-justify":"start","--cfm-header-company-col":"1","--cfm-header-company-justify":"start","--cfm-header-company-margin-left":"calc(var(--cfm-header-logo-width) + var(--cfm-header-brand-gap))"}:o==="right"&&t==="right"?{...n,"--cfm-header-logo-col":"3","--cfm-header-logo-justify":"end","--cfm-header-company-col":"3","--cfm-header-company-justify":"end","--cfm-header-company-margin-right":"calc(var(--cfm-header-logo-width) + var(--cfm-header-brand-gap))"}:{...n,"--cfm-header-logo-col":eo(o),"--cfm-header-logo-justify":Me(o),"--cfm-header-company-col":eo(t),"--cfm-header-company-justify":Me(t)}}function _t(e){let o=l(e.logoPlacement,"left"),t=l(e.layout,"row"),n=o==="right"?"1":"3",r=o==="right"?"start":"end";return t==="stack"?{"--cfm-footer-inner-display":"flex","--cfm-footer-inner-direction":"column","--cfm-footer-logo-col":"1","--cfm-footer-logo-justify":Me(o),"--cfm-footer-links-col":"1","--cfm-footer-links-justify":"start"}:{"--cfm-footer-inner-display":"grid","--cfm-footer-inner-direction":"row","--cfm-footer-logo-col":eo(o),"--cfm-footer-logo-justify":Me(o),"--cfm-footer-links-col":n,"--cfm-footer-links-justify":r}}function Oe(e,o){o.numberLabelMode&&(e["--cfm-number-label-mode"]=l(o.numberLabelMode,"traffic")),o.monochromeNumberColor&&(e["--cfm-number-mono-color"]=l(o.monochromeNumberColor,"#9CA3AF"));let t=o.individualNumberColors;Array.isArray(t)&&t.forEach((n,r)=>{typeof n=="string"&&(e[`--cfm-number-color-${r}`]=n)})}function Dt(e,o){o.hintLabelColor&&(e["--cfm-hint-label-color"]=l(o.hintLabelColor,"#6B7280")),o.hintLabelBgColor&&(e["--cfm-hint-label-bg"]=l(o.hintLabelBgColor,"transparent"))}function Be(e,o,t){(t==="matrix"||t==="csat")&&(o.columnLabelColor&&(e["--cfm-matrix-column-label-color"]=l(o.columnLabelColor,"#4B5563")),o.columnLabelBgColor&&(e["--cfm-matrix-column-label-bg"]=l(o.columnLabelBgColor,"transparent"))),t==="csat"&&(o.columnLabelColor&&(e["--cfm-csat-column-label-color"]=l(o.columnLabelColor,"#4B5563")),o.columnLabelBgColor&&(e["--cfm-csat-column-label-bg"]=l(o.columnLabelBgColor,"transparent"))),t==="slider"&&(o.columnLabelColor&&(e["--cfm-slider-tick-label-color"]=l(o.columnLabelColor,"#4B5563")),o.columnLabelBgColor&&(e["--cfm-slider-tick-label-bg"]=l(o.columnLabelBgColor,"transparent")))}function Lt(e,o){let t=l(o.optionStyle??o.cardStyle,"outlined");e["--cfm-mcq-border-radius"]=`${b(o.borderRadius,8)}px`,e["--cfm-mcq-option-gap"]=`${b(o.optionGap,8)}px`,e["--cfm-mcq-card-padding"]=`${b(o.optionPadding??o.cardPadding,12)}px`,e["--cfm-mcq-hover-border"]=l(o.hoverBorderColor,"#00B5AD"),e["--cfm-mcq-option-style"]=t}function Mt(e,o){e["--cfm-input-radius"]=`${b(o.inputRadius,8)}px`,e["--cfm-input-border"]=l(o.borderColor,"#E5E7EB"),e["--cfm-input-padding"]=`${b(o.inputPadding,12)}px`,e["--cfm-input-height"]=`${b(o.inputHeight,44)}px`,e["--cfm-input-placeholder"]=l(o.placeholderColor,"#9CA3AF")}function Ot(e,o){e["--cfm-nps-cell-size"]=`${b(o.cellSize,40)}px`,e["--cfm-nps-cell-gap"]=`${b(o.cellGap,4)}px`,e["--cfm-nps-button-style"]=l(o.buttonStyle,"standard"),e["--cfm-nps-selected-fill"]=l(o.selectedFill,"#E8F5FD"),e["--cfm-nps-track-bar"]=l(o.trackBarColor,"#F2F2F2"),e["--cfm-nps-track-highlight"]=l(o.trackHighlightColor,"#FBE8F3"),Dt(e,o),Oe(e,o)}function Bt(e,o){e["--cfm-matrix-row-width"]=`${b(o.rowLabelWidth,180)}px`,e["--cfm-matrix-bipolar-width"]=`${b(o.bipolarColumnWidthPercent,25)}%`,e["--cfm-matrix-cell-padding"]=`${b(o.cellPadding,8)}px`,o.carouselDotColor&&(e["--cfm-matrix-carousel-dot"]=l(o.carouselDotColor,"#2563EB")),Be(e,o,"matrix")}function Ut(e,o){e["--cfm-csat-emoji-size"]=`${b(o.emojiSize,24)}px`,e["--cfm-csat-unselected-opacity"]=String(b(o.unselectedOpacity,.5)),e["--cfm-star-unselected-opacity"]=String(b(o.unselectedStarOpacity??o.unselectedOpacity,.5)),e["--cfm-csat-cell-size"]=`${b(o.cellSize,40)}px`,e["--cfm-csat-tooltip-bg"]=l(o.tooltipBg,"#1F2937"),e["--cfm-csat-accent"]=l(o.accentColor,e["--cfm-accent"]??"#00B5AD"),e["--cfm-matrix-row-width"]=`${b(o.rowLabelWidth,180)}px`,Be(e,o,"csat"),Oe(e,o)}function zt(e,o){e["--cfm-star-color"]=l(o.starColor,"#F59E0B"),e["--cfm-badge-color"]=l(o.badgeColor,e["--cfm-primary"]??"#1A1F36"),e["--cfm-csat-emoji-size"]=`${b(o.emojiSize,24)}px`,e["--cfm-star-unselected-opacity"]=String(b(o.unselectedStarOpacity,.5)),e["--cfm-csat-unselected-opacity"]=String(b(o.unselectedStarOpacity,.5)),e["--cfm-matrix-row-width"]=`${b(o.rowLabelWidth,180)}px`,Be(e,o,"csat"),Oe(e,o)}function qt(e,o){e["--cfm-slider-track"]=l(o.trackColor,e["--cfm-accent"]??"#00B5AD"),e["--cfm-slider-thumb"]=l(o.thumbColor,e["--cfm-primary"]??"#1A1F36"),e["--cfm-slider-tick"]=l(o.tickColor,"#9CA3AF"),e["--cfm-matrix-row-width"]=`${b(o.rowLabelWidth,180)}px`,e["--cfm-slider-row-band"]=l(o.rowBandColor,e["--cfm-row-band"]??"#F3F4F6"),e["--cfm-slider-tick-size"]=`${b(o.tickBadgeSize,28)}px`,Be(e,o,"slider"),Oe(e,o)}function Wt(e,o){e["--cfm-upload-border-color"]=l(o.borderColor??o.accentColor,"#D1D5DB"),e["--cfm-upload-padding"]=`${b(o.dropzonePadding,24)}px`,e["--cfm-upload-fill"]=l(o.dropzoneFillColor,"#F9FAFB"),e["--cfm-upload-border-style"]=l(o.dropzoneStyle,"dashed")}function Xt(e,o){e["--cfm-media-max-width"]=`${b(o.mediaMaxWidth,100)}%`,e["--cfm-media-radius"]=`${b(o.mediaRadius,8)}px`,e["--cfm-media-caption-color"]=l(o.captionColor,"#6B7280"),e["--cfm-media-caption-size"]=`${b(o.captionSize,14)}px`}function Ht(e,o){e["--cfm-heatmap-pin"]=l(o.pinColor,e["--cfm-accent"]??"#00B5AD"),e["--cfm-heatmap-pin-size"]=`${b(o.pinSize,12)}px`,e["--cfm-heatmap-pin-border"]=l(o.pinBorderColor,"#FFFFFF"),e["--cfm-heatmap-overlay-opacity"]=String(b(o.overlayOpacity,0))}function Vt(e,o){let t=W(o.drag)??o,n=W(o.dropdown)??t;e["--cfm-rank-item-bg"]=l(t.itemBg,"#F9FAFB"),e["--cfm-rank-badge-bg"]=l(t.rankBadgeColor,e["--cfm-primary"]??"#1A1F36"),e["--cfm-rank-badge-text"]="#ffffff",e["--cfm-rank-badge"]=l(t.rankBadgeColor,e["--cfm-primary"]??"#1A1F36"),e["--cfm-rank-item-padding"]=`${b(t.itemPadding,12)}px`,e["--cfm-rank-item-gap"]=`${b(t.itemGap,8)}px`,e["--cfm-rank-handle"]=l(t.dragHandleColor,"#9CA3AF"),e["--cfm-rank-select-border"]=l(n.selectBorderColor,"#E5E7EB")}function Ue(e){let o=W(e.global)??{},t=W(o.colorScheme)??{},n=W(o.header)??{},r=W(o.footer)??{},i=W(o.theme)??{},s=W(o.layout)??{},c=W(o.typography)??{},d=W(o.motion)??{},g=e.questionTypes??{},w=l(s.fontStyle,"modern"),S=_o[w]??l(c.fontFamily,_o.modern),x=l(s.width,"standard"),E=l(s.borderStyle,"rounded"),A=l(i.cellSelectedColor,l(t.accent,"#00B5AD")),R=l(i.focusRingColor,l(t.accent,"#00B5AD")),f=l(i.selectedBackground,l(t.secondary,"#E8F5FD")),y={"--cfm-primary":l(t.primary,"#1A1F36"),"--cfm-secondary":l(t.secondary,"#E8F5FD"),"--cfm-accent":l(t.accent,"#00B5AD"),"--cfm-background":l(i.pageBackground??t.background,"#FFFFFF"),"--cfm-text":l(t.text,"#1A1F36"),"--cfm-button-text":l(t.buttonText,"#FFFFFF"),"--cfm-max-width":jo[x]??jo.standard,"--cfm-border-radius":vo[E]??vo.rounded,"--cfm-font-family":S,"--cfm-heading-weight":String(b(c.headingWeight,700)),"--cfm-motion-duration":`${b(d.durationMs,200)}ms`,"--cfm-header-height":`${b(n.height,120)}px`,"--cfm-header-logo-width":`${b(n.logoBoxWidth,120)}px`,"--cfm-header-logo-height":`${b(n.logoBoxHeight,120)}px`,"--cfm-header-logo-padding":`${b(n.logoPadding,10)}px`,"--cfm-header-show-company":n.showCompanyName===!1?"0":"1","--cfm-header-bg":l(n.backgroundColor,"#FFFFFF"),"--cfm-header-company-color":l(n.companyNameColor,l(t.text,"#1A1F36")),"--cfm-header-company-size":`${b(n.companyNameFontSize,18)}px`,"--cfm-header-company-weight":String(b(n.companyNameFontWeight,600)),"--cfm-header-border":l(n.borderBottomColor,"#E5E7EB"),"--cfm-header-padding-x":`${b(n.contentPaddingX,40)}px`,"--cfm-header-shadow":n.shadowEnabled===!1?"none":"0 2px 8px rgba(0,0,0,0.06)",...vt(n),"--cfm-footer-bg":l(r.backgroundColor,"#262626"),"--cfm-footer-text":l(r.textColor,"#9CA3AF"),"--cfm-footer-link":l(r.linkColor,"#9CA3AF"),"--cfm-footer-link-hover":l(r.linkHoverColor,"#FFFFFF"),"--cfm-footer-logo-width":`${b(r.logoWidth,120)}px`,"--cfm-footer-logo-height":`${b(r.logoHeight,32)}px`,"--cfm-footer-padding-y":`${b(r.paddingY,24)}px`,"--cfm-footer-padding-x":`${b(r.paddingX,40)}px`,..._t(r),"--cfm-card-bg":l(i.cardBackground,"#FFFFFF"),"--cfm-card-border-color":l(i.cardBorderColor,"#E5E7EB"),"--cfm-card-padding":`${b(i.cardPadding,24)}px`,"--cfm-card-shadow":i.cardShadowEnabled===!1?"none":"0 1px 3px rgba(0,0,0,0.1)","--cfm-selected-bg":f,"--cfm-mcq-selected-accent":R,"--cfm-mcq-selected-bg":f,"--cfm-matrix-selected":A,"--cfm-csat-ring-color":A,"--cfm-input-focus-ring":R,"--cfm-zebra-row":l(i.zebraRowColor,"rgba(249,250,251,0.8)"),"--cfm-row-band":l(i.rowBandColor,"#F3F4F6"),"--cfm-validation-border":l(i.validationBorder,"#333333"),"--cfm-validation-bg":l(i.validationBackground,"#D9D9D9"),"--cfm-tooltip-bg":l(i.tooltipBackground,"#1F2937"),"--cfm-progress-height":`${b(i.progressTrackHeight,12)}px`,"--cfm-progress-track":l(i.progressTrackColor,"#E5E7EB"),"--cfm-progress-fill":l(i.progressFillColor,l(t.primary,"#1A1F36")),"--cfm-sticky-pt":`${b(i.stickyChromePaddingTop,16)}px`,"--cfm-sticky-pb":`${b(i.stickyChromePaddingBottom,20)}px`,"--cfm-language-bg":l(i.languageSelectorBackground,"#FFFFFF"),"--cfm-language-text":l(i.languageSelectorTextColor,"#2563EB"),"--cfm-language-border":l(i.languageSelectorBorderColor,"#2563EB")},T=[["MCQ",Lt],["TEXTFIELD",Mt],["NPS_SCALE",Ot],["CFM_MATRIX",Bt],["CSAT_MATRIX",Ut],["RATING_MATRIX",zt],["SLIDER_MATRIX",qt],["FILE_UPLOAD",Wt],["TEXT_AND_MEDIA",Xt],["HEATMAP",Ht],["RANK_ORDER",Vt]];for(let[$,h]of T){let F=W(g[$]);F&&h(y,F)}return y}function oo(e){let o=e.questionTypes??{},t=W(o.MCQ),n=W(o.NPS_SCALE),r=W(o.FILE_UPLOAD),i={};return i["data-cfm-mcq-style"]=l(t?.optionStyle??t?.cardStyle,"outlined"),n?.buttonStyle&&(i["data-cfm-nps-button-style"]=l(n.buttonStyle,"standard")),r?.dropzoneStyle&&(i["data-cfm-dropzone-style"]=l(r.dropzoneStyle,"dashed")),i}var jo,vo,_o,to=z(()=>{"use strict";jo={narrow:"36rem",standard:"48rem",wide:"64rem"},vo={sharp:"0px",rounded:"12px",pill:"9999px"},_o={system:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',inter:"Inter, system-ui, sans-serif",modern:"Inter, sans-serif",roboto:"Roboto, system-ui, sans-serif",openSans:'"Open Sans", system-ui, sans-serif',lato:"Lato, system-ui, sans-serif",poppins:"Poppins, system-ui, sans-serif",montserrat:"Montserrat, system-ui, sans-serif",nunito:"Nunito, system-ui, sans-serif",raleway:"Raleway, system-ui, sans-serif",sourceSans:'"Source Sans 3", system-ui, sans-serif',georgia:'Georgia, "Times New Roman", serif',serif:"Georgia, serif",merriweather:"Merriweather, Georgia, serif",playfair:'"Playfair Display", Georgia, serif'}});import*as oe from"fs";import*as se from"path";function Jt(e){return`:root {
3
+ ${Object.entries(e).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>` ${t}: ${n};`).join(`
4
+ `)}
5
+ }`}function Gt(e,o){let t=Ue(e),n=Jt(t),r=o.match(/:root\s*\{[\s\S]*?\n\}/);return r?o.replace(r[0],n):`${n}
6
+
7
+ ${o}`}function Qt(e){let o=se.join(e,"src","styles","survey-theme.css");if(oe.existsSync(se.dirname(o)))return o;let t=se.join(e,"src","app","survey-theme.css");return oe.existsSync(se.dirname(t))?t:(oe.mkdirSync(se.dirname(o),{recursive:!0}),o)}function Do(e,o,t){let n=oe.readFileSync(t,"utf8"),r=Qt(e),i=Gt(o,n);return oe.writeFileSync(r,i,"utf8"),r}var Lo=z(()=>{"use strict";to()});import*as ye from"fs";import*as he from"path";function Mo(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Oo(e,o){return JSON.stringify(e)===JSON.stringify(o)}function pe(e){return typeof e=="string"&&e.startsWith("data:")&&e.length>80?`${e.slice(0,48)}\u2026 (${e.length} chars)`:e}function Bo(e,o,t,n){if(Oo(e,o)){n.unchangedCount+=1;return}if(e===void 0&&o!==void 0){n.added.push({path:t,before:void 0,after:pe(o)});return}if(e!==void 0&&o===void 0){n.removed.push({path:t,before:pe(e),after:void 0});return}if(Array.isArray(e)&&Array.isArray(o)){Oo(e,o)?n.unchangedCount+=1:n.changed.push({path:t,before:pe(e),after:pe(o)});return}if(Mo(e)&&Mo(o)){let r=new Set([...Object.keys(e),...Object.keys(o)]);for(let i of r){if(Kt.has(i)&&t==="")continue;let s=t?`${t}.${i}`:i;Bo(e[i],o[i],s,n)}return}n.changed.push({path:t,before:pe(e),after:pe(o)})}function no(e,o){let t={changed:[],added:[],removed:[],unchangedCount:0};return Bo(e,o,"",t),t}function ze(e){let o=["# UI Config Diff (seed \u2192 final)","",`**Changed:** ${e.changed.length} \xB7 **Added:** ${e.added.length} \xB7 **Removed:** ${e.removed.length}`,"","> Review only \u2014 run `npx cfm-sdk confirm-ui-config` to apply final config to the project.",""],t=(n,r)=>{if(r.length){o.push(`## ${n}`,"");for(let i of r)o.push(`### \`${i.path}\``),o.push(`- **Before:** \`${JSON.stringify(i.before)}\``),o.push(`- **After:** \`${JSON.stringify(i.after)}\``),o.push("")}};return t("Changed",e.changed),t("Added",e.added),t("Removed",e.removed),!e.changed.length&&!e.added.length&&!e.removed.length&&o.push("_No differences \u2014 final config matches seed._",""),o.join(`
8
+ `)}function te(e){return{seedPath:he.join(e,"survey-ui-config.seed.json"),finalPath:he.join(e,"survey-ui-config.final.json"),diffJsonPath:he.join(e,"survey-ui-config.diff.json"),diffMdPath:he.join(e,"survey-ui-config.diff.md"),activeConfigPath:he.join(e,"survey-ui-config.json")}}function qe(e,o,t){let n=te(e),r=no(o,t);return ye.writeFileSync(n.seedPath,JSON.stringify(o,null,2),"utf8"),ye.writeFileSync(n.finalPath,JSON.stringify(t,null,2),"utf8"),ye.writeFileSync(n.diffJsonPath,JSON.stringify(r,null,2),"utf8"),ye.writeFileSync(n.diffMdPath,ze(r),"utf8"),ye.writeFileSync(n.activeConfigPath,JSON.stringify(o,null,2),"utf8"),r}var Kt,$e=z(()=>{"use strict";Kt=new Set(["configuredAt","instanceId"])});function zo(e){return Uo[e]?Uo[e]:/individualNumberColors\.\d+/.test(e)||e.startsWith("questionTypes.")&&e.includes("columnLabel")||e.startsWith("questionTypes.")&&e.includes("hintLabel")||e.startsWith("questionTypes.")&&e.includes("numberLabel")?"css":e.startsWith("customFields.")||e.startsWith("placeholders.")?"runtime":"unknown"}var Uo,qo=z(()=>{"use strict";Uo={"global.colorScheme.primary":"css","global.colorScheme.secondary":"css","global.colorScheme.accent":"css","global.colorScheme.background":"css","global.colorScheme.text":"css","global.colorScheme.buttonText":"css","global.theme.pageBackground":"css","global.theme.cardBackground":"css","global.theme.cardBorderColor":"css","global.theme.cardPadding":"css","global.theme.cardShadowEnabled":"css","global.theme.cellSelectedColor":"css","global.theme.focusRingColor":"css","global.theme.selectedBackground":"css","global.theme.zebraRowColor":"css","global.theme.rowBandColor":"css","global.theme.validationBorder":"css","global.theme.validationBackground":"css","global.theme.tooltipBackground":"css","global.theme.progressTrackHeight":"css","global.theme.progressTrackColor":"css","global.theme.progressFillColor":"css","global.theme.stickyChromePaddingTop":"css","global.theme.stickyChromePaddingBottom":"css","global.theme.languageSelectorBackground":"css","global.theme.languageSelectorTextColor":"css","global.theme.languageSelectorBorderColor":"css","global.header.height":"css","global.header.logoBoxWidth":"css","global.header.logoBoxHeight":"css","global.header.logoPadding":"css","global.header.logoPlacement":"css","global.header.showCompanyName":"css","global.header.companyNamePlacement":"css","global.header.companyNameFontSize":"css","global.header.companyNameFontWeight":"css","global.header.companyNameColor":"css","global.header.backgroundColor":"css","global.header.shadowEnabled":"css","global.header.borderBottomColor":"css","global.header.contentPaddingX":"css","global.footer.backgroundColor":"css","global.footer.textColor":"css","global.footer.linkColor":"css","global.footer.linkHoverColor":"css","global.footer.showLogo":"layout","global.footer.logoWidth":"css","global.footer.logoHeight":"css","global.footer.logoPlacement":"css","global.footer.copyrightText":"content","global.footer.layout":"css","global.footer.paddingY":"css","global.footer.paddingX":"css","global.footer.links":"content","global.layout.showHeader":"layout","global.layout.showFooter":"layout","global.layout.showProgressBar":"layout","global.layout.showLanguageSwitcher":"layout","global.layout.showNextButton":"layout","global.layout.showBackButton":"layout","global.layout.showQuestionNumbers":"layout","global.layout.showRequiredAsterisk":"layout","global.layout.width":"css","global.layout.borderStyle":"css","global.layout.fontStyle":"css","global.typography.fontFamily":"css","global.typography.headingWeight":"css","global.motion.durationMs":"css","global.motion.enabled":"css","global.surveyTitle":"content","global.companyName":"content","global.browserTabTitle":"content","global.thankYouMessage":"content","global.buttons.next":"content","global.buttons.back":"content","global.buttons.submit":"content","global.logo.fileName":"content","global.logo.url":"runtime","questionTypes.MCQ.optionStyle":"dom","questionTypes.MCQ.cardStyle":"dom","questionTypes.MCQ.optionGap":"css","questionTypes.MCQ.borderRadius":"css","questionTypes.MCQ.optionPadding":"css","questionTypes.MCQ.cardPadding":"css","questionTypes.MCQ.hoverBorderColor":"css","questionTypes.TEXTFIELD.inputRadius":"css","questionTypes.TEXTFIELD.borderColor":"css","questionTypes.TEXTFIELD.inputPadding":"css","questionTypes.TEXTFIELD.inputHeight":"css","questionTypes.TEXTFIELD.placeholderColor":"css","questionTypes.TEXTFIELD.defaultPlaceholder":"runtime","questionTypes.NPS_SCALE.buttonStyle":"dom","questionTypes.NPS_SCALE.trackBarColor":"css","questionTypes.NPS_SCALE.trackHighlightColor":"css","questionTypes.NPS_SCALE.cellSize":"css","questionTypes.NPS_SCALE.cellGap":"css","questionTypes.NPS_SCALE.hintMinText":"runtime","questionTypes.NPS_SCALE.hintMaxText":"runtime","questionTypes.NPS_SCALE.hintLabelColor":"css","questionTypes.NPS_SCALE.hintLabelBgColor":"css","questionTypes.NPS_SCALE.numberLabelMode":"css","questionTypes.NPS_SCALE.monochromeNumberColor":"css","questionTypes.CFM_MATRIX.rowLabelWidth":"css","questionTypes.CFM_MATRIX.bipolarColumnWidthPercent":"css","questionTypes.CFM_MATRIX.cellPadding":"css","questionTypes.CFM_MATRIX.columnLabelColor":"css","questionTypes.CFM_MATRIX.columnLabelBgColor":"css","questionTypes.CSAT_MATRIX.emojiSize":"css","questionTypes.CSAT_MATRIX.unselectedOpacity":"css","questionTypes.CSAT_MATRIX.cellSize":"css","questionTypes.CSAT_MATRIX.tooltipBg":"css","questionTypes.CSAT_MATRIX.rowLabelWidth":"css","questionTypes.RATING_MATRIX.unselectedStarOpacity":"css","questionTypes.RATING_MATRIX.emojiSize":"css","questionTypes.RATING_MATRIX.rowLabelWidth":"css","questionTypes.RATING_MATRIX.starColor":"css","questionTypes.RATING_MATRIX.badgeColor":"css","questionTypes.SLIDER_MATRIX.trackColor":"css","questionTypes.SLIDER_MATRIX.thumbColor":"css","questionTypes.SLIDER_MATRIX.tickColor":"css","questionTypes.SLIDER_MATRIX.rowLabelWidth":"css","questionTypes.SLIDER_MATRIX.rowBandColor":"css","questionTypes.SLIDER_MATRIX.tickBadgeSize":"css","questionTypes.FILE_UPLOAD.dropzoneStyle":"dom","questionTypes.FILE_UPLOAD.borderColor":"css","questionTypes.FILE_UPLOAD.dropzoneFillColor":"css","questionTypes.FILE_UPLOAD.dropzonePadding":"css","questionTypes.TEXT_AND_MEDIA.mediaMaxWidth":"css","questionTypes.TEXT_AND_MEDIA.mediaRadius":"css","questionTypes.TEXT_AND_MEDIA.captionColor":"css","questionTypes.TEXT_AND_MEDIA.captionSize":"css","questionTypes.HEATMAP.pinColor":"css","questionTypes.HEATMAP.pinSize":"css","questionTypes.HEATMAP.pinBorderColor":"css","questionTypes.HEATMAP.overlayOpacity":"css","questionTypes.RANK_ORDER.drag.itemBg":"css","questionTypes.RANK_ORDER.drag.rankBadgeColor":"css","questionTypes.RANK_ORDER.drag.dragHandleColor":"css","questionTypes.RANK_ORDER.drag.itemPadding":"css","questionTypes.RANK_ORDER.drag.itemGap":"css","questionTypes.RANK_ORDER.dropdown.itemBg":"css","questionTypes.RANK_ORDER.dropdown.rankBadgeColor":"css","questionTypes.RANK_ORDER.dropdown.selectBorderColor":"css","questionTypes.RANK_ORDER.dropdown.itemPadding":"css","questionTypes.RANK_ORDER.dropdown.itemGap":"css","placeholders.firstName":"runtime","placeholders.lastName":"runtime","placeholders.email":"runtime",customFields:"runtime","debug.enabled":"runtime","deploy.target":"runtime","deploy.autoDeploy":"runtime"}});var Re={};Ie(Re,{runApplyUiConfig:()=>sn});import*as v from"fs";import*as D from"path";function Zt(e,o){if(o&&v.existsSync(o))return o;let t=D.join(e,"survey-ui-config.json");if(v.existsSync(t))return t;let n=te(e).finalPath;if(v.existsSync(n))return n;throw new Error("No survey-ui-config.json found. Complete the wizard or run confirm-ui-config first.")}function en(e,o){let t=D.relative(D.dirname(o),o),n=(o.includes(`${D.sep}styles${D.sep}`),"./survey-theme.css"),r=[D.join(e,"src","app","globals.css"),D.join(e,"src","styles","globals.css")];for(let i of r){if(!v.existsSync(i))continue;let s=v.readFileSync(i,"utf8"),c=`@import '${n}';`;if(s.includes("survey-theme.css"))return;s.includes(c)||(s=`${c}
9
+ ${s}`,v.writeFileSync(i,s,"utf8"));return}}function on(e,o){let t=oo(o),n=D.join(e,"src","lib");v.mkdirSync(n,{recursive:!0});let r=D.join(n,"surveyUiDomAttributes.ts"),s=`/**
10
+ * Runtime DOM attributes for wizard style modes (MCQ / NPS / upload).
11
+ * Auto-generated by \`npx cfm-sdk apply-ui-config\` \u2014 do not edit manually.
12
+ */
13
+ export function applySurveyUiDomAttributes(): void {
14
+ if (typeof document === 'undefined') return;
15
+ const root = document.documentElement;
16
+ ${Object.entries(t).map(([c,d])=>` root.setAttribute('${c}', ${JSON.stringify(d)});`).join(`
17
+ `)}
18
+ }
19
+ `;return v.writeFileSync(r,s,"utf8"),r}function tn(e){let o=D.join(e,"src","components");v.mkdirSync(o,{recursive:!0});let t=D.join(o,"SurveyUiConfigInit.tsx");return v.existsSync(t)||v.writeFileSync(t,Yt,"utf8"),t}function nn(e,o){let t=D.join(e,"src","lib","uiConfig.ts");if(v.existsSync(t))return;let n=D.join(o,"docs","templates","uiConfig.ts");v.existsSync(n)&&(v.mkdirSync(D.dirname(t),{recursive:!0}),v.copyFileSync(n,t))}function rn(e,o){let t=e.replace(/\.json$/,".diff.json");if(v.existsSync(t))try{let n=JSON.parse(v.readFileSync(t,"utf8")),r=[...(n.changed??[]).map(i=>i.path),...(n.added??[]).map(i=>i.path),...(n.removed??[]).map(i=>i.path)];for(let i of r)zo(i)==="unknown"&&o.push(`Unmapped config path (verify manually): ${i}`)}catch{}}function sn(e={}){let o=e.projectRoot??process.env.INIT_CWD??process.cwd(),t=Zt(o,e.configPath),n=D.join(__dirname,"..",".."),r=D.join(n,"templates","survey-theme.css"),i=D.join(n,"templates"),s=[],c=JSON.parse(v.readFileSync(t,"utf8")),d=[...new Set([...c.surveyTypes??[],...J])],g=je({...c,surveyTypes:d}),w=Do(o,g,r);en(o,w),nn(o,i),on(o,g);let S;e.skipInitComponent||(S=tn(o));let x=Ue(g),E=oo(g);rn(t,s),console.log(`${Q.green}\u2705 Applied UI config \u2192 ${w}${Q.reset}`),console.log(`${Q.dim} ${Object.keys(x).length} CSS variables regenerated${Q.reset}`),console.log(`${Q.dim} DOM attrs: ${Object.entries(E).map(([A,R])=>`${A}=${R}`).join(", ")}${Q.reset}`),S&&console.log(`${Q.dim} Runtime init: ${S} (mount in layout if not already)${Q.reset}`);for(let A of s)console.log(`${Q.yellow} \u26A0 ${A}${Q.reset}`);return{configPath:t,themeCssPath:w,cssVarCount:Object.keys(x).length,domAttributes:E,initComponentPath:S,warnings:s}}var Q,Yt,ke=z(()=>{"use strict";q();He();to();Lo();$e();qo();Se();Q=a,Yt=`'use client';
20
+
21
+ /**
22
+ * Applies wizard DOM attributes from survey-ui-config.json at runtime.
23
+ * Copy to src/components/SurveyUiConfigInit.tsx and mount in root layout.
24
+ * CSS tokens are regenerated into survey-theme.css by \`npx cfm-sdk apply-ui-config\`.
25
+ */
26
+ import { useEffect } from 'react';
27
+ import { applySurveyUiDomAttributes } from '@/lib/surveyUiDomAttributes';
28
+
29
+ export function SurveyUiConfigInit() {
30
+ useEffect(() => {
31
+ applySurveyUiDomAttributes();
32
+ }, []);
33
+ return null;
34
+ }
35
+ `});import*as ce from"fs";import*as Go from"http";import*as Qo from"https";import*as io from"path";function We(e){if(!e.config)return null;let o=JSON.parse(JSON.stringify(e.config)),n=o.global?.logo;return e.logoUrl&&n&&(n.url=e.logoUrl),o}function Jo(e){return new Promise((o,t)=>{let n=new URL(e);(n.protocol==="https:"?Qo:Go).get(n,i=>{if((i.statusCode??500)>=400){t(new Error(`Logo download failed HTTP ${i.statusCode}`));return}let s=[];i.on("data",c=>s.push(c)),i.on("end",()=>o(Buffer.concat(s)))}).on("error",t)})}async function dn(e,o={}){return new Promise((t,n)=>{let r=new URL(e),s=(r.protocol==="https:"?Qo:Go).request(r,{method:"GET",headers:o.headers??{}},c=>{let d="";c.on("data",g=>d+=g),c.on("end",()=>{if((c.statusCode??500)>=400){n(new Error(`HTTP ${c.statusCode}: ${d}`));return}try{t(JSON.parse(d))}catch{n(new Error(`Invalid JSON: ${d.slice(0,200)}`))}})});s.on("error",n),s.end()})}async function ae(e){let{projectRoot:o,fileName:t,logoUrl:n,jwt:r,apiBase:i,surveyId:s}=e,c=io.join(o,"public");ce.existsSync(c)||ce.mkdirSync(c,{recursive:!0});let d=io.join(c,t);if(n){let g=await Jo(n);return ce.writeFileSync(d,g),d}if(r&&i&&s){let g=await dn(`${i.replace(/\/$/,"")}/wizard/logo/${encodeURIComponent(s)}/${encodeURIComponent(t)}`,{headers:{Authorization:`Bearer ${r}`}}),w=await Jo(g.downloadUrl);return ce.writeFileSync(d,w),d}throw new Error("Logo download requires logoUrl from wizard poll or CFM_INSTANCE_ID + CFM_DEPLOY_API_BASE")}var Xe=z(()=>{"use strict"});var ot={};Ie(ot,{runConfirmUiConfig:()=>yn});import*as K from"fs";function pn(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function yn(e={}){let o=process.env.INIT_CWD??process.cwd(),t=te(o);if(!K.existsSync(t.finalPath))throw new Error(`Missing ${t.finalPath}. Run customize-ui with --review and complete the wizard first.`);let n=JSON.parse(K.readFileSync(K.existsSync(t.seedPath)?t.seedPath:t.activeConfigPath,"utf8")),r=JSON.parse(K.readFileSync(t.finalPath,"utf8")),i=no(n,r);if(console.log(`
36
+ ${V.bold}${V.cyan}\u{1F4CB} UI config review${V.reset}
37
+ `),console.log(ze(i)),e.diffOnly){K.writeFileSync(t.diffJsonPath,JSON.stringify(i,null,2),"utf8"),K.writeFileSync(t.diffMdPath,ze(i),"utf8"),console.log(`${V.dim} Updated ${t.diffMdPath}${V.reset}`);return}K.writeFileSync(t.activeConfigPath,JSON.stringify(r,null,2),"utf8"),console.log(`${V.green}\u2705 Applied final config \u2192 ${t.activeConfigPath}${V.reset}`);let{runApplyUiConfig:s}=await Promise.resolve().then(()=>(ke(),Re));s({projectRoot:o,configPath:t.activeConfigPath});let c=r.global?.logo;if(!c?.fileName)return;let d=process.env.CFM_INSTANCE_ID,g=(process.env.CFM_DEPLOY_API_BASE??"").replace(/\/$/,""),w=d?pn(d):null;try{await ae({projectRoot:o,fileName:c.fileName,logoUrl:c.url,jwt:d??void 0,apiBase:g||void 0,surveyId:w??void 0}),console.log(`${V.green} Logo saved to public/${c.fileName}${V.reset}`),c.url&&console.log(`${V.dim} Public logo URL: ${c.url}${V.reset}`)}catch(S){console.log(`${V.yellow} Logo not downloaded \u2014 ${S instanceof Error?S.message:String(S)}${V.reset}`)}}var V,tt=z(()=>{"use strict";q();$e();Xe();V=a});var nt={};Ie(nt,{runFetchUiConfig:()=>Cn});import*as Fe from"fs";import*as hn from"http";import*as wn from"https";async function bn(e,o={}){return new Promise((t,n)=>{let r=new URL(e),s=(r.protocol==="https:"?wn:hn).request(r,{method:"GET",headers:o.headers??{}},c=>{let d="";c.on("data",g=>d+=g),c.on("end",()=>{if((c.statusCode??500)>=400){n(new Error(`HTTP ${c.statusCode}: ${d}`));return}try{t(JSON.parse(d))}catch{n(new Error(`Invalid JSON: ${d.slice(0,200)}`))}})});s.on("error",n),s.end()})}function Sn(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function Cn(e={}){let o=process.env.CFM_INSTANCE_ID,t=(process.env.CFM_DEPLOY_API_BASE??"").replace(/\/$/,""),n=e.sessionId??process.env.CFM_WIZARD_SESSION_ID;if(!o)throw new Error("CFM_INSTANCE_ID (JWT) is required");if(!t)throw new Error("CFM_DEPLOY_API_BASE is required");if(!n)throw new Error("CFM_WIZARD_SESSION_ID or --session= is required");let r=Sn(o);if(!r)throw new Error("Could not parse surveyId from CFM_INSTANCE_ID JWT");let i=process.env.INIT_CWD??process.cwd(),s=te(i),c=Fe.existsSync(s.seedPath)?s.seedPath:s.activeConfigPath;if(!Fe.existsSync(c))throw new Error(`Missing seed config at ${c}. Run customize-ui --review first.`);let d=await bn(`${t}/wizard/config/${encodeURIComponent(r)}?sessionId=${encodeURIComponent(n)}`,{headers:{Authorization:`Bearer ${o}`}});if(d.status!=="ready"||!d.config)throw new Error(`Wizard not complete yet (status: ${d.status})`);let g=We(d)??d.config,w=JSON.parse(Fe.readFileSync(c,"utf8")),S=qe(i,w,g),x=g.global?.logo;if(x?.fileName)try{await ae({projectRoot:i,fileName:x.fileName,logoUrl:d.logoUrl,jwt:o,apiBase:t,surveyId:r}),console.log(`${X.green} Logo saved to public/${x.fileName}${X.reset}`)}catch(E){console.warn(`${X.yellow} Logo download failed: ${E}${X.reset}`)}console.log(`
38
+ ${X.green}\u2705 Fetched final config (review mode)${X.reset}`),console.log(`${X.green} Final: ${s.finalPath}${X.reset}`),console.log(`${X.green} Diff: ${s.diffMdPath}${X.reset}`),console.log(`${X.yellow} ${S.changed.length} changed, ${S.added.length} added, ${S.removed.length} removed${X.reset}`),console.log(`${X.dim} Apply when ready: npx cfm-sdk confirm-ui-config${X.reset}`)}var X,rt=z(()=>{"use strict";q();$e();Xe();X=a});q();q();import{execSync as co,spawn as ct}from"child_process";function le(e){try{let o=process.platform==="win32"?`where ${e}`:`command -v ${e}`;return co(o,{stdio:"ignore"}),!0}catch{return!1}}var at={stdio:"inherit",shell:process.platform==="win32"?"cmd.exe":"/bin/sh"};function be(e,o){try{let t=`${e} ${o.join(" ")}`;return co(t,at),!0}catch{return!1}}function Ne(e,o){return new Promise(t=>{ct(e,o,{stdio:"inherit",shell:!0}).on("close",r=>{t(r)})})}import lt from"readline/promises";import{stdin as dt,stdout as ft}from"process";async function de(e){let o=lt.createInterface({input:dt,output:ft});try{return(await o.question(e)).trim()}finally{o.close()}}async function ao(){let e=parseInt(process.version.slice(1).split(".")[0],10);if(console.log(`${a.dim}Step 1/4: Checking Node.js version (current: ${process.version})...${a.reset}`),e<18){console.log(`\u26A0\uFE0F ${a.yellow}Outdated Node.js version detected. v18.0.0 or higher is required.${a.reset}`),console.log(`${a.dim}Note: If you already have a higher version installed via nvm, please run 'nvm use <version>' first.${a.reset}
39
+ `);let o=await de("Would you like to install/upgrade Node.js v18+ automatically? (y/N): ");o.toLowerCase()==="y"||o.toLowerCase()==="yes"||(console.log(`
40
+ \u274C ${a.red}Aborted. Please manually upgrade Node.js to v18+ and try again.${a.reset}
41
+ `),process.exit(1));let n=process.platform==="win32",r=process.platform==="darwin";n?le("winget")?(console.log(`
42
+ \u{1F4E6} ${a.green}winget package manager found! Installing Node.js v18+ in background...${a.reset}`),be("winget",["upgrade","OpenJS.NodeJS","--silent","--accept-package-agreements","--accept-source-agreements"])?(console.log(`
43
+ \u2714 ${a.green}Node.js installation triggered successfully. Please restart your terminal/command-prompt for changes to take effect.${a.reset}
12
44
  `),process.exit(0)):(console.log(`
13
- \u274C ${c.red}winget update failed. Please update Node.js manually at https://nodejs.org/${c.reset}
45
+ \u274C ${a.red}winget update failed. Please update Node.js manually at https://nodejs.org/${a.reset}
14
46
  `),process.exit(1))):(console.log(`
15
- \u274C ${c.red}winget package manager is not installed on this system.${c.reset}`),console.log(`${c.bold}\u{1F449} To proceed, please either:${c.reset}`),console.log(" 1. Install winget (App Installer) from the Microsoft Store."),console.log(` 2. Or manually download and install Node.js (v18+) from: https://nodejs.org/
16
- `),process.exit(1)):i?oe("brew")?(console.log(`
17
- \u{1F4E6} ${c.green}Homebrew package manager found! Installing Node.js v18+ in background...${c.reset}`),de("brew",["install","node"])?console.log(`
18
- \u2714 ${c.green}Node.js installed successfully via Homebrew.${c.reset}
47
+ \u274C ${a.red}winget package manager is not installed on this system.${a.reset}`),console.log(`${a.bold}\u{1F449} To proceed, please either:${a.reset}`),console.log(" 1. Install winget (App Installer) from the Microsoft Store."),console.log(` 2. Or manually download and install Node.js (v18+) from: https://nodejs.org/
48
+ `),process.exit(1)):r?le("brew")?(console.log(`
49
+ \u{1F4E6} ${a.green}Homebrew package manager found! Installing Node.js v18+ in background...${a.reset}`),be("brew",["install","node"])?console.log(`
50
+ \u2714 ${a.green}Node.js installed successfully via Homebrew.${a.reset}
19
51
  `):(console.log(`
20
- \u274C ${c.red}Homebrew installation failed. Please install Node.js manually at https://nodejs.org/${c.reset}
52
+ \u274C ${a.red}Homebrew installation failed. Please install Node.js manually at https://nodejs.org/${a.reset}
21
53
  `),process.exit(1))):(console.log(`
22
- \u274C ${c.red}Homebrew package manager (brew) is not installed on this system.${c.reset}`),console.log(`${c.bold}\u{1F449} To proceed, please either:${c.reset}`),console.log(" 1. Install Homebrew by running the following command in your terminal:"),console.log(` ${c.cyan}/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"${c.reset}`),console.log(` 2. Or manually download and install Node.js (v18+) from: https://nodejs.org/
54
+ \u274C ${a.red}Homebrew package manager (brew) is not installed on this system.${a.reset}`),console.log(`${a.bold}\u{1F449} To proceed, please either:${a.reset}`),console.log(" 1. Install Homebrew by running the following command in your terminal:"),console.log(` ${a.cyan}/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"${a.reset}`),console.log(` 2. Or manually download and install Node.js (v18+) from: https://nodejs.org/
23
55
  `),process.exit(1)):(console.log(`
24
- \u274C ${c.red}Please install or update Node.js to v18+ using your system's package manager.${c.reset}
25
- `),process.exit(1))}else console.log(`\u2714 ${c.green}Node.js version (v${e}) is sufficient.${c.reset}`)}U();async function Je(){console.log(`
26
- ${c.dim}Step 2/4: Checking Vercel CLI...${c.reset}`);let e="vercel",o=!1;if(oe("vercel"))console.log(`\u2714 ${c.green}Vercel CLI is installed!${c.reset}`);else{console.log(`\u2753 ${c.yellow}Vercel CLI was not found on your system.${c.reset}`);let t=await te("\u{1F449} Would you like to install Vercel CLI globally? (Y/n): ");t.toLowerCase()==="y"||t===""?(console.log(`
27
- \u{1F4E5} ${c.cyan}Installing Vercel CLI globally... (npm install -g vercel)${c.reset}`),de("npm",["install","-g","vercel"])&&oe("vercel")?console.log(`\u2714 ${c.green}Vercel CLI installed successfully!${c.reset}`):(console.log(`
28
- \u26A0\uFE0F ${c.yellow}Global installation failed or permissions restricted.${c.reset}`),console.log(`\u2139 ${c.dim}Falling back: Running Vercel dynamically via npx.${c.reset}`),e="npx --yes vercel",o=!0)):(console.log(`\u2139 ${c.dim}Skipping global installation. Running Vercel dynamically via npx.${c.reset}`),e="npx --yes vercel",o=!0)}return{vercelCmd:e,useNpx:o}}U();import{execSync as Oo}from"child_process";var Lo={stdio:"ignore",shell:process.platform==="win32"?"cmd.exe":"/bin/sh"};async function He(e){console.log(`
29
- ${c.dim}Step 3/4: Checking Vercel Login...${c.reset}`);let o=!!process.env.VERCEL_TOKEN,t=!1;if(o)console.log(`\u2714 ${c.green}VERCEL_TOKEN environment variable detected. Skipping login check.${c.reset}`),t=!0;else try{Oo(e?"npx --yes vercel whoami":"vercel whoami",Lo),t=!0,console.log(`\u2714 ${c.green}Logged in!${c.reset}`)}catch{t=!1}if(!t){console.log(`\u{1F511} ${c.yellow}Not logged in to Vercel.${c.reset}`),await te("\u{1F449} Press [Enter] to login to Vercel... ");let n=["login"],i=e?"npx":"vercel",s=e?["--yes","vercel",...n]:n;if(await Se(i,s)!==0)throw new Error("Vercel login failed or was aborted.");console.log(`
30
- \u2714 ${c.green}Logged in successfully!${c.reset}`)}return o}U();async function Ve(e,o){console.log(`
31
- ${c.dim}Step 4/4: Deploying project to production...${c.reset}`);let t=["--prod","--yes"];o&&t.push("--token",process.env.VERCEL_TOKEN);let n=e?"npx":"vercel",i=e?["--yes","vercel",...t]:t;if(console.log(`${c.cyan}\u26A1 Running deployment in: ${process.cwd()}${c.reset}
32
- `),await Se(n,i)!==0)throw new Error("Vercel deployment failed.");console.log(`
33
- ${c.bold}${c.green}\u{1F389} Deployment completed successfully!${c.reset}
34
- `)}async function Xe(){console.log(`
35
- ${c.bold}${c.cyan}\u{1F680} Starting CFM Vercel Deployment...${c.reset}
36
- `),await We();let{vercelCmd:e,useNpx:o}=await Je(),t=await He(o);await Ve(o,t)}U();import*as he from"http";import*as k from"fs";import*as F from"path";function O(e){return e instanceof Error?e.message:String(e)}pe();U();import*as I from"fs";import*as R from"path";$e();$e();import*as u from"fs";import*as p from"path";import{execSync as Xo}from"child_process";function G(e,o){if(u.existsSync(e)){u.mkdirSync(o,{recursive:!0});for(let t of u.readdirSync(e,{withFileTypes:!0})){let n=p.join(e,t.name),i=p.join(o,t.name);t.isDirectory()?G(n,i):u.copyFileSync(n,i)}}}function Ae(e){let o=[],t=e;for(let n=0;n<6;n++){let i=p.join(t,"node_modules");u.existsSync(i)&&o.push(i);let s=p.dirname(t);if(s===t)break;t=s}return o}function qo(e,o){let t=Ae(e);for(let n of t)for(let i of["@explorer02/cfm-survey-sdk","@repo/sdk"])for(let s of["mjs","js"]){let r=p.join(n,i,"dist",`index.${s}`);if(u.existsSync(r))return r}for(let n of["mjs","js"]){let i=p.join(o,"dist",`index.${n}`);if(u.existsSync(i))return i}throw new Error("Could not resolve @explorer02/cfm-survey-sdk for preview build")}function Qo(e,o){let t=[...Ae(o).map(n=>p.join(n,"vite","bin","vite.js")),p.join(e,"node_modules","vite","bin","vite.js")];for(let n of t)if(u.existsSync(n))return n;throw new Error("Vite is required for agent preview builds. Install vite in the project or SDK package.")}function Go(e){let o=p.join(e,"src","components");if(!u.existsSync(p.join(o,"Question.tsx")))throw new Error(`Missing src/components/Question.tsx in ${e}. Build the survey UI before export-previews.`);let t=p.join(e,"src","lib"),n=p.join(e,"public");return{componentsDir:o,libDir:u.existsSync(t)?t:void 0,publicDir:u.existsSync(n)?n:void 0}}function Ko(e){let o=`import React from 'react';
56
+ \u274C ${a.red}Please install or update Node.js to v18+ using your system's package manager.${a.reset}
57
+ `),process.exit(1))}else console.log(`\u2714 ${a.green}Node.js version (v${e}) is sufficient.${a.reset}`)}q();async function lo(){console.log(`
58
+ ${a.dim}Step 2/4: Checking Vercel CLI...${a.reset}`);let e="vercel",o=!1;if(le("vercel"))console.log(`\u2714 ${a.green}Vercel CLI is installed!${a.reset}`);else{console.log(`\u2753 ${a.yellow}Vercel CLI was not found on your system.${a.reset}`);let t=await de("\u{1F449} Would you like to install Vercel CLI globally? (Y/n): ");t.toLowerCase()==="y"||t===""?(console.log(`
59
+ \u{1F4E5} ${a.cyan}Installing Vercel CLI globally... (npm install -g vercel)${a.reset}`),be("npm",["install","-g","vercel"])&&le("vercel")?console.log(`\u2714 ${a.green}Vercel CLI installed successfully!${a.reset}`):(console.log(`
60
+ \u26A0\uFE0F ${a.yellow}Global installation failed or permissions restricted.${a.reset}`),console.log(`\u2139 ${a.dim}Falling back: Running Vercel dynamically via npx.${a.reset}`),e="npx --yes vercel",o=!0)):(console.log(`\u2139 ${a.dim}Skipping global installation. Running Vercel dynamically via npx.${a.reset}`),e="npx --yes vercel",o=!0)}return{vercelCmd:e,useNpx:o}}q();import{execSync as ut}from"child_process";var mt={stdio:"ignore",shell:process.platform==="win32"?"cmd.exe":"/bin/sh"};async function fo(e){console.log(`
61
+ ${a.dim}Step 3/4: Checking Vercel Login...${a.reset}`);let o=!!process.env.VERCEL_TOKEN,t=!1;if(o)console.log(`\u2714 ${a.green}VERCEL_TOKEN environment variable detected. Skipping login check.${a.reset}`),t=!0;else try{ut(e?"npx --yes vercel whoami":"vercel whoami",mt),t=!0,console.log(`\u2714 ${a.green}Logged in!${a.reset}`)}catch{t=!1}if(!t){console.log(`\u{1F511} ${a.yellow}Not logged in to Vercel.${a.reset}`),await de("\u{1F449} Press [Enter] to login to Vercel... ");let n=["login"],r=e?"npx":"vercel",i=e?["--yes","vercel",...n]:n;if(await Ne(r,i)!==0)throw new Error("Vercel login failed or was aborted.");console.log(`
62
+ \u2714 ${a.green}Logged in successfully!${a.reset}`)}return o}q();async function uo(e,o){console.log(`
63
+ ${a.dim}Step 4/4: Deploying project to production...${a.reset}`);let t=["--prod","--yes"];o&&t.push("--token",process.env.VERCEL_TOKEN);let n=e?"npx":"vercel",r=e?["--yes","vercel",...t]:t;if(console.log(`${a.cyan}\u26A1 Running deployment in: ${process.cwd()}${a.reset}
64
+ `),await Ne(n,r)!==0)throw new Error("Vercel deployment failed.");console.log(`
65
+ ${a.bold}${a.green}\u{1F389} Deployment completed successfully!${a.reset}
66
+ `)}async function mo(){console.log(`
67
+ ${a.bold}${a.cyan}\u{1F680} Starting CFM Vercel Deployment...${a.reset}
68
+ `),await ao();let{vercelCmd:e,useNpx:o}=await lo(),t=await fo(o);await uo(o,t)}q();import*as Ee from"http";import*as P from"fs";import*as L from"path";function U(e){return e instanceof Error?e.message:String(e)}xe();q();import*as j from"fs";import*as N from"path";_e();_e();import*as m from"fs";import*as u from"path";import{execSync as Tt}from"child_process";function ie(e,o){if(m.existsSync(e)){m.mkdirSync(o,{recursive:!0});for(let t of m.readdirSync(e,{withFileTypes:!0})){let n=u.join(e,t.name),r=u.join(o,t.name);t.isDirectory()?ie(n,r):m.copyFileSync(n,r)}}}function Qe(e){let o=[],t=e;for(let n=0;n<6;n++){let r=u.join(t,"node_modules");m.existsSync(r)&&o.push(r);let i=u.dirname(t);if(i===t)break;t=i}return o}function xt(e,o){let t=Qe(e);for(let n of t)for(let r of["@explorer02/cfm-survey-sdk","@repo/sdk"])for(let i of["mjs","js"]){let s=u.join(n,r,"dist",`index.${i}`);if(m.existsSync(s))return s}for(let n of["mjs","js"]){let r=u.join(o,"dist",`index.${n}`);if(m.existsSync(r))return r}throw new Error("Could not resolve @explorer02/cfm-survey-sdk for preview build")}function $t(e,o){let t=[...Qe(o).map(n=>u.join(n,"vite","bin","vite.js")),u.join(e,"node_modules","vite","bin","vite.js")];for(let n of t)if(m.existsSync(n))return n;throw new Error("Vite is required for agent preview builds. Install vite in the project or SDK package.")}function Rt(e){let o=u.join(e,"src","components");if(!m.existsSync(u.join(o,"Question.tsx")))throw new Error(`Missing src/components/Question.tsx in ${e}. Build the survey UI before export-previews.`);let t=u.join(e,"src","lib"),n=u.join(e,"public");return{componentsDir:o,libDir:m.existsSync(t)?t:void 0,publicDir:m.existsSync(n)?n:void 0}}function kt(e,o){let t=u.join(e,"templates","docs","templates"),n=u.join(o,"agent","src","components"),r=u.join(o,"agent","src","lib","surveyUi");m.mkdirSync(r,{recursive:!0});let i=["Question.tsx","RatingScale.tsx","LikertMatrixScale.tsx","CsatMatrixScale.tsx","SliderMatrixScale.tsx","CustomSliderTrack.tsx","MatrixDropdown.tsx","FileUploadScale.tsx","HeatmapScale.tsx","RankOrderScale.tsx","surveyUiScaleUtils.ts","surveyUiIcons.tsx","Header.tsx","ProgressBar.tsx","Footer.tsx","LanguageSelector.tsx","SurveyStickyChrome.tsx"];for(let d of i){let g=u.join(t,d);m.existsSync(g)&&m.copyFileSync(g,u.join(n,d))}let s=["selectionStyles.ts","labelStyles.ts","heatmapCoords.ts"];for(let d of s){let g=u.join(t,d);m.existsSync(g)&&m.copyFileSync(g,u.join(r,d))}let c=u.join(t,"heatmapCoords.ts");m.existsSync(c)&&m.copyFileSync(c,u.join(n,"heatmapCoords.ts"))}function At(e){let o=`import React from 'react';
37
69
  import { mountPreview } from '../mount';
38
70
  `;switch(e){case"header":return`${o}import Header from '@/components/Header';
39
71
  import ProgressBar from '@/components/ProgressBar';
@@ -50,34 +82,12 @@ mountPreview(
50
82
  </div>,
51
83
  );`;case"survey_page":return`${o}import { SurveyPagePreview } from '../SurveyPagePreview';
52
84
  mountPreview(<SurveyPagePreview />);`;case"footer":return`${o}import Footer from '@/components/Footer';
53
- mountPreview(<Footer />);`;case"chrome":return`${o}import Header from '@/components/Header';
54
- import ProgressBar from '@/components/ProgressBar';
55
- mountPreview(
56
- <div className="min-h-screen bg-white">
57
- <Header />
58
- <div className="mx-auto max-w-3xl space-y-6 px-6 py-8">
59
- <div data-cfm-progress>
60
- <ProgressBar progressPercentage={45} />
61
- </div>
62
- <p className="text-sm text-gray-500" data-cfm-company>
63
- Company Name
64
- </p>
65
- <h1 className="text-2xl font-semibold text-gray-900" data-cfm-survey-title>
66
- Survey Title
67
- </h1>
68
- <p className="text-gray-600">Sample question preview area</p>
69
- </div>
70
- </div>,
71
- );`;case"intro":return`${o}import IntroPage from '@/components/IntroPage';
72
- import { FIXTURE_INTRO } from '../fixtures/questions';
73
- mountPreview(<IntroPage page={FIXTURE_INTRO} onStart={() => {}} />);`;case"end":return`${o}import EndPage from '@/components/EndPage';
74
- import { FIXTURE_END } from '../fixtures/questions';
75
- mountPreview(<EndPage page={FIXTURE_END} />);`;default:return`${o}import { QuestionPreview } from '../QuestionPreview';
85
+ mountPreview(<Footer />);`;default:return`${o}import { QuestionPreview } from '../QuestionPreview';
76
86
  import { PREVIEW_FIXTURES } from '../fixtures/questions';
77
87
  const question = PREVIEW_FIXTURES[${JSON.stringify(e)}];
78
88
  if (!question) throw new Error('Missing fixture for ${e}');
79
- mountPreview(<QuestionPreview question={question} />);`}}function Yo(e,o,t,n){let i=qo(o,t),s=n.map(a=>` '${a}': path.resolve(workDir, '${a}', 'index.html'),`).join(`
80
- `),r=`import path from 'path';
89
+ mountPreview(<QuestionPreview question={question} />);`}}function Et(e,o,t,n){let r=xt(o,t),i=n.map(c=>` '${c}': path.resolve(workDir, '${c}', 'index.html'),`).join(`
90
+ `),s=`import path from 'path';
81
91
  import { fileURLToPath } from 'url';
82
92
  import { defineConfig } from 'vite';
83
93
  import react from '@vitejs/plugin-react';
@@ -96,8 +106,8 @@ export default defineConfig({
96
106
  '@': path.join(workDir, 'agent', 'src'),
97
107
  'next/image': path.join(workDir, 'stubs', 'next-image.tsx'),
98
108
  'next/dynamic': path.join(workDir, 'stubs', 'next-dynamic.tsx'),
99
- '@explorer02/cfm-survey-sdk': ${JSON.stringify(i)},
100
- '@repo/sdk': ${JSON.stringify(i)},
109
+ '@explorer02/cfm-survey-sdk': ${JSON.stringify(r)},
110
+ '@repo/sdk': ${JSON.stringify(r)},
101
111
  },
102
112
  dedupe: ['react', 'react-dom'],
103
113
  },
@@ -106,42 +116,43 @@ export default defineConfig({
106
116
  emptyOutDir: true,
107
117
  rollupOptions: {
108
118
  input: {
109
- ${s}
119
+ ${i}
110
120
  },
111
121
  },
112
122
  },
113
123
  });
114
- `;u.writeFileSync(p.join(e,"vite.config.mjs"),r)}function Zo(e,o){let t=u.readFileSync(e,"utf8");if(t.includes("preview-bridge.inline"))return;let n=`<script>${o}</script>`;t=t.includes("</body>")?t.replace("</body>",`${n}
124
+ `;m.writeFileSync(u.join(e,"vite.config.mjs"),s)}function Ft(e,o){let t=m.readFileSync(e,"utf8");if(t.includes("preview-bridge.inline"))return;let n=`<script>${o}</script>`;t=t.includes("</body>")?t.replace("</body>",`${n}
115
125
  </body>`):`${t}
116
- ${n}`,u.writeFileSync(e,t)}function et(e){return e.replace(/_/g," ")}async function go(e){let{projectRoot:o,outputDir:t,keys:n}=e,i=p.join(__dirname,"..",".."),s=p.join(i,"templates","preview-harness","vite-app");if(!u.existsSync(s))throw new Error(`Missing Vite preview harness template at ${s}`);let r=Go(o),a=p.join(t,".preview-vite-work");u.existsSync(a)&&u.rmSync(a,{recursive:!0,force:!0}),G(s,a),u.mkdirSync(p.join(a,"agent","src"),{recursive:!0}),G(r.componentsDir,p.join(a,"agent","src","components")),r.libDir&&G(r.libDir,p.join(a,"agent","src","lib")),r.publicDir&&G(r.publicDir,p.join(a,"agent","public"));let l=ne(o),y=p.join(a,"src","survey-theme.css");u.writeFileSync(y,l?u.readFileSync(l,"utf8"):u.readFileSync(p.join(i,"templates","survey-theme.css"),"utf8")),u.mkdirSync(p.join(a,"src","entries"),{recursive:!0});for(let f of n)u.mkdirSync(p.join(a,f),{recursive:!0}),u.writeFileSync(p.join(a,f,"index.html"),`<!DOCTYPE html>
126
+ ${n}`,m.writeFileSync(e,t)}function Pt(e){return e.replace(/_/g," ")}async function Fo(e){let{projectRoot:o,outputDir:t,keys:n}=e,r=u.join(__dirname,"..",".."),i=u.join(r,"templates","preview-harness","vite-app");if(!m.existsSync(i))throw new Error(`Missing Vite preview harness template at ${i}`);let s=Rt(o),c=u.join(t,".preview-vite-work");m.existsSync(c)&&m.rmSync(c,{recursive:!0,force:!0}),ie(i,c),m.mkdirSync(u.join(c,"agent","src"),{recursive:!0}),ie(s.componentsDir,u.join(c,"agent","src","components")),s.libDir&&ie(s.libDir,u.join(c,"agent","src","lib")),s.publicDir&&ie(s.publicDir,u.join(c,"agent","public")),kt(r,c);let d=u.join(o,"survey-ui-config.json");m.existsSync(d)&&m.copyFileSync(d,u.join(c,"agent","survey-ui-config.json"));let g=fe(o),w=u.join(c,"src","survey-theme.css");m.writeFileSync(w,g?m.readFileSync(g,"utf8"):m.readFileSync(u.join(r,"templates","survey-theme.css"),"utf8")),m.mkdirSync(u.join(c,"src","entries"),{recursive:!0});for(let T of n)m.mkdirSync(u.join(c,T),{recursive:!0}),m.writeFileSync(u.join(c,T,"index.html"),`<!DOCTYPE html>
117
127
  <html lang="en">
118
128
  <head>
119
129
  <meta charset="UTF-8" />
120
130
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
121
- <title>${et(f)} \u2014 CFM Preview</title>
131
+ <title>${Pt(T)} \u2014 CFM Preview</title>
122
132
  </head>
123
133
  <body>
124
134
  <div id="root"></div>
125
- <script type="module" src="../src/entries/${f}.tsx"></script>
135
+ <script type="module" src="../src/entries/${T}.tsx"></script>
126
136
  </body>
127
- </html>`),u.writeFileSync(p.join(a,"src","entries",`${f}.tsx`),Ko(f));u.writeFileSync(p.join(a,"tsconfig.json"),JSON.stringify({compilerOptions:{target:"ES2020",lib:["ES2020","DOM","DOM.Iterable"],module:"ESNext",moduleResolution:"bundler",jsx:"react-jsx",strict:!0,skipLibCheck:!0,paths:{"@/*":["./agent/src/*"]}},include:["src","agent/src","stubs"]},null,2)),Yo(a,o,i,n);let m=Qo(i,o),C=Ae(o).join(p.delimiter);Xo(`node "${m}" build --config "${p.join(a,"vite.config.mjs")}"`,{cwd:a,stdio:"inherit",env:{...process.env,NODE_PATH:C}});let S=p.join(t,"previews");u.mkdirSync(S,{recursive:!0});let E=p.join(a,"dist"),v=u.readFileSync(p.join(i,"templates","preview-harness","preview-bridge.inline.js"),"utf8");for(let f of n){let T=p.join(E,f),$=p.join(S,f);if(!u.existsSync(p.join(T,"index.html")))throw new Error(`Vite build did not produce ${f}/index.html`);u.existsSync($)&&u.rmSync($,{recursive:!0,force:!0}),G(T,$),Zo(p.join($,"index.html"),v)}let x=p.join(E,"assets");u.existsSync(x)&&G(x,p.join(S,"assets"));let d=p.join(a,"agent","public");if(u.existsSync(d))for(let f of u.readdirSync(d)){let T=p.join(d,f);u.statSync(T).isFile()&&u.copyFileSync(T,p.join(S,f))}u.rmSync(a,{recursive:!0,force:!0})}import*as _e from"fs";import*as De from"path";function Te(e){if(e)return e;let o=process.cwd();if(_e.existsSync(De.join(o,"src","components","Question.tsx")))return o;let t=process.env.INIT_CWD;return t&&_e.existsSync(De.join(t,"src","components","Question.tsx"))?t:o}var D=c;function ot(){return R.join(__dirname,"..","..","templates")}function tt(e){let o=I.readFileSync(e,"utf8"),t=new Set,n=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"];for(let i of n)o.includes(i)&&t.add(i);return t.size?[...t]:n}function nt(e,o){let t=["header","footer","chrome","survey_page","intro","end"],n={MCQ:["MCQ_single","MCQ_multiple"],TEXTFIELD:["TEXTFIELD_short","TEXTFIELD_long"],NPS_SCALE:["NPS_SCALE"],CFM_MATRIX:["CFM_likert","CFM_bipolar"],CSAT_MATRIX:["CSAT_emoji","CSAT_star","CSAT_numbered","CSAT_graphics","CSAT_carousel","CSAT_dropdown"],RATING_MATRIX:["RATING_star","RATING_numbered","RATING_radio","RATING_emoji","RATING_graphics","RATING_slider"],SLIDER_MATRIX:["SLIDER_matrix"],FILE_UPLOAD:["FILE_UPLOAD"],HEATMAP:["HEATMAP"],RANK_ORDER:["RANK_drag","RANK_dropdown"]},i=new Set(t);for(let s of o)for(let r of n[s]??[])i.add(r);return e.filter(s=>i.has(s))}function Oe(e,o,t){if(I.existsSync(e))for(let n of I.readdirSync(e)){let i=R.join(e,n),s=R.posix.join(o,n);if(I.statSync(i).isDirectory())Oe(i,s,t);else{let r=R.extname(n).toLowerCase(),a=r===".html"?"text/html":r===".css"?"text/css":r===".js"?"application/javascript":r===".json"?"application/json":r===".svg"?"image/svg+xml":r===".jpg"||r===".jpeg"?"image/jpeg":r===".png"?"image/png":"application/octet-stream";t.push({path:s,contentType:a,sizeBytes:I.statSync(i).size})}}}async function se(e={}){let o=Te(e.projectRoot),t=e.outputDir??R.join(o,"out"),n=ot(),i=R.join(n,"preview-harness");e.useTemplatesOnly&&console.log(`${D.dim} Using SDK template preview harness only (--use-templates-only)${D.reset}`);let s=R.join(i,"previewPages.js"),{PREVIEW_PAGE_DEFS:r,buildPreviewHtml:a,PREVIEW_KEYS:l}=we(s),y=(()=>{let d=ne(o);return d?(console.log(`${D.dim} Using project theme: ${R.relative(o,d)}${D.reset}`),I.readFileSync(d,"utf8")):I.readFileSync(R.join(n,"survey-theme.css"),"utf8")})(),m=I.readFileSync(R.join(i,"preview-bridge.inline.js"),"utf8"),C=e.surveyTypes;if(!C){let d=R.join(o,"implementation_plan.md");C=I.existsSync(d)?tt(d):["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"]}let S=nt(l,C),E=R.join(t,"previews");if(I.existsSync(E)&&(I.rmSync(E,{recursive:!0,force:!0}),console.log(`${D.dim} Cleared previous preview output${D.reset}`)),I.mkdirSync(E,{recursive:!0}),!e.useTemplatesOnly)try{console.log(`${D.dim} Building previews from agent components (Vite)\u2026${D.reset}`),await go({projectRoot:o,outputDir:t,keys:S});let d={};for(let T of S)d[T]=`previews/${T}/index.html`;I.writeFileSync(R.join(t,"previews","manifest.json"),JSON.stringify(d,null,2));let f=[];return Oe(R.join(t,"previews"),"previews",f),console.log(`${D.green}\u2705 Exported ${S.length} agent component previews \u2192 ${t}${D.reset}`),{outputDir:t,manifestPath:R.join(t,"previews","manifest.json"),files:f,surveyTypes:C}}catch(d){console.warn(`${D.yellow}\u26A0 Agent Vite preview build failed; falling back to template harness.${D.reset}`),console.warn(`${D.dim} ${O(d)}${D.reset}`)}for(let d of r){if(!S.includes(d.key))continue;let f=R.join(t,"previews",d.key);I.mkdirSync(f,{recursive:!0}),I.writeFileSync(R.join(f,"index.html"),a(d,y,m))}let v={};for(let d of S)v[d]=`previews/${d}/index.html`;I.writeFileSync(R.join(t,"previews","manifest.json"),JSON.stringify(v,null,2));let x=[];return Oe(R.join(t,"previews"),"previews",x),console.log(`${D.green}\u2705 Exported ${S.length} preview pages \u2192 ${t}${D.reset}`),{outputDir:t,manifestPath:R.join(t,"previews","manifest.json"),files:x,surveyTypes:C}}var j=c,me=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"];function mo(e){return new Promise(o=>{let t=he.createServer();t.listen(e,()=>{t.close(()=>o(e))}),t.on("error",()=>o(mo(e+1)))})}function uo(e){return new Promise((o,t)=>{let n="";e.on("data",i=>n+=i),e.on("end",()=>o(n)),e.on("error",t)})}function it(e){let{exec:o}=we("child_process"),t=process.platform==="darwin"?`open "${e}"`:process.platform==="win32"?`start "" "${e}"`:`xdg-open "${e}"`;o(t)}function po(e){let o=F.extname(e).toLowerCase();return{".html":"text/html",".js":"application/javascript",".css":"text/css",".json":"application/json",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".woff2":"font/woff2",".ico":"image/x-icon"}[o]??"application/octet-stream"}function rt(e){let o=new Set,t,n=e.match(/\*\*instanceId:\*\*\s*(.+)/i);if(n){let s=n[1].replace(/[()[\]]/g,"").trim();s&&!s.startsWith("(")&&s!=="JWT"&&(t=s)}for(let s of me)e.includes(s)&&o.add(s);let i=e.matchAll(/\|\s*`([A-Z_]+)`\s*\|/g);for(let s of i)me.includes(s[1])&&o.add(s[1]);return{surveyTypes:o.size>0?[...o]:[...me],instanceId:t}}async function st(e){return new Promise(o=>{try{let t=he.get(e,n=>{o((n.statusCode??500)<500),n.resume()});t.on("error",()=>o(!1)),t.setTimeout(2e3,()=>{t.destroy(),o(!1)})}catch{o(!1)}})}function Le(e){let o=F.join(e,"out","previews");k.existsSync(o)&&(k.rmSync(o,{recursive:!0,force:!0}),console.log(`${j.dim} Removed local preview files: out/previews/${j.reset}`))}async function ho(){let e=process.env.INIT_CWD||process.cwd(),o=F.join(e,"public"),t=F.join(e,"survey-ui-config.json"),n=F.join(e,"implementation_plan.md"),i=F.join(__dirname,"..","..","templates"),s=F.join(i,"wizard-dist"),r=process.env.CFM_PREVIEW_URL??"http://localhost:3000",a={},l=F.join(e,"out","previews"),y=F.join(l,"manifest.json");k.existsSync(y)||(console.log(`${j.dim} Exporting component previews for local wizard\u2026${j.reset}`),await se({projectRoot:e,surveyTypes:[...me]})),k.existsSync(y)&&(a=JSON.parse(k.readFileSync(y,"utf8")));let m=await mo(4200),C=`http://localhost:${m}`;return new Promise((S,E)=>{let v=he.createServer(async(d,f)=>{try{let T=d.url??"/";if(d.method==="GET"&&T==="/api/inventory"){let $;if(k.existsSync(n)){let w=k.readFileSync(n,"utf8");$=rt(w).instanceId}if(k.existsSync(t))try{let w=JSON.parse(k.readFileSync(t,"utf8"));w.instanceId&&($=w.instanceId)}catch{}let h=[...me],{config:P}=re({projectRoot:e,surveyTypes:h,instanceId:$});f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({surveyTypes:h,instanceId:$,previewUrl:r,initialConfig:P,previewManifest:Object.fromEntries(Object.keys(a).map(w=>[w,`${C}/previews/${w}/index.html`]))}));return}if(d.method==="GET"&&T==="/api/preview-url"){let $=await st(r);f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({url:r,connected:$}));return}if(d.method==="POST"&&T.split("?")[0]==="/api/wizard-quit"){Le(e),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!0,deleted:"out/previews"})),setTimeout(()=>{v.close(()=>{E(new Error("Client quit the wizard without saving. Local preview garbage collection complete (out/previews removed)."))})},300);return}if(d.method==="POST"&&T==="/api/upload-logo"){let $=await uo(d),h=JSON.parse($);k.existsSync(o)||k.mkdirSync(o,{recursive:!0});let P=h.base64.replace(/^data:image\/\w+;base64,/,""),w=Buffer.from(P,"base64"),A=F.extname(h.filename),M=F.basename(h.filename,A).toLowerCase().replace(/[^a-z0-9_-]/g,""),ee=`logo_${Date.now()}_${M}${A||".png"}`;k.writeFileSync(F.join(o,ee),w),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({fileName:ee}));return}if(d.method==="POST"&&T==="/api/save-config"){let $=await uo(d),h=JSON.parse($);h.configuredAt=new Date().toISOString();let P=h.global?.logo;P?.url?.startsWith("data:")&&(P.url=null),k.writeFileSync(t,JSON.stringify(h,null,2),"utf8"),console.log(`
128
- ${j.green}\u2705 UI configuration saved to ${t}${j.reset}`),Le(e),console.log(`${j.dim} Local preview garbage collection complete (out/previews removed)${j.reset}`),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!0})),setTimeout(()=>{v.close(()=>S())},500);return}if(d.method==="GET"){let $=T.split("?")[0];if($==="/"&&($="/index.html"),$.startsWith("/previews/")&&k.existsSync(l)){let w=$.replace(/^\/previews\//,""),A=F.join(l,w),M=F.normalize(A);if(M.startsWith(l)&&k.existsSync(M)&&k.statSync(M).isFile()){let ee=k.readFileSync(M);f.writeHead(200,{"Content-Type":po(M)}),f.end(ee);return}}let h=k.existsSync(s),P=h?F.join(s,$):F.join(i,"wizard.html");if(h&&k.existsSync(P)&&k.statSync(P).isFile()){let w=k.readFileSync(P);f.writeHead(200,{"Content-Type":po(P)}),f.end(w);return}if(!h&&$==="/index.html"){let w=k.readFileSync(F.join(i,"wizard.html"),"utf8");f.writeHead(200,{"Content-Type":"text/html"}),f.end(w);return}}f.writeHead(404,{"Content-Type":"text/plain"}),f.end("Not found")}catch(T){f.writeHead(500,{"Content-Type":"text/plain"}),f.end(`Server error: ${O(T)}`)}});v.listen(m,()=>{let d=C;console.log(`
129
- ${j.bold}${j.cyan}\u{1F3A8} Survey UI Customization Wizard${j.reset}`),console.log(`${j.bold}\u{1F517} Client wizard link \u2014 share this URL only:${j.reset}`),console.log(` ${j.green}${d}${j.reset}`),console.log(`${j.dim} Port ${m} (auto-selected if 4200 was in use)${j.reset}`),console.log(`${j.dim} Live previews: ${j.reset}${Object.keys(a).length} components`),console.log(`${j.dim} Preview target: ${j.reset}${r}`),console.log(`${j.dim} Default wizard \u2014 saves directly to survey-ui-config.json when client clicks Review & Build${j.reset}
130
- `),it(d)}),v.on("error",E);let x=()=>{Le(e),v.close(()=>process.exit(130))};process.once("SIGINT",x),process.once("SIGTERM",x)})}U();import*as fe from"fs";import*as xo from"path";import*as To from"http";import*as ko from"https";be();pe();Ee();Re();var g=c;function lt(e){let{exec:o}=we("child_process"),t=process.platform==="darwin"?`open "${e}"`:process.platform==="win32"?`start "" "${e}"`:`xdg-open "${e}"`;o(t)}function ft(e){return new Promise(o=>setTimeout(o,e))}async function ze(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?ko:To).request(i,{method:o.method??"GET",headers:o.headers??{}},a=>{let l="";a.on("data",y=>l+=y),a.on("end",()=>{if((a.statusCode??500)>=400){n(new Error(`HTTP ${a.statusCode}: ${l}`));return}try{t(JSON.parse(l))}catch{n(new Error(`Invalid JSON: ${l.slice(0,200)}`))}})});r.on("error",n),o.body&&r.write(o.body),r.end()})}async function dt(e,o,t,n){return new Promise((i,s)=>{let r=new URL(e),a=r.protocol==="https:"?ko:To,l={"Content-Type":t,"Content-Length":o.length};n&&(l["X-Wizard-Session"]=n.sessionSecret,l["X-Wizard-Session-Id"]=n.sessionId);let y=a.request(r,{method:"PUT",headers:l},m=>{if((m.statusCode??500)>=400){let C="";m.on("data",S=>C+=S),m.on("end",()=>s(new Error(`PUT failed ${m.statusCode}: ${C}`)));return}m.resume(),i()});y.on("error",s),y.write(o),y.end()})}function gt(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function Po(e={}){let o=e.wait!==!1,t=e.pollIntervalMs??Number(process.env.CFM_WIZARD_POLL_MS??3e3),n=e.timeoutMs??Number(process.env.CFM_WIZARD_TIMEOUT_MS??72e5),i=process.env.CFM_INSTANCE_ID,s=(process.env.CFM_DEPLOY_API_BASE??"http://localhost:3000").replace(/\/$/,"");if(!i)throw new Error("CFM_INSTANCE_ID (JWT) is required");let r=gt(i);if(!r)throw new Error("Could not parse surveyId from CFM_INSTANCE_ID JWT");let a=Te(),l=K(a),y=l.activeConfigPath,m=e.apply?!1:e.review!==!1;console.log(`
131
- ${g.bold}${g.cyan}\u{1F3A8} CFM UI Customization (AWS)${g.reset}
132
- `),m&&(console.log(`${g.dim} Review mode: seed kept in survey-ui-config.json; final + diff written on complete.${g.reset}`),console.log(`${g.dim} Apply later with: npx cfm-sdk confirm-ui-config${g.reset}
133
- `));let C=[...Q],{outputDir:S,files:E}=await se({projectRoot:a,useTemplatesOnly:e.useTemplatesOnly,surveyTypes:C}),v=E.map(h=>({path:h.path,contentType:h.contentType,sizeBytes:h.sizeBytes})),{config:x,source:d}=re({projectRoot:a,surveyTypes:C,instanceId:r});x.surveyTypes=C,Fe(d),m&&(fe.writeFileSync(l.seedPath,JSON.stringify(x,null,2),"utf8"),fe.writeFileSync(y,JSON.stringify(x,null,2),"utf8"),console.log(`${g.dim} Seed snapshot \u2192 survey-ui-config.json (+ .seed.json)${g.reset}`));let f=await ze(`${s}/wizard/session/start`,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({files:v,surveyTypes:C,initialConfig:x})});console.log(`${g.dim} Uploading ${v.length} preview files\u2026${g.reset}`);for(let h of f.uploads){let P=xo.join(S,h.path),w=fe.readFileSync(P),A=v.find(M=>M.path===h.path)?.contentType??"application/octet-stream";await dt(h.uploadUrl,w,A,{sessionId:f.sessionId,sessionSecret:f.sessionSecret})}if(await ze(`${s}/wizard/previews/upload/complete`,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({sessionId:f.sessionId})}),console.log(`${g.green}\u2705 Previews uploaded${g.reset}`),console.log(`${g.dim} ${v.length} component preview page(s) \u2192 EC2 local server (disk)${g.reset}`),console.log(`
134
- ${g.bold}${g.cyan}\u{1F517} Client wizard link \u2014 share with the client:${g.reset}`),console.log(`${g.green} ${f.wizardUrl}${g.reset}`),console.log(`${g.dim} (Deployed on EC2 \u2014 client customizes here; agent keeps CLI open until submit)${g.reset}
135
- `),lt(f.wizardUrl),!o){console.log(`${g.yellow}--no-wait: wizard URL (not polling):${g.reset}`),console.log(f.wizardUrl),m&&console.log(`${g.dim} When wizard completes, poll manually or re-run without --no-wait to capture final + diff.${g.reset}`);return}let T=Date.now()+n,$=0;for(;Date.now()<T;){$+=1,process.stdout.write(`\r${g.dim}Waiting for client to finish wizard\u2026 (poll ${$})${g.reset}`);let h=await ze(`${s}/wizard/config/${encodeURIComponent(r)}?sessionId=${f.sessionId}`,{headers:{Authorization:`Bearer ${i}`}});if(h.status==="abandoned")throw console.log(`
136
- ${g.yellow}\u26A0 Client quit the wizard \u2014 session cleaned up on S3${g.reset}`),new Error("Client quit the wizard without saving. S3 preview garbage was removed. Re-run customize-ui to start a new session.");if(h.status==="ready"&&h.config){let P=ve(h)??h.config;if(console.log(`
137
- ${g.green}\u2705 Configuration ready${g.reset}`),h.logoUrl&&console.log(`${g.dim} Logo URL: ${h.logoUrl}${g.reset}`),m){let A=Pe(a,x,P);console.log(`${g.green} Seed (unchanged active): ${y}${g.reset}`),console.log(`${g.green} Final: ${l.finalPath}${g.reset}`),console.log(`${g.green} Diff: ${l.diffMdPath}${g.reset}`),console.log(`${g.yellow} ${A.changed.length} changed, ${A.added.length} added, ${A.removed.length} removed${g.reset}`);let M=P.global?.logo;if(M?.fileName)try{await Z({projectRoot:a,fileName:M.fileName,logoUrl:h.logoUrl,jwt:i,apiBase:s,surveyId:r}),console.log(`${g.green} Logo saved to public/${M.fileName}${g.reset}`)}catch(ee){console.warn(`${g.yellow} Logo download deferred: ${O(ee)}${g.reset}`)}console.log(`${g.dim} Apply when ready: npx cfm-sdk confirm-ui-config${g.reset}`);return}fe.writeFileSync(y,JSON.stringify(P,null,2),"utf8"),console.log(`${g.green} Written ${y}${g.reset}`);let w=P.global?.logo;w?.fileName&&(await Z({projectRoot:a,fileName:w.fileName,logoUrl:h.logoUrl,jwt:i,apiBase:s,surveyId:r}),console.log(`${g.green} Logo saved to public/${w.fileName}${g.reset}`));return}await ft(t)}throw new Error("Timed out waiting for wizard completion")}pe();U();var N=c,q=process.argv.slice(2),X=q[0];async function bt(){if(X==="customize"||X==="init"){X==="init"&&console.log(`${N.yellow}\u26A0 cfm-sdk init is deprecated. Use \`cfm-sdk customize\` instead.${N.reset}
138
- `);try{await ho()}catch(e){console.error(`
139
- ${N.red}\u274C Error: ${O(e)}${N.reset}`),process.exit(1)}}else if(X==="customize-ui"){let e=q.includes("--use-templates-only"),o=q.includes("--no-wait"),t=q.includes("--apply"),n=q.includes("--no-review")?!1:!t;try{await Po({useTemplatesOnly:e,wait:!o,review:n,apply:t})}catch(i){console.error(`
140
- ${N.red}\u274C Error: ${O(i)}${N.reset}`),process.exit(1)}}else if(X==="confirm-ui-config"){let e=q.includes("--diff-only");try{let{runConfirmUiConfig:o}=await Promise.resolve().then(()=>(vo(),Eo));await o({diffOnly:e})}catch(o){console.error(`
141
- ${N.red}\u274C Error: ${O(o)}${N.reset}`),process.exit(1)}}else if(X==="fetch-ui-config"){let o=q.find(t=>t.startsWith("--session="))?.split("=")[1];try{let{runFetchUiConfig:t}=await Promise.resolve().then(()=>(Io(),Ro));await t({sessionId:o})}catch(t){console.error(`
142
- ${N.red}\u274C Error: ${O(t)}${N.reset}`),process.exit(1)}}else if(X==="export-previews"){let e=q.includes("--use-templates-only");try{await se({useTemplatesOnly:e})}catch(o){console.error(`
143
- ${N.red}\u274C Error: ${O(o)}${N.reset}`),process.exit(1)}}else if(X==="resolve-ui-config"){let e=q.includes("--write");try{if(e){let o=Ne();console.log(`${N.green}\u2705 Wrote ${o}${N.reset}`)}else{let{resolveInitialConfig:o}=await Promise.resolve().then(()=>(pe(),fo)),{config:t,source:n}=o({surveyTypes:[]});console.log(JSON.stringify({source:n,config:t},null,2))}}catch(o){console.error(`
144
- ${N.red}\u274C Error: ${O(o)}${N.reset}`),process.exit(1)}}else if(X==="deploy")try{await Xe()}catch(e){console.error(`
145
- ${N.red}\u274C Error: ${O(e)}${N.reset}`),process.exit(1)}else console.log(`
146
- ${N.bold}${N.cyan}CFM SDK CLI Tool${N.reset}`),console.log(`
147
- Usage:`),console.log(" npx cfm-sdk customize \u2013 Local UI customization wizard"),console.log(" npx cfm-sdk customize-ui \u2013 AWS wizard (review mode: seed + diff, no auto-apply)"),console.log(" npx cfm-sdk customize-ui --apply \u2013 AWS wizard (legacy: write final config immediately)"),console.log(" npx cfm-sdk confirm-ui-config \u2013 Apply survey-ui-config.final.json after review"),console.log(" npx cfm-sdk fetch-ui-config \u2013 Pull final + diff after client completes (--no-wait)"),console.log(" npx cfm-sdk export-previews \u2013 Build component preview pages only"),console.log(" npx cfm-sdk resolve-ui-config --write \u2013 Write draft survey-ui-config.json from project"),console.log(" npx cfm-sdk deploy \u2013 Deploy to Vercel"),process.exit(0)}bt();
137
+ </html>`),m.writeFileSync(u.join(c,"src","entries",`${T}.tsx`),At(T));m.writeFileSync(u.join(c,"tsconfig.json"),JSON.stringify({compilerOptions:{target:"ES2020",lib:["ES2020","DOM","DOM.Iterable"],module:"ESNext",moduleResolution:"bundler",jsx:"react-jsx",strict:!0,skipLibCheck:!0,paths:{"@/*":["./agent/src/*"]}},include:["src","agent/src","stubs"]},null,2)),Et(c,o,r,n);let S=$t(r,o),x=Qe(o).join(u.delimiter);Tt(`node "${S}" build --config "${u.join(c,"vite.config.mjs")}"`,{cwd:c,stdio:"inherit",env:{...process.env,NODE_PATH:x}});let E=u.join(t,"previews");m.mkdirSync(E,{recursive:!0});let A=u.join(c,"dist"),R=m.readFileSync(u.join(r,"templates","preview-harness","preview-bridge.inline.js"),"utf8");for(let T of n){let $=u.join(A,T),h=u.join(E,T);if(!m.existsSync(u.join($,"index.html")))throw new Error(`Vite build did not produce ${T}/index.html`);m.existsSync(h)&&m.rmSync(h,{recursive:!0,force:!0}),ie($,h),Ft(u.join(h,"index.html"),R)}let f=u.join(A,"assets");m.existsSync(f)&&ie(f,u.join(E,"assets"));let y=u.join(c,"agent","public");if(m.existsSync(y))for(let T of m.readdirSync(y)){let $=u.join(y,T);m.statSync($).isFile()&&m.copyFileSync($,u.join(E,T))}m.rmSync(c,{recursive:!0,force:!0})}import*as Ke from"fs";import*as Ye from"path";function Le(e){if(e)return e;let o=process.cwd();if(Ke.existsSync(Ye.join(o,"src","components","Question.tsx")))return o;let t=process.env.INIT_CWD;return t&&Ke.existsSync(Ye.join(t,"src","components","Question.tsx"))?t:o}var Po=["header","footer","survey_page"],Io={MCQ:["MCQ_single","MCQ_multiple"],TEXTFIELD:["TEXTFIELD_short","TEXTFIELD_long"],NPS_SCALE:["NPS_SCALE"],CFM_MATRIX:["CFM_likert","CFM_bipolar","CFM_transpose","CFM_carousel","CFM_dropdown"],TEXT_AND_MEDIA:["TEXT_AND_MEDIA"],CSAT_MATRIX:["CSAT_emoji","CSAT_star","CSAT_numbered","CSAT_graphics","CSAT_carousel","CSAT_dropdown"],RATING_MATRIX:["RATING_star","RATING_numbered","RATING_radio","RATING_emoji","RATING_graphics","RATING_slider"],SLIDER_MATRIX:["SLIDER_matrix"],FILE_UPLOAD:["FILE_UPLOAD"],HEATMAP:["HEATMAP"],RANK_ORDER:["RANK_drag","RANK_dropdown"]},mr=[...Po,...Object.values(Io).flat()];function No(e){let o=new Set(Po);for(let t of e)for(let n of Io[t]??[])o.add(n);return[...o]}var B=a;function It(){return N.join(__dirname,"..","..","templates")}function Nt(e){let o=j.readFileSync(e,"utf8"),t=new Set,n=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"];for(let r of n)o.includes(r)&&t.add(r);return t.size?[...t]:n}function jt(e,o){let t=new Set(No(o));return e.filter(n=>t.has(n))}function Ze(e,o,t){if(j.existsSync(e))for(let n of j.readdirSync(e)){let r=N.join(e,n),i=N.posix.join(o,n);if(j.statSync(r).isDirectory())Ze(r,i,t);else{let s=N.extname(n).toLowerCase(),c=s===".html"?"text/html":s===".css"?"text/css":s===".js"?"application/javascript":s===".json"?"application/json":s===".svg"?"image/svg+xml":s===".jpg"||s===".jpeg"?"image/jpeg":s===".png"?"image/png":"application/octet-stream";t.push({path:i,contentType:c,sizeBytes:j.statSync(r).size})}}}async function ge(e={}){let o=Le(e.projectRoot),t=e.outputDir??N.join(o,"out"),n=It(),r=N.join(n,"preview-harness");e.useTemplatesOnly&&console.log(`${B.dim} Using SDK template preview harness only (--use-templates-only)${B.reset}`);let i=N.join(r,"previewPages.js"),{PREVIEW_PAGE_DEFS:s,buildPreviewHtml:c,PREVIEW_KEYS:d}=Pe(i),g=(()=>{let f=fe(o);return f?(console.log(`${B.dim} Using project theme: ${N.relative(o,f)}${B.reset}`),j.readFileSync(f,"utf8")):j.readFileSync(N.join(n,"survey-theme.css"),"utf8")})(),w=j.readFileSync(N.join(r,"preview-bridge.inline.js"),"utf8"),S=e.surveyTypes;if(!S){let f=N.join(o,"implementation_plan.md");S=j.existsSync(f)?Nt(f):["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"]}let x=jt(d,S),E=N.join(t,"previews");if(j.existsSync(E)&&(j.rmSync(E,{recursive:!0,force:!0}),console.log(`${B.dim} Cleared previous preview output${B.reset}`)),j.mkdirSync(E,{recursive:!0}),!e.useTemplatesOnly)try{console.log(`${B.dim} Building previews from agent components (Vite)\u2026${B.reset}`),await Fo({projectRoot:o,outputDir:t,keys:x});let f={};for(let T of x)f[T]=`previews/${T}/index.html`;j.writeFileSync(N.join(t,"previews","manifest.json"),JSON.stringify(f,null,2));let y=[];return Ze(N.join(t,"previews"),"previews",y),console.log(`${B.green}\u2705 Exported ${x.length} agent component previews \u2192 ${t}${B.reset}`),{outputDir:t,manifestPath:N.join(t,"previews","manifest.json"),files:y,surveyTypes:S}}catch(f){console.warn(`${B.yellow}\u26A0 Agent Vite preview build failed; falling back to template harness.${B.reset}`),console.warn(`${B.dim} ${U(f)}${B.reset}`)}for(let f of s){if(!x.includes(f.key))continue;let y=N.join(t,"previews",f.key);j.mkdirSync(y,{recursive:!0}),j.writeFileSync(N.join(y,"index.html"),c(f,g,w))}let A={};for(let f of x)A[f]=`previews/${f}/index.html`;j.writeFileSync(N.join(t,"previews","manifest.json"),JSON.stringify(A,null,2));let R=[];return Ze(N.join(t,"previews"),"previews",R),console.log(`${B.green}\u2705 Exported ${x.length} preview pages \u2192 ${t}${B.reset}`),{outputDir:t,manifestPath:N.join(t,"previews","manifest.json"),files:R,surveyTypes:S}}var I=a,Ae=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"];function Ho(e){return new Promise(o=>{let t=Ee.createServer();t.listen(e,()=>{t.close(()=>o(e))}),t.on("error",()=>o(Ho(e+1)))})}function Wo(e){return new Promise((o,t)=>{let n="";e.on("data",r=>n+=r),e.on("end",()=>o(n)),e.on("error",t)})}function cn(e){let{exec:o}=Pe("child_process"),t=process.platform==="darwin"?`open "${e}"`:process.platform==="win32"?`start "" "${e}"`:`xdg-open "${e}"`;o(t)}function Xo(e){let o=L.extname(e).toLowerCase();return{".html":"text/html",".js":"application/javascript",".css":"text/css",".json":"application/json",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".woff2":"font/woff2",".ico":"image/x-icon"}[o]??"application/octet-stream"}function an(e){let o=new Set,t,n=e.match(/\*\*instanceId:\*\*\s*(.+)/i);if(n){let i=n[1].replace(/[()[\]]/g,"").trim();i&&!i.startsWith("(")&&i!=="JWT"&&(t=i)}for(let i of Ae)e.includes(i)&&o.add(i);let r=e.matchAll(/\|\s*`([A-Z_]+)`\s*\|/g);for(let i of r)Ae.includes(i[1])&&o.add(i[1]);return{surveyTypes:o.size>0?[...o]:[...Ae],instanceId:t}}async function ln(e){return new Promise(o=>{try{let t=Ee.get(e,n=>{o((n.statusCode??500)<500),n.resume()});t.on("error",()=>o(!1)),t.setTimeout(2e3,()=>{t.destroy(),o(!1)})}catch{o(!1)}})}function ro(e){let o=L.join(e,"out","previews");P.existsSync(o)&&(P.rmSync(o,{recursive:!0,force:!0}),console.log(`${I.dim} Removed local preview files: out/previews/${I.reset}`))}async function Vo(){let e=process.env.INIT_CWD||process.cwd(),o=L.join(e,"public"),t=L.join(e,"survey-ui-config.json"),n=L.join(e,"implementation_plan.md"),r=L.join(__dirname,"..","..","templates"),i=L.join(r,"wizard-dist"),s=process.env.CFM_PREVIEW_URL??"http://localhost:3000",c={},d=L.join(e,"out","previews"),g=L.join(d,"manifest.json");console.log(`${I.dim} Exporting component previews for local wizard\u2026${I.reset}`),await ge({projectRoot:e,surveyTypes:[...Ae]}),P.existsSync(g)&&(c=JSON.parse(P.readFileSync(g,"utf8")));let w=await Ho(4200),S=`http://localhost:${w}`;return new Promise((x,E)=>{let A=Ee.createServer(async(f,y)=>{try{let T=f.url??"/";if(f.method==="GET"&&T==="/api/inventory"){let $;if(P.existsSync(n)){let C=P.readFileSync(n,"utf8");$=an(C).instanceId}if(P.existsSync(t))try{let C=JSON.parse(P.readFileSync(t,"utf8"));C.instanceId&&($=C.instanceId)}catch{}let h=[...Ae],{config:F}=me({projectRoot:e,surveyTypes:h,instanceId:$});y.writeHead(200,{"Content-Type":"application/json"}),y.end(JSON.stringify({surveyTypes:h,instanceId:$,previewUrl:s,initialConfig:F,previewManifest:Object.fromEntries(Object.keys(c).map(C=>[C,`${S}/previews/${C}/index.html`]))}));return}if(f.method==="GET"&&T==="/api/preview-url"){let $=await ln(s);y.writeHead(200,{"Content-Type":"application/json"}),y.end(JSON.stringify({url:s,connected:$}));return}if(f.method==="POST"&&T.split("?")[0]==="/api/wizard-quit"){ro(e),y.writeHead(200,{"Content-Type":"application/json"}),y.end(JSON.stringify({ok:!0,deleted:"out/previews"})),setTimeout(()=>{A.close(()=>{E(new Error("Client quit the wizard without saving. Local preview garbage collection complete (out/previews removed)."))})},300);return}if(f.method==="POST"&&T==="/api/upload-logo"){let $=await Wo(f),h=JSON.parse($);P.existsSync(o)||P.mkdirSync(o,{recursive:!0});let F=h.base64.replace(/^data:image\/\w+;base64,/,""),C=Buffer.from(F,"base64"),O=L.extname(h.filename),H=L.basename(h.filename,O).toLowerCase().replace(/[^a-z0-9_-]/g,""),re=`logo_${Date.now()}_${H}${O||".png"}`;P.writeFileSync(L.join(o,re),C),y.writeHead(200,{"Content-Type":"application/json"}),y.end(JSON.stringify({fileName:re}));return}if(f.method==="POST"&&T==="/api/save-config"){let $=await Wo(f),h=JSON.parse($);h.configuredAt=new Date().toISOString();let F=h.global?.logo;F?.url?.startsWith("data:")&&(F.url=null),P.writeFileSync(t,JSON.stringify(h,null,2),"utf8"),console.log(`
138
+ ${I.green}\u2705 UI configuration saved to ${t}${I.reset}`);try{let{runApplyUiConfig:C}=await Promise.resolve().then(()=>(ke(),Re));C({projectRoot:e,configPath:t})}catch(C){console.log(`${I.yellow} CSS apply skipped: ${C instanceof Error?C.message:String(C)}${I.reset}`)}ro(e),console.log(`${I.dim} Local preview garbage collection complete (out/previews removed)${I.reset}`),y.writeHead(200,{"Content-Type":"application/json"}),y.end(JSON.stringify({ok:!0})),setTimeout(()=>{A.close(()=>x())},500);return}if(f.method==="GET"){let $=T.split("?")[0];if($==="/"&&($="/index.html"),$.startsWith("/previews/")&&P.existsSync(d)){let C=$.replace(/^\/previews\//,""),O=L.join(d,C),H=L.normalize(O);if(H.startsWith(d)&&P.existsSync(H)&&P.statSync(H).isFile()){let re=P.readFileSync(H);y.writeHead(200,{"Content-Type":Xo(H)}),y.end(re);return}}let h=P.existsSync(i),F=h?L.join(i,$):L.join(r,"wizard.html");if(h&&P.existsSync(F)&&P.statSync(F).isFile()){let C=P.readFileSync(F);y.writeHead(200,{"Content-Type":Xo(F)}),y.end(C);return}if(!h&&$==="/index.html"){let C=P.readFileSync(L.join(r,"wizard.html"),"utf8");y.writeHead(200,{"Content-Type":"text/html"}),y.end(C);return}}y.writeHead(404,{"Content-Type":"text/plain"}),y.end("Not found")}catch(T){y.writeHead(500,{"Content-Type":"text/plain"}),y.end(`Server error: ${U(T)}`)}});A.listen(w,()=>{let f=S;console.log(`
139
+ ${I.bold}${I.cyan}\u{1F3A8} Survey UI Customization Wizard${I.reset}`),console.log(`${I.bold}\u{1F517} Client wizard link \u2014 share this URL only:${I.reset}`),console.log(` ${I.green}${f}${I.reset}`),console.log(`${I.dim} Port ${w} (auto-selected if 4200 was in use)${I.reset}`),console.log(`${I.dim} Live previews: ${I.reset}${Object.keys(c).length} components`),console.log(`${I.dim} Preview target: ${I.reset}${s}`),console.log(`${I.dim} Default wizard \u2014 saves directly to survey-ui-config.json when client clicks Review & Build${I.reset}
140
+ `),cn(f)}),A.on("error",E);let R=()=>{ro(e),A.close(()=>process.exit(130))};process.once("SIGINT",R),process.once("SIGTERM",R)})}q();import*as we from"fs";import*as Ko from"path";import*as Yo from"http";import*as Zo from"https";Se();xe();$e();Xe();var p=a;function fn(e){let{exec:o}=Pe("child_process"),t=process.platform==="darwin"?`open "${e}"`:process.platform==="win32"?`start "" "${e}"`:`xdg-open "${e}"`;o(t)}function un(e){return new Promise(o=>setTimeout(o,e))}async function so(e,o={}){return new Promise((t,n)=>{let r=new URL(e),s=(r.protocol==="https:"?Zo:Yo).request(r,{method:o.method??"GET",headers:o.headers??{}},c=>{let d="";c.on("data",g=>d+=g),c.on("end",()=>{if((c.statusCode??500)>=400){n(new Error(`HTTP ${c.statusCode}: ${d}`));return}try{t(JSON.parse(d))}catch{n(new Error(`Invalid JSON: ${d.slice(0,200)}`))}})});s.on("error",n),o.body&&s.write(o.body),s.end()})}async function mn(e,o,t,n){return new Promise((r,i)=>{let s=new URL(e),c=s.protocol==="https:"?Zo:Yo,d={"Content-Type":t,"Content-Length":o.length};n&&(d["X-Wizard-Session"]=n.sessionSecret,d["X-Wizard-Session-Id"]=n.sessionId);let g=c.request(s,{method:"PUT",headers:d},w=>{if((w.statusCode??500)>=400){let S="";w.on("data",x=>S+=x),w.on("end",()=>i(new Error(`PUT failed ${w.statusCode}: ${S}`)));return}w.resume(),r()});g.on("error",i),g.write(o),g.end()})}function gn(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function et(e={}){let o=e.wait!==!1,t=e.pollIntervalMs??Number(process.env.CFM_WIZARD_POLL_MS??3e3),n=e.timeoutMs??Number(process.env.CFM_WIZARD_TIMEOUT_MS??72e5),r=process.env.CFM_INSTANCE_ID,i=(process.env.CFM_DEPLOY_API_BASE??"http://localhost:3000").replace(/\/$/,"");if(!r)throw new Error("CFM_INSTANCE_ID (JWT) is required");let s=gn(r);if(!s)throw new Error("Could not parse surveyId from CFM_INSTANCE_ID JWT");let c=Le(),d=te(c),g=d.activeConfigPath,w=e.apply?!1:e.review!==!1;console.log(`
141
+ ${p.bold}${p.cyan}\u{1F3A8} CFM UI Customization (AWS)${p.reset}
142
+ `),w&&(console.log(`${p.dim} Review mode: seed kept in survey-ui-config.json; final + diff written on complete.${p.reset}`),console.log(`${p.dim} Apply later with: npx cfm-sdk confirm-ui-config${p.reset}
143
+ `));let S=[...J],{outputDir:x,files:E}=await ge({projectRoot:c,useTemplatesOnly:e.useTemplatesOnly,surveyTypes:S}),A=E.map(h=>({path:h.path,contentType:h.contentType,sizeBytes:h.sizeBytes})),{config:R,source:f}=me({projectRoot:c,surveyTypes:S,instanceId:s});R.surveyTypes=S,Je(f),w&&(we.writeFileSync(d.seedPath,JSON.stringify(R,null,2),"utf8"),we.writeFileSync(g,JSON.stringify(R,null,2),"utf8"),console.log(`${p.dim} Seed snapshot \u2192 survey-ui-config.json (+ .seed.json)${p.reset}`));let y=await so(`${i}/wizard/session/start`,{method:"POST",headers:{Authorization:`Bearer ${r}`,"Content-Type":"application/json"},body:JSON.stringify({files:A,surveyTypes:S,initialConfig:R})});console.log(`${p.dim} Uploading ${A.length} preview files\u2026${p.reset}`);for(let h of y.uploads){let F=Ko.join(x,h.path),C=we.readFileSync(F),O=A.find(H=>H.path===h.path)?.contentType??"application/octet-stream";await mn(h.uploadUrl,C,O,{sessionId:y.sessionId,sessionSecret:y.sessionSecret})}if(await so(`${i}/wizard/previews/upload/complete`,{method:"POST",headers:{Authorization:`Bearer ${r}`,"Content-Type":"application/json"},body:JSON.stringify({sessionId:y.sessionId})}),console.log(`${p.green}\u2705 Previews uploaded${p.reset}`),console.log(`${p.dim} ${A.length} component preview page(s) \u2192 EC2 local server (disk)${p.reset}`),console.log(`
144
+ ${p.bold}${p.cyan}\u{1F517} Client wizard link \u2014 share with the client:${p.reset}`),console.log(`${p.green} ${y.wizardUrl}${p.reset}`),console.log(`${p.dim} (Deployed on EC2 \u2014 client customizes here; agent keeps CLI open until submit)${p.reset}
145
+ `),fn(y.wizardUrl),!o){console.log(`${p.yellow}--no-wait: wizard URL (not polling):${p.reset}`),console.log(y.wizardUrl),w&&console.log(`${p.dim} When wizard completes, poll manually or re-run without --no-wait to capture final + diff.${p.reset}`);return}let T=Date.now()+n,$=0;for(;Date.now()<T;){$+=1,process.stdout.write(`\r${p.dim}Waiting for client to finish wizard\u2026 (poll ${$})${p.reset}`);let h=await so(`${i}/wizard/config/${encodeURIComponent(s)}?sessionId=${y.sessionId}`,{headers:{Authorization:`Bearer ${r}`}});if(h.status==="abandoned")throw console.log(`
146
+ ${p.yellow}\u26A0 Client quit the wizard \u2014 session cleaned up on S3${p.reset}`),new Error("Client quit the wizard without saving. S3 preview garbage was removed. Re-run customize-ui to start a new session.");if(h.status==="ready"&&h.config){let F=We(h)??h.config;if(console.log(`
147
+ ${p.green}\u2705 Configuration ready${p.reset}`),h.logoUrl&&console.log(`${p.dim} Logo URL: ${h.logoUrl}${p.reset}`),w){let H=qe(c,R,F);console.log(`${p.green} Seed (unchanged active): ${g}${p.reset}`),console.log(`${p.green} Final: ${d.finalPath}${p.reset}`),console.log(`${p.green} Diff: ${d.diffMdPath}${p.reset}`),console.log(`${p.yellow} ${H.changed.length} changed, ${H.added.length} added, ${H.removed.length} removed${p.reset}`);let re=F.global?.logo;if(re?.fileName)try{await ae({projectRoot:c,fileName:re.fileName,logoUrl:h.logoUrl,jwt:r,apiBase:i,surveyId:s}),console.log(`${p.green} Logo saved to public/${re.fileName}${p.reset}`)}catch(it){console.warn(`${p.yellow} Logo download deferred: ${U(it)}${p.reset}`)}console.log(`${p.dim} Apply when ready: npx cfm-sdk confirm-ui-config (promotes JSON + regenerates survey-theme.css)${p.reset}`);return}we.writeFileSync(g,JSON.stringify(F,null,2),"utf8"),console.log(`${p.green} Written ${g}${p.reset}`);let{runApplyUiConfig:C}=await Promise.resolve().then(()=>(ke(),Re));C({projectRoot:c,configPath:g});let O=F.global?.logo;O?.fileName&&(await ae({projectRoot:c,fileName:O.fileName,logoUrl:h.logoUrl,jwt:r,apiBase:i,surveyId:s}),console.log(`${p.green} Logo saved to public/${O.fileName}${p.reset}`));return}await un(t)}throw new Error("Timed out waiting for wizard completion")}xe();q();var _=a,ne=process.argv.slice(2),Y=ne[0];async function Tn(){if(Y==="customize"||Y==="init"){Y==="init"&&console.log(`${_.yellow}\u26A0 cfm-sdk init is deprecated. Use \`cfm-sdk customize\` instead.${_.reset}
148
+ `);try{await Vo()}catch(e){console.error(`
149
+ ${_.red}\u274C Error: ${U(e)}${_.reset}`),process.exit(1)}}else if(Y==="customize-ui"){let e=ne.includes("--use-templates-only"),o=ne.includes("--no-wait"),t=ne.includes("--apply"),n=ne.includes("--no-review")?!1:!t;try{await et({useTemplatesOnly:e,wait:!o,review:n,apply:t})}catch(r){console.error(`
150
+ ${_.red}\u274C Error: ${U(r)}${_.reset}`),process.exit(1)}}else if(Y==="confirm-ui-config"){let e=ne.includes("--diff-only");try{let{runConfirmUiConfig:o}=await Promise.resolve().then(()=>(tt(),ot));await o({diffOnly:e})}catch(o){console.error(`
151
+ ${_.red}\u274C Error: ${U(o)}${_.reset}`),process.exit(1)}}else if(Y==="apply-ui-config")try{let{runApplyUiConfig:e}=await Promise.resolve().then(()=>(ke(),Re));e({})}catch(e){console.error(`
152
+ ${_.red}\u274C Error: ${U(e)}${_.reset}`),process.exit(1)}else if(Y==="fetch-ui-config"){let o=ne.find(t=>t.startsWith("--session="))?.split("=")[1];try{let{runFetchUiConfig:t}=await Promise.resolve().then(()=>(rt(),nt));await t({sessionId:o})}catch(t){console.error(`
153
+ ${_.red}\u274C Error: ${U(t)}${_.reset}`),process.exit(1)}}else if(Y==="export-previews"){let e=ne.includes("--use-templates-only");try{await ge({useTemplatesOnly:e})}catch(o){console.error(`
154
+ ${_.red}\u274C Error: ${U(o)}${_.reset}`),process.exit(1)}}else if(Y==="resolve-ui-config"){let e=ne.includes("--write");try{if(e){let o=Ge();console.log(`${_.green}\u2705 Wrote ${o}${_.reset}`)}else{let{resolveInitialConfig:o}=await Promise.resolve().then(()=>(xe(),Eo)),{config:t,source:n}=o({surveyTypes:[]});console.log(JSON.stringify({source:n,config:t},null,2))}}catch(o){console.error(`
155
+ ${_.red}\u274C Error: ${U(o)}${_.reset}`),process.exit(1)}}else if(Y==="deploy")try{await mo()}catch(e){console.error(`
156
+ ${_.red}\u274C Error: ${U(e)}${_.reset}`),process.exit(1)}else console.log(`
157
+ ${_.bold}${_.cyan}CFM SDK CLI Tool${_.reset}`),console.log(`
158
+ Usage:`),console.log(" npx cfm-sdk customize \u2013 Local UI customization wizard"),console.log(" npx cfm-sdk customize-ui \u2013 AWS wizard (review mode: seed + diff, no auto-apply)"),console.log(" npx cfm-sdk customize-ui --apply \u2013 AWS wizard (legacy: write final config immediately)"),console.log(" npx cfm-sdk confirm-ui-config \u2013 Promote final config + apply CSS to project"),console.log(" npx cfm-sdk apply-ui-config \u2013 Regenerate survey-theme.css from survey-ui-config.json"),console.log(" npx cfm-sdk fetch-ui-config \u2013 Pull final + diff after client completes (--no-wait)"),console.log(" npx cfm-sdk export-previews \u2013 Build component preview pages only"),console.log(" npx cfm-sdk resolve-ui-config --write \u2013 Write draft survey-ui-config.json from project"),console.log(" npx cfm-sdk deploy \u2013 Deploy to Vercel"),process.exit(0)}Tn();