@explorer02/cfm-survey-sdk 0.2.4 → 0.2.5

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 (31) hide show
  1. package/dist/cli/index.js +34 -33
  2. package/dist/cli/index.mjs +35 -34
  3. package/package.json +1 -6
  4. package/postinstall.js +2 -1
  5. package/templates/AGENT.md +3 -3
  6. package/templates/docs/00-integration/agent-execution-flow.md +39 -27
  7. package/templates/docs/00-integration/agent-operating-contract.md +13 -5
  8. package/templates/docs/00-integration/apply-ui-config.md +35 -10
  9. package/templates/docs/00-integration/aws-deploy.md +117 -3
  10. package/templates/docs/00-integration/component-checklist.md +4 -2
  11. package/templates/docs/00-integration/constraints.md +3 -2
  12. package/templates/docs/00-integration/custom-field-logic-and-navigation.md +1 -1
  13. package/templates/docs/00-integration/mockup-ui-extraction.md +113 -0
  14. package/templates/docs/00-integration/placeholders-and-custom-fields-wiring.md +192 -0
  15. package/templates/docs/00-integration/placeholders-and-tokens.md +2 -1
  16. package/templates/docs/00-integration/ui-customization-wizard.md +83 -104
  17. package/templates/docs/00-integration/wizard-api.md +74 -82
  18. package/templates/docs/00-integration/wizard-config-handoff.md +55 -9
  19. package/templates/docs/00-integration/wizard-preview-build-guide.md +12 -7
  20. package/templates/docs/00-integration/wizard-question-type-styling.md +4 -2
  21. package/templates/docs/00-integration/wizard-troubleshooting.md +80 -0
  22. package/templates/docs/01-components/10-header-footer.md +3 -3
  23. package/templates/docs/MANIFEST.json +30 -13
  24. package/templates/docs/index.md +7 -9
  25. package/templates/docs/templates/deploy-to-aws.sh +74 -0
  26. package/templates/docs/templates/implementation_plan.md +19 -12
  27. package/templates/wizard-dist/assets/{PreviewMock-DgHfrVeb.js → PreviewMock-AoZdAEPZ.js} +1 -1
  28. package/templates/wizard-dist/assets/{TypePanel-CFVC3Ptn.js → TypePanel-39FnbtvG.js} +1 -1
  29. package/templates/wizard-dist/assets/index-CWKdsJOp.js +34 -0
  30. package/templates/wizard-dist/index.html +1 -1
  31. package/templates/wizard-dist/assets/index-DYK3X1e5.js +0 -34
package/dist/cli/index.js CHANGED
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var _o=Object.create;var Ie=Object.defineProperty;var Do=Object.getOwnPropertyDescriptor;var Oo=Object.getOwnPropertyNames;var Lo=Object.getPrototypeOf,Mo=Object.prototype.hasOwnProperty;var W=(e,o)=>()=>(e&&(o=e(e=0)),o);var Fe=(e,o)=>{for(var t in o)Ie(e,t,{get:o[t],enumerable:!0})},Uo=(e,o,t,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let i of Oo(o))!Mo.call(e,i)&&i!==t&&Ie(e,i,{get:()=>o[i],enumerable:!(n=Do(o,i))||n.enumerable});return e};var k=(e,o,t)=>(t=e!=null?_o(Lo(e)):{},Uo(o||!e||!e.__esModule?Ie(t,"default",{value:e,enumerable:!0}):t,e));var c,U=W(()=>{"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 te,je=W(()=>{"use strict";te=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"]});function Wo(e){let o={};for(let t of e)Ge[t]&&(o[t]={...Ge[t]});return o}function Jo(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:Wo(e),placeholders:{firstName:"Alex",lastName:"Customer",email:"alex@example.com"},customFields:{},debug:{enabled:!1,sampleAnswers:{}},deploy:{target:"aws",autoDeploy:!1}}}function V(e,o){return{...e,...o??{}}}function Ke(e){let o=(e.surveyTypes??[]).filter(r=>te.includes(r)),t=Jo(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:V(i.header,n.header),footer:V(i.footer,n.footer),theme:V(i.theme,n.theme),layout:V(i.layout,n.layout),buttons:V(i.buttons,n.buttons),logo:V(i.logo,n.logo),colorScheme:V(i.colorScheme,n.colorScheme),typography:V(i.typography,n.typography),motion:V(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 _,Ge,Ye=W(()=>{"use strict";je();_={primary:"#1A1F36",secondary:"#E8F5FD",accent:"#00B5AD",background:"#FFFFFF",text:"#1A1F36",buttonText:"#FFFFFF"},Ge={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}}});function no(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 to(e){if(!e)return;let o=parseFloat(e.replace(/%$/,""));return Number.isFinite(o)?o:void 0}function pe(e){if(!e)return;let o=parseFloat(e);return Number.isFinite(o)?o:void 0}function io(e){let o={global:{},questionTypes:{}},t=o.global,n={},i={},s={},r={},a={},l={},w={},y=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"]&&Ze[e["--cfm-max-width"]]&&(a.width=Ze[e["--cfm-max-width"]]),e["--cfm-border-radius"]&&eo[e["--cfm-border-radius"]]&&(a.borderStyle=eo[e["--cfm-border-radius"]]),e["--cfm-font-family"]&&(l.fontFamily=e["--cfm-font-family"],oo[e["--cfm-font-family"]]&&(a.fontStyle=oo[e["--cfm-font-family"]])),e["--cfm-heading-weight"]&&(l.headingWeight=pe(e["--cfm-heading-weight"])),e["--cfm-motion-duration"]){let A=b(e["--cfm-motion-duration"]);A!==void 0&&(w.durationMs=A,w.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=pe(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 P={};e["--cfm-mcq-selected-accent"]&&(P.selectedAccent=e["--cfm-mcq-selected-accent"]),e["--cfm-mcq-border-radius"]&&(P.borderRadius=b(e["--cfm-mcq-border-radius"])),e["--cfm-mcq-option-gap"]&&(P.optionGap=b(e["--cfm-mcq-option-gap"])),e["--cfm-mcq-card-padding"]&&(P.cardPadding=b(e["--cfm-mcq-card-padding"])),e["--cfm-mcq-selected-bg"]&&(P.selectedBackground=e["--cfm-mcq-selected-bg"]),e["--cfm-mcq-hover-border"]&&(P.hoverBorderColor=e["--cfm-mcq-hover-border"]),Object.keys(P).length&&(y.MCQ=P);let C={};e["--cfm-input-radius"]&&(C.inputRadius=b(e["--cfm-input-radius"])),e["--cfm-input-focus-ring"]&&(C.focusRing=e["--cfm-input-focus-ring"]),e["--cfm-input-border"]&&(C.borderColor=e["--cfm-input-border"]),e["--cfm-input-padding"]&&(C.inputPadding=b(e["--cfm-input-padding"])),e["--cfm-input-height"]&&(C.inputHeight=b(e["--cfm-input-height"])),e["--cfm-input-placeholder"]&&(C.placeholderColor=e["--cfm-input-placeholder"]),Object.keys(C).length&&(y.TEXTFIELD=C);let R={};e["--cfm-nps-selected-fill"]&&(R.selectedFill=e["--cfm-nps-selected-fill"]),e["--cfm-nps-label-color"]&&(R.labelColor=e["--cfm-nps-label-color"]),e["--cfm-nps-track-bar"]&&(R.trackBarColor=e["--cfm-nps-track-bar"]),e["--cfm-nps-track-highlight"]&&(R.trackHighlightColor=e["--cfm-nps-track-highlight"]),e["--cfm-nps-cell-size"]&&(R.cellSize=b(e["--cfm-nps-cell-size"])),e["--cfm-nps-cell-gap"]&&(R.cellGap=b(e["--cfm-nps-cell-gap"])),Object.keys(R).length&&(y.NPS_SCALE=R);let F=b(e["--cfm-matrix-row-width"]),m={};F!==void 0&&(m.rowLabelWidth=F),e["--cfm-matrix-selected"]&&(m.cellSelectedColor=e["--cfm-matrix-selected"]),e["--cfm-matrix-bipolar-width"]&&(m.bipolarColumnWidthPercent=to(e["--cfm-matrix-bipolar-width"])),e["--cfm-matrix-carousel-dot"]&&(m.carouselDotColor=e["--cfm-matrix-carousel-dot"]),e["--cfm-matrix-cell-padding"]&&(m.cellPadding=b(e["--cfm-matrix-cell-padding"])),Object.keys(m).length&&(y.CFM_MATRIX=m);let f={...m};e["--cfm-csat-accent"]&&(f.accentColor=e["--cfm-csat-accent"]),e["--cfm-csat-emoji-size"]&&(f.emojiSize=b(e["--cfm-csat-emoji-size"])),e["--cfm-csat-unselected-opacity"]&&(f.unselectedOpacity=pe(e["--cfm-csat-unselected-opacity"])),e["--cfm-csat-ring-color"]&&(f.selectedRingColor=e["--cfm-csat-ring-color"]),e["--cfm-csat-cell-size"]&&(f.cellSize=b(e["--cfm-csat-cell-size"])),e["--cfm-csat-tooltip-bg"]&&(f.tooltipBg=e["--cfm-csat-tooltip-bg"]),(Object.keys(f).length>Object.keys(m).length||e["--cfm-csat-accent"])&&(y.CSAT_MATRIX=f);let u={};e["--cfm-star-color"]&&(u.starColor=e["--cfm-star-color"]),e["--cfm-badge-color"]&&(u.badgeColor=e["--cfm-badge-color"]),F!==void 0&&(u.rowLabelWidth=F),e["--cfm-star-unselected-opacity"]&&(u.unselectedStarOpacity=pe(e["--cfm-star-unselected-opacity"])),Object.keys(u).length&&(y.RATING_MATRIX=u);let h={};e["--cfm-slider-track"]&&(h.trackColor=e["--cfm-slider-track"]),e["--cfm-slider-thumb"]&&(h.thumbColor=e["--cfm-slider-thumb"]),e["--cfm-slider-tick"]&&(h.tickColor=e["--cfm-slider-tick"]),F!==void 0&&(h.rowLabelWidth=F),e["--cfm-slider-row-band"]&&(h.rowBandColor=e["--cfm-slider-row-band"]),e["--cfm-slider-tick-size"]&&(h.tickBadgeSize=b(e["--cfm-slider-tick-size"])),Object.keys(h).length&&(y.SLIDER_MATRIX=h);let x={};e["--cfm-upload-accent"]&&(x.accentColor=e["--cfm-upload-accent"]),e["--cfm-upload-padding"]&&(x.dropzonePadding=b(e["--cfm-upload-padding"])),Object.keys(x).length&&(y.FILE_UPLOAD=x);let S={};e["--cfm-media-max-width"]&&(S.mediaMaxWidth=to(e["--cfm-media-max-width"])),e["--cfm-media-radius"]&&(S.mediaRadius=b(e["--cfm-media-radius"])),e["--cfm-media-caption-color"]&&(S.captionColor=e["--cfm-media-caption-color"]),e["--cfm-media-caption-size"]&&(S.captionSize=b(e["--cfm-media-caption-size"])),Object.keys(S).length&&(y.TEXT_AND_MEDIA=S);let $={};e["--cfm-heatmap-pin"]&&($.pinColor=e["--cfm-heatmap-pin"]),e["--cfm-heatmap-pin-size"]&&($.pinSize=b(e["--cfm-heatmap-pin-size"])),e["--cfm-heatmap-pin-border"]&&($.pinBorderColor=e["--cfm-heatmap-pin-border"]),e["--cfm-heatmap-overlay-opacity"]&&($.overlayOpacity=pe(e["--cfm-heatmap-overlay-opacity"])),Object.keys($).length&&(y.HEATMAP=$);let T={};return e["--cfm-rank-item-bg"]&&(T.itemBg=e["--cfm-rank-item-bg"]),e["--cfm-rank-badge"]&&(T.rankBadgeColor=e["--cfm-rank-badge"]),e["--cfm-rank-handle"]&&(T.dragHandleColor=e["--cfm-rank-handle"]),e["--cfm-rank-item-padding"]&&(T.itemPadding=b(e["--cfm-rank-item-padding"])),e["--cfm-rank-item-gap"]&&(T.itemGap=b(e["--cfm-rank-item-gap"])),Object.keys(T).length&&(y.RANK_ORDER=T),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(w).length&&(t.motion=w),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(be.existsSync(t)&&be.readFileSync(t,"utf8").includes("--cfm-"))return t;return null}var be,ue,Ze,eo,oo,Ce=W(()=>{"use strict";be=k(require("fs")),ue=k(require("path")),Ze={"36rem":"narrow","48rem":"standard","64rem":"wide"},eo={"0px":"sharp","12px":"rounded","9999px":"pill"},oo={"system-ui, sans-serif":"system","Inter, sans-serif":"modern","Georgia, serif":"serif"}});function Vo(e){for(let o of Ho){let t=ro.join(e,o);if($e.existsSync(t))return t}return null}function Xo(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 so(e){let o=Vo(e);if(!o)return null;let t=$e.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=Xo(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 $e,ro,Ho,co=W(()=>{"use strict";$e=k(require("fs")),ro=k(require("path")),Ho=["src/components/Header.tsx","components/Header.tsx","app/components/Header.tsx"]});var po={};Fe(po,{logSeedSource:()=>Ne,resolveInitialConfig:()=>re,writeResolvedUiConfig:()=>_e});function Ae(e){return e.filter(o=>te.includes(o))}function ao(e){try{let o=JSON.parse(J.readFileSync(e,"utf8"));return o.version!=="1.0"?null:(delete o.configuredAt,o)}catch{return null}}function Go(e){let o={global:{}};if(!J.existsSync(e))return o;let t=J.readFileSync(e,"utf8"),n=new Set;for(let s of te)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 go(e,o){let t=X.join(e,o);if(!J.existsSync(t))return null;let n=J.readFileSync(t);if(n.length>qo)return{fileName:o,dataUrl:""};let i=X.extname(o).toLowerCase(),s=Qo[i]??"application/octet-stream";return{fileName:o,dataUrl:`data:${s};base64,${n.toString("base64")}`}}function lo(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=go(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 fo(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=X.join(o,"survey-ui-config.json"),n=X.join(o,"implementation_plan.md"),i=X.join(o,"public"),s=Ae(e.surveyTypes),r={},a="defaults",l=ne(o);if(l){let T=J.readFileSync(l,"utf8"),A=no(T);Object.keys(A).length>0&&(r=io(A),a="survey-theme.css")}let w=Go(n);r=fo(r,w);let y=ao(t);y&&(r=fo(r,y),a="survey-ui-config.json");let P=X.join(o,"survey-ui-config.final.json"),C=ao(P),R=!!y?.configuredAt,F=!!C?.configuredAt;if(C&&F&&!R){let T=lo(i,C.global?.logo);T&&(r.global={...r.global??{},logo:{fileName:T.fileName,url:T.url}})}let m=lo(i,r.global?.logo),f=so(o),u=!!y?.configuredAt,h=m?.fileName!=null&&/^logo_\d+_/i.test(m.fileName),x=f?.mode==="image"?f.fileName:null,S=!u&&h&&x!=null&&m?.fileName!==x;if(m&&!S)r.global={...r.global??{},logo:{fileName:m.fileName,url:m.url}};else if(f?.mode==="image"){let T=go(i,f.fileName);r.global={...r.global??{},logo:{fileName:f.fileName,url:T?.dataUrl||null}}}else f?.mode==="text"&&(r.global={...r.global??{},logo:{fileName:null,url:null},companyName:r.global?.companyName??f.label});return r.surveyTypes=Ae(r.surveyTypes??s),r.surveyTypes?.length||(r.surveyTypes=s),e.instanceId&&(r.instanceId=e.instanceId),{config:Ke(r),source:a}}function Ne(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 _e(e={}){let o=e.projectRoot??process.env.INIT_CWD??process.cwd(),t=e.surveyTypes??Ae(te),{config:n}=re({projectRoot:o,surveyTypes:t,instanceId:e.instanceId}),i=X.join(o,"survey-ui-config.json");return J.writeFileSync(i,JSON.stringify(n,null,2),"utf8"),i}var J,X,ie,qo,Qo,me=W(()=>{"use strict";J=k(require("fs")),X=k(require("path"));U();Ye();Ce();je();co();ie=c,qo=512e3,Qo={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml"}});function bo(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Co(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 $o(e,o,t,n){if(Co(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)){Co(e,o)?n.unchangedCount+=1:n.changed.push({path:t,before:ce(e),after:ce(o)});return}if(bo(e)&&bo(o)){let i=new Set([...Object.keys(e),...Object.keys(o)]);for(let s of i){if(ft.has(s)&&t==="")continue;let r=t?`${t}.${s}`:s;$o(e[s],o[s],r,n)}return}n.changed.push({path:t,before:ce(e),after:ce(o)})}function Ue(e,o){let t={changed:[],added:[],removed:[],unchangedCount:0};return $o(e,o,"",t),t}function Te(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=Ue(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,Te(i),"utf8"),ae.writeFileSync(n.activeConfigPath,JSON.stringify(o,null,2),"utf8"),i}var ae,le,ft,Ee=W(()=>{"use strict";ae=k(require("fs")),le=k(require("path")),ft=new Set(["configuredAt","instanceId"])});function Re(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 xo(e){return new Promise((o,t)=>{let n=new URL(e);(n.protocol==="https:"?To:ko).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 dt(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?To:ko).request(i,{method:"GET",headers:o.headers??{}},a=>{let l="";a.on("data",w=>l+=w),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=ze.join(o,"public");Y.existsSync(a)||Y.mkdirSync(a,{recursive:!0});let l=ze.join(a,t);if(n){let w=await xo(n);return Y.writeFileSync(l,w),l}if(i&&s&&r){let w=await dt(`${s.replace(/\/$/,"")}/wizard/logo/${encodeURIComponent(r)}/${encodeURIComponent(t)}`,{headers:{Authorization:`Bearer ${i}`}}),y=await xo(w.downloadUrl);return Y.writeFileSync(l,y),l}throw new Error("Logo download requires logoUrl from wizard poll or CFM_INSTANCE_ID + CFM_DEPLOY_API_BASE")}var Y,ko,To,ze,ve=W(()=>{"use strict";Y=k(require("fs")),ko=k(require("http")),To=k(require("https")),ze=k(require("path"))});var Io={};Fe(Io,{runConfirmUiConfig:()=>yt});function ht(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function yt(e={}){let o=process.env.INIT_CWD??process.cwd(),t=K(o);if(!H.existsSync(t.finalPath))throw new Error(`Missing ${t.finalPath}. Run customize-ui with --review and complete the wizard first.`);let n=JSON.parse(H.readFileSync(H.existsSync(t.seedPath)?t.seedPath:t.activeConfigPath,"utf8")),i=JSON.parse(H.readFileSync(t.finalPath,"utf8")),s=Ue(n,i);if(console.log(`
2
+ "use strict";var _o=Object.create;var je=Object.defineProperty;var Do=Object.getOwnPropertyDescriptor;var Oo=Object.getOwnPropertyNames;var Lo=Object.getPrototypeOf,Mo=Object.prototype.hasOwnProperty;var W=(e,o)=>()=>(e&&(o=e(e=0)),o);var Fe=(e,o)=>{for(var t in o)je(e,t,{get:o[t],enumerable:!0})},Uo=(e,o,t,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let i of Oo(o))!Mo.call(e,i)&&i!==t&&je(e,i,{get:()=>o[i],enumerable:!(n=Do(o,i))||n.enumerable});return e};var k=(e,o,t)=>(t=e!=null?_o(Lo(e)):{},Uo(o||!e||!e.__esModule?je(t,"default",{value:e,enumerable:!0}):t,e));var c,U=W(()=>{"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 G,Ce=W(()=>{"use strict";G=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"]});function Wo(e){let o={};for(let t of e)Ge[t]&&(o[t]={...Ge[t]});return o}function Jo(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:Wo(e),placeholders:{firstName:"Alex",lastName:"Customer",email:"alex@example.com"},customFields:{},debug:{enabled:!1,sampleAnswers:{}},deploy:{target:"aws",autoDeploy:!1}}}function V(e,o){return{...e,...o??{}}}function Ke(e){let o=(e.surveyTypes??[]).filter(r=>G.includes(r)),t=Jo(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:V(i.header,n.header),footer:V(i.footer,n.footer),theme:V(i.theme,n.theme),layout:V(i.layout,n.layout),buttons:V(i.buttons,n.buttons),logo:V(i.logo,n.logo),colorScheme:V(i.colorScheme,n.colorScheme),typography:V(i.typography,n.typography),motion:V(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 _,Ge,Ye=W(()=>{"use strict";Ce();_={primary:"#1A1F36",secondary:"#E8F5FD",accent:"#00B5AD",background:"#FFFFFF",text:"#1A1F36",buttonText:"#FFFFFF"},Ge={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}}});function no(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 C(e){if(!e)return;let o=parseFloat(e.replace(/px$/,""));return Number.isFinite(o)?o:void 0}function to(e){if(!e)return;let o=parseFloat(e.replace(/%$/,""));return Number.isFinite(o)?o:void 0}function ue(e){if(!e)return;let o=parseFloat(e);return Number.isFinite(o)?o:void 0}function io(e){let o={global:{},questionTypes:{}},t=o.global,n={},i={},s={},r={},a={},l={},w={},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"]&&Ze[e["--cfm-max-width"]]&&(a.width=Ze[e["--cfm-max-width"]]),e["--cfm-border-radius"]&&eo[e["--cfm-border-radius"]]&&(a.borderStyle=eo[e["--cfm-border-radius"]]),e["--cfm-font-family"]&&(l.fontFamily=e["--cfm-font-family"],oo[e["--cfm-font-family"]]&&(a.fontStyle=oo[e["--cfm-font-family"]])),e["--cfm-heading-weight"]&&(l.headingWeight=ue(e["--cfm-heading-weight"])),e["--cfm-motion-duration"]){let A=C(e["--cfm-motion-duration"]);A!==void 0&&(w.durationMs=A,w.enabled=A>0)}e["--cfm-header-height"]&&(i.height=C(e["--cfm-header-height"])),e["--cfm-header-logo-width"]&&(i.logoBoxWidth=C(e["--cfm-header-logo-width"])),e["--cfm-header-logo-height"]&&(i.logoBoxHeight=C(e["--cfm-header-logo-height"])),e["--cfm-header-logo-padding"]&&(i.logoPadding=C(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=C(e["--cfm-header-company-size"])),e["--cfm-header-company-weight"]&&(i.companyNameFontWeight=ue(e["--cfm-header-company-weight"])),e["--cfm-header-border"]&&(i.borderBottomColor=e["--cfm-header-border"]),e["--cfm-header-padding-x"]&&(i.contentPaddingX=C(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=C(e["--cfm-footer-logo-width"])),e["--cfm-footer-logo-height"]&&(s.logoHeight=C(e["--cfm-footer-logo-height"])),e["--cfm-footer-padding-y"]&&(s.paddingY=C(e["--cfm-footer-padding-y"])),e["--cfm-footer-padding-x"]&&(s.paddingX=C(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=C(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=C(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=C(e["--cfm-sticky-pt"])),e["--cfm-sticky-pb"]&&(r.stickyChromePaddingBottom=C(e["--cfm-sticky-pb"]));let $={};e["--cfm-mcq-selected-accent"]&&($.selectedAccent=e["--cfm-mcq-selected-accent"]),e["--cfm-mcq-border-radius"]&&($.borderRadius=C(e["--cfm-mcq-border-radius"])),e["--cfm-mcq-option-gap"]&&($.optionGap=C(e["--cfm-mcq-option-gap"])),e["--cfm-mcq-card-padding"]&&($.cardPadding=C(e["--cfm-mcq-card-padding"])),e["--cfm-mcq-selected-bg"]&&($.selectedBackground=e["--cfm-mcq-selected-bg"]),e["--cfm-mcq-hover-border"]&&($.hoverBorderColor=e["--cfm-mcq-hover-border"]),Object.keys($).length&&(m.MCQ=$);let b={};e["--cfm-input-radius"]&&(b.inputRadius=C(e["--cfm-input-radius"])),e["--cfm-input-focus-ring"]&&(b.focusRing=e["--cfm-input-focus-ring"]),e["--cfm-input-border"]&&(b.borderColor=e["--cfm-input-border"]),e["--cfm-input-padding"]&&(b.inputPadding=C(e["--cfm-input-padding"])),e["--cfm-input-height"]&&(b.inputHeight=C(e["--cfm-input-height"])),e["--cfm-input-placeholder"]&&(b.placeholderColor=e["--cfm-input-placeholder"]),Object.keys(b).length&&(m.TEXTFIELD=b);let I={};e["--cfm-nps-selected-fill"]&&(I.selectedFill=e["--cfm-nps-selected-fill"]),e["--cfm-nps-label-color"]&&(I.labelColor=e["--cfm-nps-label-color"]),e["--cfm-nps-track-bar"]&&(I.trackBarColor=e["--cfm-nps-track-bar"]),e["--cfm-nps-track-highlight"]&&(I.trackHighlightColor=e["--cfm-nps-track-highlight"]),e["--cfm-nps-cell-size"]&&(I.cellSize=C(e["--cfm-nps-cell-size"])),e["--cfm-nps-cell-gap"]&&(I.cellGap=C(e["--cfm-nps-cell-gap"])),Object.keys(I).length&&(m.NPS_SCALE=I);let j=C(e["--cfm-matrix-row-width"]),h={};j!==void 0&&(h.rowLabelWidth=j),e["--cfm-matrix-selected"]&&(h.cellSelectedColor=e["--cfm-matrix-selected"]),e["--cfm-matrix-bipolar-width"]&&(h.bipolarColumnWidthPercent=to(e["--cfm-matrix-bipolar-width"])),e["--cfm-matrix-carousel-dot"]&&(h.carouselDotColor=e["--cfm-matrix-carousel-dot"]),e["--cfm-matrix-cell-padding"]&&(h.cellPadding=C(e["--cfm-matrix-cell-padding"])),Object.keys(h).length&&(m.CFM_MATRIX=h);let f={...h};e["--cfm-csat-accent"]&&(f.accentColor=e["--cfm-csat-accent"]),e["--cfm-csat-emoji-size"]&&(f.emojiSize=C(e["--cfm-csat-emoji-size"])),e["--cfm-csat-unselected-opacity"]&&(f.unselectedOpacity=ue(e["--cfm-csat-unselected-opacity"])),e["--cfm-csat-ring-color"]&&(f.selectedRingColor=e["--cfm-csat-ring-color"]),e["--cfm-csat-cell-size"]&&(f.cellSize=C(e["--cfm-csat-cell-size"])),e["--cfm-csat-tooltip-bg"]&&(f.tooltipBg=e["--cfm-csat-tooltip-bg"]),(Object.keys(f).length>Object.keys(h).length||e["--cfm-csat-accent"])&&(m.CSAT_MATRIX=f);let g={};e["--cfm-star-color"]&&(g.starColor=e["--cfm-star-color"]),e["--cfm-badge-color"]&&(g.badgeColor=e["--cfm-badge-color"]),j!==void 0&&(g.rowLabelWidth=j),e["--cfm-star-unselected-opacity"]&&(g.unselectedStarOpacity=ue(e["--cfm-star-unselected-opacity"])),Object.keys(g).length&&(m.RATING_MATRIX=g);let y={};e["--cfm-slider-track"]&&(y.trackColor=e["--cfm-slider-track"]),e["--cfm-slider-thumb"]&&(y.thumbColor=e["--cfm-slider-thumb"]),e["--cfm-slider-tick"]&&(y.tickColor=e["--cfm-slider-tick"]),j!==void 0&&(y.rowLabelWidth=j),e["--cfm-slider-row-band"]&&(y.rowBandColor=e["--cfm-slider-row-band"]),e["--cfm-slider-tick-size"]&&(y.tickBadgeSize=C(e["--cfm-slider-tick-size"])),Object.keys(y).length&&(m.SLIDER_MATRIX=y);let x={};e["--cfm-upload-accent"]&&(x.accentColor=e["--cfm-upload-accent"]),e["--cfm-upload-padding"]&&(x.dropzonePadding=C(e["--cfm-upload-padding"])),Object.keys(x).length&&(m.FILE_UPLOAD=x);let S={};e["--cfm-media-max-width"]&&(S.mediaMaxWidth=to(e["--cfm-media-max-width"])),e["--cfm-media-radius"]&&(S.mediaRadius=C(e["--cfm-media-radius"])),e["--cfm-media-caption-color"]&&(S.captionColor=e["--cfm-media-caption-color"]),e["--cfm-media-caption-size"]&&(S.captionSize=C(e["--cfm-media-caption-size"])),Object.keys(S).length&&(m.TEXT_AND_MEDIA=S);let T={};e["--cfm-heatmap-pin"]&&(T.pinColor=e["--cfm-heatmap-pin"]),e["--cfm-heatmap-pin-size"]&&(T.pinSize=C(e["--cfm-heatmap-pin-size"])),e["--cfm-heatmap-pin-border"]&&(T.pinBorderColor=e["--cfm-heatmap-pin-border"]),e["--cfm-heatmap-overlay-opacity"]&&(T.overlayOpacity=ue(e["--cfm-heatmap-overlay-opacity"])),Object.keys(T).length&&(m.HEATMAP=T);let P={};return e["--cfm-rank-item-bg"]&&(P.itemBg=e["--cfm-rank-item-bg"]),e["--cfm-rank-badge"]&&(P.rankBadgeColor=e["--cfm-rank-badge"]),e["--cfm-rank-handle"]&&(P.dragHandleColor=e["--cfm-rank-handle"]),e["--cfm-rank-item-padding"]&&(P.itemPadding=C(e["--cfm-rank-item-padding"])),e["--cfm-rank-item-gap"]&&(P.itemGap=C(e["--cfm-rank-item-gap"])),Object.keys(P).length&&(m.RANK_ORDER=P),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(w).length&&(t.motion=w),o}function ne(e){let o=[pe.join(e,"src","styles","survey-theme.css"),pe.join(e,"src","app","survey-theme.css"),pe.join(e,"src","styles","globals.css"),pe.join(e,"src","app","globals.css")];for(let t of o)if($e.existsSync(t)&&$e.readFileSync(t,"utf8").includes("--cfm-"))return t;return null}var $e,pe,Ze,eo,oo,xe=W(()=>{"use strict";$e=k(require("fs")),pe=k(require("path")),Ze={"36rem":"narrow","48rem":"standard","64rem":"wide"},eo={"0px":"sharp","12px":"rounded","9999px":"pill"},oo={"system-ui, sans-serif":"system","Inter, sans-serif":"modern","Georgia, serif":"serif"}});function Vo(e){for(let o of Ho){let t=ro.join(e,o);if(Te.existsSync(t))return t}return null}function Xo(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 so(e){let o=Vo(e);if(!o)return null;let t=Te.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=Xo(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 Te,ro,Ho,co=W(()=>{"use strict";Te=k(require("fs")),ro=k(require("path")),Ho=["src/components/Header.tsx","components/Header.tsx","app/components/Header.tsx"]});var uo={};Fe(uo,{logSeedSource:()=>Ne,resolveInitialConfig:()=>re,writeResolvedUiConfig:()=>_e});function Ae(e){return e.filter(o=>G.includes(o))}function ao(e){try{let o=JSON.parse(J.readFileSync(e,"utf8"));return o.version!=="1.0"?null:(delete o.configuredAt,o)}catch{return null}}function Go(e){let o={global:{}};if(!J.existsSync(e))return o;let t=J.readFileSync(e,"utf8"),n=new Set;for(let s of G)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 go(e,o){let t=X.join(e,o);if(!J.existsSync(t))return null;let n=J.readFileSync(t);if(n.length>qo)return{fileName:o,dataUrl:""};let i=X.extname(o).toLowerCase(),s=Qo[i]??"application/octet-stream";return{fileName:o,dataUrl:`data:${s};base64,${n.toString("base64")}`}}function lo(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=go(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 fo(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=X.join(o,"survey-ui-config.json"),n=X.join(o,"implementation_plan.md"),i=X.join(o,"public"),s=Ae(e.surveyTypes),r={},a="defaults",l=ne(o);if(l){let P=J.readFileSync(l,"utf8"),A=no(P);Object.keys(A).length>0&&(r=io(A),a="survey-theme.css")}let w=Go(n);r=fo(r,w);let m=ao(t);m&&(r=fo(r,m),a="survey-ui-config.json");let $=X.join(o,"survey-ui-config.final.json"),b=ao($),I=!!m?.configuredAt,j=!!b?.configuredAt;if(b&&j&&!I){let P=lo(i,b.global?.logo);P&&(r.global={...r.global??{},logo:{fileName:P.fileName,url:P.url}})}let h=lo(i,r.global?.logo),f=so(o),g=!!m?.configuredAt,y=h?.fileName!=null&&/^logo_\d+_/i.test(h.fileName),x=f?.mode==="image"?f.fileName:null,S=!g&&y&&x!=null&&h?.fileName!==x;if(h&&!S)r.global={...r.global??{},logo:{fileName:h.fileName,url:h.url}};else if(f?.mode==="image"){let P=go(i,f.fileName);r.global={...r.global??{},logo:{fileName:f.fileName,url:P?.dataUrl||null}}}else f?.mode==="text"&&(r.global={...r.global??{},logo:{fileName:null,url:null},companyName:r.global?.companyName??f.label});return r.surveyTypes=Ae(r.surveyTypes??s),r.surveyTypes?.length||(r.surveyTypes=s),e.instanceId&&(r.instanceId=e.instanceId),{config:Ke(r),source:a}}function Ne(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 _e(e={}){let o=e.projectRoot??process.env.INIT_CWD??process.cwd(),t=e.surveyTypes??Ae(G),{config:n}=re({projectRoot:o,surveyTypes:t,instanceId:e.instanceId}),i=X.join(o,"survey-ui-config.json");return J.writeFileSync(i,JSON.stringify(n,null,2),"utf8"),i}var J,X,ie,qo,Qo,me=W(()=>{"use strict";J=k(require("fs")),X=k(require("path"));U();Ye();xe();Ce();co();ie=c,qo=512e3,Qo={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml"}});function bo(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Co(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 $o(e,o,t,n){if(Co(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)){Co(e,o)?n.unchangedCount+=1:n.changed.push({path:t,before:ce(e),after:ce(o)});return}if(bo(e)&&bo(o)){let i=new Set([...Object.keys(e),...Object.keys(o)]);for(let s of i){if(ft.has(s)&&t==="")continue;let r=t?`${t}.${s}`:s;$o(e[s],o[s],r,n)}return}n.changed.push({path:t,before:ce(e),after:ce(o)})}function Ue(e,o){let t={changed:[],added:[],removed:[],unchangedCount:0};return $o(e,o,"",t),t}function Pe(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 Y(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 Ee(e,o,t){let n=Y(e),i=Ue(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,Pe(i),"utf8"),ae.writeFileSync(n.activeConfigPath,JSON.stringify(o,null,2),"utf8"),i}var ae,le,ft,ve=W(()=>{"use strict";ae=k(require("fs")),le=k(require("path")),ft=new Set(["configuredAt","instanceId"])});function Re(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 xo(e){return new Promise((o,t)=>{let n=new URL(e);(n.protocol==="https:"?ko:To).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 dt(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?ko:To).request(i,{method:"GET",headers:o.headers??{}},a=>{let l="";a.on("data",w=>l+=w),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 ee(e){let{projectRoot:o,fileName:t,logoUrl:n,jwt:i,apiBase:s,surveyId:r}=e,a=ze.join(o,"public");Z.existsSync(a)||Z.mkdirSync(a,{recursive:!0});let l=ze.join(a,t);if(n){let w=await xo(n);return Z.writeFileSync(l,w),l}if(i&&s&&r){let w=await dt(`${s.replace(/\/$/,"")}/wizard/logo/${encodeURIComponent(r)}/${encodeURIComponent(t)}`,{headers:{Authorization:`Bearer ${i}`}}),m=await xo(w.downloadUrl);return Z.writeFileSync(l,m),l}throw new Error("Logo download requires logoUrl from wizard poll or CFM_INSTANCE_ID + CFM_DEPLOY_API_BASE")}var Z,To,ko,ze,Ie=W(()=>{"use strict";Z=k(require("fs")),To=k(require("http")),ko=k(require("https")),ze=k(require("path"))});var Io={};Fe(Io,{runConfirmUiConfig:()=>yt});function ht(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function yt(e={}){let o=process.env.INIT_CWD??process.cwd(),t=Y(o);if(!H.existsSync(t.finalPath))throw new Error(`Missing ${t.finalPath}. Run customize-ui with --review and complete the wizard first.`);let n=JSON.parse(H.readFileSync(H.existsSync(t.seedPath)?t.seedPath:t.activeConfigPath,"utf8")),i=JSON.parse(H.readFileSync(t.finalPath,"utf8")),s=Ue(n,i);if(console.log(`
4
4
  ${z.bold}${z.cyan}\u{1F4CB} UI config review${z.reset}
5
- `),console.log(Te(s)),e.diffOnly){H.writeFileSync(t.diffJsonPath,JSON.stringify(s,null,2),"utf8"),H.writeFileSync(t.diffMdPath,Te(s),"utf8"),console.log(`${z.dim} Updated ${t.diffMdPath}${z.reset}`);return}H.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(/\/$/,""),w=a?ht(a):null;try{await Z({projectRoot:o,fileName:r.fileName,logoUrl:r.url,jwt:a??void 0,apiBase:l||void 0,surveyId:w??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(y){console.log(`${z.yellow} Logo not downloaded \u2014 ${y instanceof Error?y.message:String(y)}${z.reset}`)}}var H,z,Fo=W(()=>{"use strict";H=k(require("fs"));U();Ee();ve();z=c});var jo={};Fe(jo,{runFetchUiConfig:()=>$t});async function bt(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?St:wt).request(i,{method:"GET",headers:o.headers??{}},a=>{let l="";a.on("data",w=>l+=w),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 Ct(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function $t(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=Ct(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 bt(`${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 w=Re(l)??l.config,y=JSON.parse(ye.readFileSync(a,"utf8")),P=Pe(s,y,w),C=w.global?.logo;if(C?.fileName)try{await Z({projectRoot:s,fileName:C.fileName,logoUrl:l.logoUrl,jwt:o,apiBase:t,surveyId:i}),console.log(`${M.green} Logo saved to public/${C.fileName}${M.reset}`)}catch(R){console.warn(`${M.yellow} Logo download failed: ${R}${M.reset}`)}console.log(`
6
- ${M.green}\u2705 Fetched final config (review mode)${M.reset}`),console.log(`${M.green} Final: ${r.finalPath}${M.reset}`),console.log(`${M.green} Diff: ${r.diffMdPath}${M.reset}`),console.log(`${M.yellow} ${P.changed.length} changed, ${P.added.length} added, ${P.removed.length} removed${M.reset}`),console.log(`${M.dim} Apply when ready: npx cfm-sdk confirm-ui-config${M.reset}`)}var ye,wt,St,M,Ao=W(()=>{"use strict";ye=k(require("fs")),wt=k(require("http")),St=k(require("https"));U();Ee();ve();M=c});U();U();var de=require("child_process");function ee(e){try{let o=process.platform==="win32"?`where ${e}`:`command -v ${e}`;return(0,de.execSync)(o,{stdio:"ignore"}),!0}catch{return!1}}var zo={stdio:"inherit",shell:process.platform==="win32"?"cmd.exe":"/bin/sh"};function ge(e,o){try{let t=`${e} ${o.join(" ")}`;return(0,de.execSync)(t,zo),!0}catch{return!1}}function we(e,o){return new Promise(t=>{(0,de.spawn)(e,o,{stdio:"inherit",shell:!0}).on("close",i=>{t(i)})})}var We=k(require("readline/promises")),Se=require("process");async function oe(e){let o=We.default.createInterface({input:Se.stdin,output:Se.stdout});try{return(await o.question(e)).trim()}finally{o.close()}}async function Je(){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 oe("Would you like to install/upgrade Node.js v18+ automatically? (y/N): ");o.toLowerCase()==="y"||o.toLowerCase()==="yes"||(console.log(`
5
+ `),console.log(Pe(s)),e.diffOnly){H.writeFileSync(t.diffJsonPath,JSON.stringify(s,null,2),"utf8"),H.writeFileSync(t.diffMdPath,Pe(s),"utf8"),console.log(`${z.dim} Updated ${t.diffMdPath}${z.reset}`);return}H.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(/\/$/,""),w=a?ht(a):null;try{await ee({projectRoot:o,fileName:r.fileName,logoUrl:r.url,jwt:a??void 0,apiBase:l||void 0,surveyId:w??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 H,z,jo=W(()=>{"use strict";H=k(require("fs"));U();ve();Ie();z=c});var Fo={};Fe(Fo,{runFetchUiConfig:()=>$t});async function bt(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?St:wt).request(i,{method:"GET",headers:o.headers??{}},a=>{let l="";a.on("data",w=>l+=w),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 Ct(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function $t(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=Ct(o);if(!i)throw new Error("Could not parse surveyId from CFM_INSTANCE_ID JWT");let s=process.env.INIT_CWD??process.cwd(),r=Y(s),a=we.existsSync(r.seedPath)?r.seedPath:r.activeConfigPath;if(!we.existsSync(a))throw new Error(`Missing seed config at ${a}. Run customize-ui --review first.`);let l=await bt(`${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 w=Re(l)??l.config,m=JSON.parse(we.readFileSync(a,"utf8")),$=Ee(s,m,w),b=w.global?.logo;if(b?.fileName)try{await ee({projectRoot:s,fileName:b.fileName,logoUrl:l.logoUrl,jwt:o,apiBase:t,surveyId:i}),console.log(`${M.green} Logo saved to public/${b.fileName}${M.reset}`)}catch(I){console.warn(`${M.yellow} Logo download failed: ${I}${M.reset}`)}console.log(`
6
+ ${M.green}\u2705 Fetched final config (review mode)${M.reset}`),console.log(`${M.green} Final: ${r.finalPath}${M.reset}`),console.log(`${M.green} Diff: ${r.diffMdPath}${M.reset}`),console.log(`${M.yellow} ${$.changed.length} changed, ${$.added.length} added, ${$.removed.length} removed${M.reset}`),console.log(`${M.dim} Apply when ready: npx cfm-sdk confirm-ui-config${M.reset}`)}var we,wt,St,M,Ao=W(()=>{"use strict";we=k(require("fs")),wt=k(require("http")),St=k(require("https"));U();ve();Ie();M=c});U();U();var de=require("child_process");function oe(e){try{let o=process.platform==="win32"?`where ${e}`:`command -v ${e}`;return(0,de.execSync)(o,{stdio:"ignore"}),!0}catch{return!1}}var zo={stdio:"inherit",shell:process.platform==="win32"?"cmd.exe":"/bin/sh"};function ge(e,o){try{let t=`${e} ${o.join(" ")}`;return(0,de.execSync)(t,zo),!0}catch{return!1}}function Se(e,o){return new Promise(t=>{(0,de.spawn)(e,o,{stdio:"inherit",shell:!0}).on("close",i=>{t(i)})})}var We=k(require("readline/promises")),be=require("process");async function te(e){let o=We.default.createInterface({input:be.stdin,output:be.stdout});try{return(await o.question(e)).trim()}finally{o.close()}}async function Je(){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
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?ee("winget")?(console.log(`
9
+ `),process.exit(1));let n=process.platform==="win32",i=process.platform==="darwin";n?oe("winget")?(console.log(`
10
10
  \u{1F4E6} ${c.green}winget package manager found! Installing Node.js v18+ in background...${c.reset}`),ge("winget",["upgrade","OpenJS.NodeJS","--silent","--accept-package-agreements","--accept-source-agreements"])?(console.log(`
11
11
  \u2714 ${c.green}Node.js installation triggered successfully. Please restart your terminal/command-prompt for changes to take effect.${c.reset}
12
12
  `),process.exit(0)):(console.log(`
13
13
  \u274C ${c.red}winget update failed. Please update Node.js manually at https://nodejs.org/${c.reset}
14
14
  `),process.exit(1))):(console.log(`
15
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?ee("brew")?(console.log(`
16
+ `),process.exit(1)):i?oe("brew")?(console.log(`
17
17
  \u{1F4E6} ${c.green}Homebrew package manager found! Installing Node.js v18+ in background...${c.reset}`),ge("brew",["install","node"])?console.log(`
18
18
  \u2714 ${c.green}Node.js installed successfully via Homebrew.${c.reset}
19
19
  `):(console.log(`
@@ -23,17 +23,17 @@ ${M.green}\u2705 Fetched final config (review mode)${M.reset}`),console.log(`${M
23
23
  `),process.exit(1)):(console.log(`
24
24
  \u274C ${c.red}Please install or update Node.js to v18+ using your system's package manager.${c.reset}
25
25
  `),process.exit(1))}else console.log(`\u2714 ${c.green}Node.js version (v${e}) is sufficient.${c.reset}`)}U();async function He(){console.log(`
26
- ${c.dim}Step 2/4: Checking Vercel CLI...${c.reset}`);let e="vercel",o=!1;if(ee("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 oe("\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}`),ge("npm",["install","-g","vercel"])&&ee("vercel")?console.log(`\u2714 ${c.green}Vercel CLI installed successfully!${c.reset}`):(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}`),ge("npm",["install","-g","vercel"])&&oe("vercel")?console.log(`\u2714 ${c.green}Vercel CLI installed successfully!${c.reset}`):(console.log(`
28
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}}var Ve=require("child_process");U();var Bo={stdio:"ignore",shell:process.platform==="win32"?"cmd.exe":"/bin/sh"};async function Xe(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{(0,Ve.execSync)(e?"npx --yes vercel whoami":"vercel whoami",Bo),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 oe("\u{1F449} Press [Enter] to login to Vercel... ");let n=["login"],i=e?"npx":"vercel",s=e?["--yes","vercel",...n]:n;if(await we(i,s)!==0)throw new Error("Vercel login failed or was aborted.");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{(0,Ve.execSync)(e?"npx --yes vercel whoami":"vercel whoami",Bo),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
30
  \u2714 ${c.green}Logged in successfully!${c.reset}`)}return o}U();async function qe(e,o){console.log(`
31
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 we(n,i)!==0)throw new Error("Vercel deployment failed.");console.log(`
32
+ `),await Se(n,i)!==0)throw new Error("Vercel deployment failed.");console.log(`
33
33
  ${c.bold}${c.green}\u{1F389} Deployment completed successfully!${c.reset}
34
34
  `)}async function Qe(){console.log(`
35
35
  ${c.bold}${c.cyan}\u{1F680} Starting CFM Vercel Deployment...${c.reset}
36
- `),await Je();let{vercelCmd:e,useNpx:o}=await He(),t=await Xe(o);await qe(o,t)}var he=k(require("http")),E=k(require("fs")),N=k(require("path"));U();function L(e){return e instanceof Error?e.message:String(e)}me();var I=k(require("fs")),v=k(require("path"));U();Ce();var g=k(require("fs")),p=k(require("path")),uo=require("child_process");Ce();function G(e,o){if(g.existsSync(e)){g.mkdirSync(o,{recursive:!0});for(let t of g.readdirSync(e,{withFileTypes:!0})){let n=p.join(e,t.name),i=p.join(o,t.name);t.isDirectory()?G(n,i):g.copyFileSync(n,i)}}}function De(e){let o=[],t=e;for(let n=0;n<6;n++){let i=p.join(t,"node_modules");g.existsSync(i)&&o.push(i);let s=p.dirname(t);if(s===t)break;t=s}return o}function Ko(e,o){let t=De(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(g.existsSync(r))return r}for(let n of["mjs","js"]){let i=p.join(o,"dist",`index.${n}`);if(g.existsSync(i))return i}throw new Error("Could not resolve @explorer02/cfm-survey-sdk for preview build")}function Yo(e,o){let t=[...De(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(g.existsSync(n))return n;throw new Error("Vite is required for agent preview builds. Install vite in the project or SDK package.")}function Zo(e){let o=p.join(e,"src","components");if(!g.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:g.existsSync(t)?t:void 0,publicDir:g.existsSync(n)?n:void 0}}function et(e){let o=`import React from 'react';
36
+ `),await Je();let{vercelCmd:e,useNpx:o}=await He(),t=await Xe(o);await qe(o,t)}var ye=k(require("http")),E=k(require("fs")),N=k(require("path"));U();function L(e){return e instanceof Error?e.message:String(e)}me();var R=k(require("fs")),v=k(require("path"));U();xe();var u=k(require("fs")),p=k(require("path")),po=require("child_process");xe();function K(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()?K(n,i):u.copyFileSync(n,i)}}}function De(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 Ko(e,o){let t=De(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 Yo(e,o){let t=[...De(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 Zo(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 et(e){let o=`import React from 'react';
37
37
  import { mountPreview } from '../mount';
38
38
  `;switch(e){case"header":return`${o}import Header from '@/components/Header';
39
39
  import ProgressBar from '@/components/ProgressBar';
@@ -111,36 +111,37 @@ ${s}
111
111
  },
112
112
  },
113
113
  });
114
- `;g.writeFileSync(p.join(e,"vite.config.mjs"),r)}function tt(e,o){let t=g.readFileSync(e,"utf8");if(t.includes("preview-bridge.inline"))return;let n=`<script>${o}</script>`;t=t.includes("</body>")?t.replace("</body>",`${n}
114
+ `;u.writeFileSync(p.join(e,"vite.config.mjs"),r)}function tt(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}
115
115
  </body>`):`${t}
116
- ${n}`,g.writeFileSync(e,t)}function nt(e){return e.replace(/_/g," ")}async function mo(e){let{projectRoot:o,outputDir:t,keys:n}=e,i=p.join(__dirname,"..",".."),s=p.join(i,"templates","preview-harness","vite-app");if(!g.existsSync(s))throw new Error(`Missing Vite preview harness template at ${s}`);let r=Zo(o),a=p.join(t,".preview-vite-work");g.existsSync(a)&&g.rmSync(a,{recursive:!0,force:!0}),G(s,a),g.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),w=p.join(a,"src","survey-theme.css");g.writeFileSync(w,l?g.readFileSync(l,"utf8"):g.readFileSync(p.join(i,"templates","survey-theme.css"),"utf8")),g.mkdirSync(p.join(a,"src","entries"),{recursive:!0});for(let u of n)g.mkdirSync(p.join(a,u),{recursive:!0}),g.writeFileSync(p.join(a,u,"index.html"),`<!DOCTYPE html>
116
+ ${n}`,u.writeFileSync(e,t)}function nt(e){return e.replace(/_/g," ")}async function mo(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=Zo(o),a=p.join(t,".preview-vite-work");u.existsSync(a)&&u.rmSync(a,{recursive:!0,force:!0}),K(s,a),u.mkdirSync(p.join(a,"agent","src"),{recursive:!0}),K(r.componentsDir,p.join(a,"agent","src","components")),r.libDir&&K(r.libDir,p.join(a,"agent","src","lib")),r.publicDir&&K(r.publicDir,p.join(a,"agent","public"));let l=ne(o),w=p.join(a,"src","survey-theme.css");u.writeFileSync(w,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 g of n)u.mkdirSync(p.join(a,g),{recursive:!0}),u.writeFileSync(p.join(a,g,"index.html"),`<!DOCTYPE html>
117
117
  <html lang="en">
118
118
  <head>
119
119
  <meta charset="UTF-8" />
120
120
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
121
- <title>${nt(u)} \u2014 CFM Preview</title>
121
+ <title>${nt(g)} \u2014 CFM Preview</title>
122
122
  </head>
123
123
  <body>
124
124
  <div id="root"></div>
125
- <script type="module" src="../src/entries/${u}.tsx"></script>
125
+ <script type="module" src="../src/entries/${g}.tsx"></script>
126
126
  </body>
127
- </html>`),g.writeFileSync(p.join(a,"src","entries",`${u}.tsx`),et(u));g.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)),ot(a,o,i,n);let y=Yo(i,o),P=De(o).join(p.delimiter);(0,uo.execSync)(`node "${y}" build --config "${p.join(a,"vite.config.mjs")}"`,{cwd:a,stdio:"inherit",env:{...process.env,NODE_PATH:P}});let C=p.join(t,"previews");g.mkdirSync(C,{recursive:!0});let R=p.join(a,"dist"),F=g.readFileSync(p.join(i,"templates","preview-harness","preview-bridge.inline.js"),"utf8");for(let u of n){let h=p.join(R,u),x=p.join(C,u);if(!g.existsSync(p.join(h,"index.html")))throw new Error(`Vite build did not produce ${u}/index.html`);g.existsSync(x)&&g.rmSync(x,{recursive:!0,force:!0}),G(h,x),tt(p.join(x,"index.html"),F)}let m=p.join(R,"assets");g.existsSync(m)&&G(m,p.join(C,"assets"));let f=p.join(a,"agent","public");if(g.existsSync(f))for(let u of g.readdirSync(f)){let h=p.join(f,u);g.statSync(h).isFile()&&g.copyFileSync(h,p.join(C,u))}g.rmSync(a,{recursive:!0,force:!0})}var Oe=k(require("fs")),Le=k(require("path"));function xe(e){if(e)return e;let o=process.cwd();if(Oe.existsSync(Le.join(o,"src","components","Question.tsx")))return o;let t=process.env.INIT_CWD;return t&&Oe.existsSync(Le.join(t,"src","components","Question.tsx"))?t:o}var D=c;function it(){return v.join(__dirname,"..","..","templates")}function rt(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 st(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 Me(e,o,t){if(I.existsSync(e))for(let n of I.readdirSync(e)){let i=v.join(e,n),s=v.posix.join(o,n);if(I.statSync(i).isDirectory())Me(i,s,t);else{let r=v.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=xe(e.projectRoot),t=e.outputDir??v.join(o,"out"),n=it(),i=v.join(n,"preview-harness");e.useTemplatesOnly&&console.log(`${D.dim} Using SDK template preview harness only (--use-templates-only)${D.reset}`);let s=v.join(i,"previewPages.js"),{PREVIEW_PAGE_DEFS:r,buildPreviewHtml:a,PREVIEW_KEYS:l}=require(s),w=(()=>{let f=ne(o);return f?(console.log(`${D.dim} Using project theme: ${v.relative(o,f)}${D.reset}`),I.readFileSync(f,"utf8")):I.readFileSync(v.join(n,"survey-theme.css"),"utf8")})(),y=I.readFileSync(v.join(i,"preview-bridge.inline.js"),"utf8"),P=e.surveyTypes;if(!P){let f=v.join(o,"implementation_plan.md");P=I.existsSync(f)?rt(f):["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"]}let C=st(l,P),R=v.join(t,"previews");if(I.existsSync(R)&&(I.rmSync(R,{recursive:!0,force:!0}),console.log(`${D.dim} Cleared previous preview output${D.reset}`)),I.mkdirSync(R,{recursive:!0}),!e.useTemplatesOnly)try{console.log(`${D.dim} Building previews from agent components (Vite)\u2026${D.reset}`),await mo({projectRoot:o,outputDir:t,keys:C});let f={};for(let h of C)f[h]=`previews/${h}/index.html`;I.writeFileSync(v.join(t,"previews","manifest.json"),JSON.stringify(f,null,2));let u=[];return Me(v.join(t,"previews"),"previews",u),console.log(`${D.green}\u2705 Exported ${C.length} agent component previews \u2192 ${t}${D.reset}`),{outputDir:t,manifestPath:v.join(t,"previews","manifest.json"),files:u,surveyTypes:P}}catch(f){console.warn(`${D.yellow}\u26A0 Agent Vite preview build failed; falling back to template harness.${D.reset}`),console.warn(`${D.dim} ${L(f)}${D.reset}`)}for(let f of r){if(!C.includes(f.key))continue;let u=v.join(t,"previews",f.key);I.mkdirSync(u,{recursive:!0}),I.writeFileSync(v.join(u,"index.html"),a(f,w,y))}let F={};for(let f of C)F[f]=`previews/${f}/index.html`;I.writeFileSync(v.join(t,"previews","manifest.json"),JSON.stringify(F,null,2));let m=[];return Me(v.join(t,"previews"),"previews",m),console.log(`${D.green}\u2705 Exported ${C.length} preview pages \u2192 ${t}${D.reset}`),{outputDir:t,manifestPath:v.join(t,"previews","manifest.json"),files:m,surveyTypes:P}}var O=c,ke=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"];function wo(e){return new Promise(o=>{let t=he.createServer();t.listen(e,()=>{t.close(()=>o(e))}),t.on("error",()=>o(wo(e+1)))})}function ho(e){return new Promise((o,t)=>{let n="";e.on("data",i=>n+=i),e.on("end",()=>o(n)),e.on("error",t)})}function ct(e){let{exec:o}=require("child_process"),t=process.platform==="darwin"?`open "${e}"`:process.platform==="win32"?`start "" "${e}"`:`xdg-open "${e}"`;o(t)}function yo(e){let o=N.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 at(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 ke)e.includes(s)&&o.add(s);let i=e.matchAll(/\|\s*`([A-Z_]+)`\s*\|/g);for(let s of i)ke.includes(s[1])&&o.add(s[1]);return{surveyTypes:o.size>0?[...o]:[...ke],instanceId:t}}async function lt(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)}})}async function So(){let e=process.env.INIT_CWD||process.cwd(),o=N.join(e,"public"),t=N.join(e,"survey-ui-config.json"),n=N.join(e,"implementation_plan.md"),i=N.join(__dirname,"..","..","templates"),s=N.join(i,"wizard-dist"),r=process.env.CFM_PREVIEW_URL??"http://localhost:3000",a={},l=N.join(e,"out","previews"),w=N.join(l,"manifest.json");E.existsSync(w)||(console.log(`${O.dim} Exporting component previews for local wizard\u2026${O.reset}`),await se({projectRoot:e})),E.existsSync(w)&&(a=JSON.parse(E.readFileSync(w,"utf8")));let y=await wo(4200),P=`http://localhost:${y}`;return new Promise((C,R)=>{let F=he.createServer(async(m,f)=>{try{let u=m.url??"/";if(m.method==="GET"&&u==="/api/inventory"){let h=[...ke],x;if(E.existsSync(n)){let $=E.readFileSync(n,"utf8"),T=at($);h=T.surveyTypes,x=T.instanceId}if(E.existsSync(t))try{let $=JSON.parse(E.readFileSync(t,"utf8"));$.surveyTypes?.length&&(h=$.surveyTypes),$.instanceId&&(x=$.instanceId)}catch{}let{config:S}=re({projectRoot:e,surveyTypes:h,instanceId:x});f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({surveyTypes:h,instanceId:x,previewUrl:r,initialConfig:S,previewManifest:Object.fromEntries(Object.keys(a).map($=>[$,`${P}/previews/${$}/index.html`]))}));return}if(m.method==="GET"&&u==="/api/preview-url"){let h=await lt(r);f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({url:r,connected:h}));return}if(m.method==="POST"&&u==="/api/upload-logo"){let h=await ho(m),x=JSON.parse(h);E.existsSync(o)||E.mkdirSync(o,{recursive:!0});let S=x.base64.replace(/^data:image\/\w+;base64,/,""),$=Buffer.from(S,"base64"),T=N.extname(x.filename),A=N.basename(x.filename,T).toLowerCase().replace(/[^a-z0-9_-]/g,""),B=`logo_${Date.now()}_${A}${T||".png"}`;E.writeFileSync(N.join(o,B),$),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({fileName:B}));return}if(m.method==="POST"&&u==="/api/save-config"){let h=await ho(m),x=JSON.parse(h);x.configuredAt=new Date().toISOString(),E.writeFileSync(t,JSON.stringify(x,null,2),"utf8"),console.log(`
128
- ${O.green}\u2705 UI configuration saved to ${t}${O.reset}`),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!0})),setTimeout(()=>{F.close(()=>C())},500);return}if(m.method==="GET"){let h=u.split("?")[0];if(h==="/"&&(h="/index.html"),h.startsWith("/previews/")&&E.existsSync(l)){let $=h.replace(/^\/previews\//,""),T=N.join(l,$),A=N.normalize(T);if(A.startsWith(l)&&E.existsSync(A)&&E.statSync(A).isFile()){let B=E.readFileSync(A);f.writeHead(200,{"Content-Type":yo(A)}),f.end(B);return}}let x=E.existsSync(s),S=x?N.join(s,h):N.join(i,"wizard.html");if(x&&E.existsSync(S)&&E.statSync(S).isFile()){let $=E.readFileSync(S);f.writeHead(200,{"Content-Type":yo(S)}),f.end($);return}if(!x&&h==="/index.html"){let $=E.readFileSync(N.join(i,"wizard.html"),"utf8");f.writeHead(200,{"Content-Type":"text/html"}),f.end($);return}}f.writeHead(404,{"Content-Type":"text/plain"}),f.end("Not found")}catch(u){f.writeHead(500,{"Content-Type":"text/plain"}),f.end(`Server error: ${L(u)}`)}});F.listen(y,()=>{let m=P;console.log(`
129
- ${O.bold}${O.cyan}\u{1F3A8} Survey UI Customization Wizard${O.reset}`),console.log(`${O.dim} Running at ${O.reset}${O.green}${m}${O.reset}`),console.log(`${O.dim} Live previews: ${O.reset}${Object.keys(a).length} components`),console.log(`${O.dim} Preview target: ${O.reset}${r}
130
- `),ct(m)}),F.on("error",R)})}var fe=k(require("fs")),Po=k(require("path")),Eo=k(require("http")),Ro=k(require("https"));U();me();Ee();ve();var d=c;function gt(e){let{exec:o}=require("child_process"),t=process.platform==="darwin"?`open "${e}"`:process.platform==="win32"?`start "" "${e}"`:`xdg-open "${e}"`;o(t)}function pt(e){return new Promise(o=>setTimeout(o,e))}async function Be(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?Ro:Eo).request(i,{method:o.method??"GET",headers:o.headers??{}},a=>{let l="";a.on("data",w=>l+=w),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 ut(e,o,t){return new Promise((n,i)=>{let s=new URL(e),a=(s.protocol==="https:"?Ro:Eo).request(s,{method:"PUT",headers:{"Content-Type":t,"Content-Length":o.length}},l=>{if((l.statusCode??500)>=400){let w="";l.on("data",y=>w+=y),l.on("end",()=>i(new Error(`PUT failed ${l.statusCode}: ${w}`)));return}l.resume(),n()});a.on("error",i),a.write(o),a.end()})}function mt(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function vo(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=mt(i);if(!r)throw new Error("Could not parse surveyId from CFM_INSTANCE_ID JWT");let a=xe(),l=K(a),w=l.activeConfigPath,y=e.apply?!1:e.review!==!1;console.log(`
127
+ </html>`),u.writeFileSync(p.join(a,"src","entries",`${g}.tsx`),et(g));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)),ot(a,o,i,n);let m=Yo(i,o),$=De(o).join(p.delimiter);(0,po.execSync)(`node "${m}" build --config "${p.join(a,"vite.config.mjs")}"`,{cwd:a,stdio:"inherit",env:{...process.env,NODE_PATH:$}});let b=p.join(t,"previews");u.mkdirSync(b,{recursive:!0});let I=p.join(a,"dist"),j=u.readFileSync(p.join(i,"templates","preview-harness","preview-bridge.inline.js"),"utf8");for(let g of n){let y=p.join(I,g),x=p.join(b,g);if(!u.existsSync(p.join(y,"index.html")))throw new Error(`Vite build did not produce ${g}/index.html`);u.existsSync(x)&&u.rmSync(x,{recursive:!0,force:!0}),K(y,x),tt(p.join(x,"index.html"),j)}let h=p.join(I,"assets");u.existsSync(h)&&K(h,p.join(b,"assets"));let f=p.join(a,"agent","public");if(u.existsSync(f))for(let g of u.readdirSync(f)){let y=p.join(f,g);u.statSync(y).isFile()&&u.copyFileSync(y,p.join(b,g))}u.rmSync(a,{recursive:!0,force:!0})}var Oe=k(require("fs")),Le=k(require("path"));function ke(e){if(e)return e;let o=process.cwd();if(Oe.existsSync(Le.join(o,"src","components","Question.tsx")))return o;let t=process.env.INIT_CWD;return t&&Oe.existsSync(Le.join(t,"src","components","Question.tsx"))?t:o}var O=c;function it(){return v.join(__dirname,"..","..","templates")}function rt(e){let o=R.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 st(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 Me(e,o,t){if(R.existsSync(e))for(let n of R.readdirSync(e)){let i=v.join(e,n),s=v.posix.join(o,n);if(R.statSync(i).isDirectory())Me(i,s,t);else{let r=v.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:R.statSync(i).size})}}}async function se(e={}){let o=ke(e.projectRoot),t=e.outputDir??v.join(o,"out"),n=it(),i=v.join(n,"preview-harness");e.useTemplatesOnly&&console.log(`${O.dim} Using SDK template preview harness only (--use-templates-only)${O.reset}`);let s=v.join(i,"previewPages.js"),{PREVIEW_PAGE_DEFS:r,buildPreviewHtml:a,PREVIEW_KEYS:l}=require(s),w=(()=>{let f=ne(o);return f?(console.log(`${O.dim} Using project theme: ${v.relative(o,f)}${O.reset}`),R.readFileSync(f,"utf8")):R.readFileSync(v.join(n,"survey-theme.css"),"utf8")})(),m=R.readFileSync(v.join(i,"preview-bridge.inline.js"),"utf8"),$=e.surveyTypes;if(!$){let f=v.join(o,"implementation_plan.md");$=R.existsSync(f)?rt(f):["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"]}let b=st(l,$),I=v.join(t,"previews");if(R.existsSync(I)&&(R.rmSync(I,{recursive:!0,force:!0}),console.log(`${O.dim} Cleared previous preview output${O.reset}`)),R.mkdirSync(I,{recursive:!0}),!e.useTemplatesOnly)try{console.log(`${O.dim} Building previews from agent components (Vite)\u2026${O.reset}`),await mo({projectRoot:o,outputDir:t,keys:b});let f={};for(let y of b)f[y]=`previews/${y}/index.html`;R.writeFileSync(v.join(t,"previews","manifest.json"),JSON.stringify(f,null,2));let g=[];return Me(v.join(t,"previews"),"previews",g),console.log(`${O.green}\u2705 Exported ${b.length} agent component previews \u2192 ${t}${O.reset}`),{outputDir:t,manifestPath:v.join(t,"previews","manifest.json"),files:g,surveyTypes:$}}catch(f){console.warn(`${O.yellow}\u26A0 Agent Vite preview build failed; falling back to template harness.${O.reset}`),console.warn(`${O.dim} ${L(f)}${O.reset}`)}for(let f of r){if(!b.includes(f.key))continue;let g=v.join(t,"previews",f.key);R.mkdirSync(g,{recursive:!0}),R.writeFileSync(v.join(g,"index.html"),a(f,w,m))}let j={};for(let f of b)j[f]=`previews/${f}/index.html`;R.writeFileSync(v.join(t,"previews","manifest.json"),JSON.stringify(j,null,2));let h=[];return Me(v.join(t,"previews"),"previews",h),console.log(`${O.green}\u2705 Exported ${b.length} preview pages \u2192 ${t}${O.reset}`),{outputDir:t,manifestPath:v.join(t,"previews","manifest.json"),files:h,surveyTypes:$}}var D=c,he=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"];function wo(e){return new Promise(o=>{let t=ye.createServer();t.listen(e,()=>{t.close(()=>o(e))}),t.on("error",()=>o(wo(e+1)))})}function ho(e){return new Promise((o,t)=>{let n="";e.on("data",i=>n+=i),e.on("end",()=>o(n)),e.on("error",t)})}function ct(e){let{exec:o}=require("child_process"),t=process.platform==="darwin"?`open "${e}"`:process.platform==="win32"?`start "" "${e}"`:`xdg-open "${e}"`;o(t)}function yo(e){let o=N.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 at(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 he)e.includes(s)&&o.add(s);let i=e.matchAll(/\|\s*`([A-Z_]+)`\s*\|/g);for(let s of i)he.includes(s[1])&&o.add(s[1]);return{surveyTypes:o.size>0?[...o]:[...he],instanceId:t}}async function lt(e){return new Promise(o=>{try{let t=ye.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)}})}async function So(){let e=process.env.INIT_CWD||process.cwd(),o=N.join(e,"public"),t=N.join(e,"survey-ui-config.json"),n=N.join(e,"implementation_plan.md"),i=N.join(__dirname,"..","..","templates"),s=N.join(i,"wizard-dist"),r=process.env.CFM_PREVIEW_URL??"http://localhost:3000",a={},l=N.join(e,"out","previews"),w=N.join(l,"manifest.json");E.existsSync(w)||(console.log(`${D.dim} Exporting component previews for local wizard\u2026${D.reset}`),await se({projectRoot:e,surveyTypes:[...he]})),E.existsSync(w)&&(a=JSON.parse(E.readFileSync(w,"utf8")));let m=await wo(4200),$=`http://localhost:${m}`;return new Promise((b,I)=>{let j=ye.createServer(async(h,f)=>{try{let g=h.url??"/";if(h.method==="GET"&&g==="/api/inventory"){let y;if(E.existsSync(n)){let T=E.readFileSync(n,"utf8");y=at(T).instanceId}if(E.existsSync(t))try{let T=JSON.parse(E.readFileSync(t,"utf8"));T.instanceId&&(y=T.instanceId)}catch{}let x=[...he],{config:S}=re({projectRoot:e,surveyTypes:x,instanceId:y});f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({surveyTypes:x,instanceId:y,previewUrl:r,initialConfig:S,previewManifest:Object.fromEntries(Object.keys(a).map(T=>[T,`${$}/previews/${T}/index.html`]))}));return}if(h.method==="GET"&&g==="/api/preview-url"){let y=await lt(r);f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({url:r,connected:y}));return}if(h.method==="POST"&&g==="/api/upload-logo"){let y=await ho(h),x=JSON.parse(y);E.existsSync(o)||E.mkdirSync(o,{recursive:!0});let S=x.base64.replace(/^data:image\/\w+;base64,/,""),T=Buffer.from(S,"base64"),P=N.extname(x.filename),A=N.basename(x.filename,P).toLowerCase().replace(/[^a-z0-9_-]/g,""),B=`logo_${Date.now()}_${A}${P||".png"}`;E.writeFileSync(N.join(o,B),T),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({fileName:B}));return}if(h.method==="POST"&&g==="/api/save-config"){let y=await ho(h),x=JSON.parse(y);x.configuredAt=new Date().toISOString();let S=x.global?.logo;S?.url?.startsWith("data:")&&(S.url=null),E.writeFileSync(t,JSON.stringify(x,null,2),"utf8"),console.log(`
128
+ ${D.green}\u2705 UI configuration saved to ${t}${D.reset}`),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!0})),setTimeout(()=>{j.close(()=>b())},500);return}if(h.method==="GET"){let y=g.split("?")[0];if(y==="/"&&(y="/index.html"),y.startsWith("/previews/")&&E.existsSync(l)){let T=y.replace(/^\/previews\//,""),P=N.join(l,T),A=N.normalize(P);if(A.startsWith(l)&&E.existsSync(A)&&E.statSync(A).isFile()){let B=E.readFileSync(A);f.writeHead(200,{"Content-Type":yo(A)}),f.end(B);return}}let x=E.existsSync(s),S=x?N.join(s,y):N.join(i,"wizard.html");if(x&&E.existsSync(S)&&E.statSync(S).isFile()){let T=E.readFileSync(S);f.writeHead(200,{"Content-Type":yo(S)}),f.end(T);return}if(!x&&y==="/index.html"){let T=E.readFileSync(N.join(i,"wizard.html"),"utf8");f.writeHead(200,{"Content-Type":"text/html"}),f.end(T);return}}f.writeHead(404,{"Content-Type":"text/plain"}),f.end("Not found")}catch(g){f.writeHead(500,{"Content-Type":"text/plain"}),f.end(`Server error: ${L(g)}`)}});j.listen(m,()=>{let h=$;console.log(`
129
+ ${D.bold}${D.cyan}\u{1F3A8} Survey UI Customization Wizard${D.reset}`),console.log(`${D.dim} Running at ${D.reset}${D.green}${h}${D.reset}`),console.log(`${D.dim} Live previews: ${D.reset}${Object.keys(a).length} components`),console.log(`${D.dim} Preview target: ${D.reset}${r}`),console.log(`${D.dim} Default wizard \u2014 saves directly to survey-ui-config.json when client clicks Review & Build${D.reset}
130
+ `),ct(h)}),j.on("error",I)})}var fe=k(require("fs")),Po=k(require("path")),Eo=k(require("http")),vo=k(require("https"));U();Ce();me();ve();Ie();var d=c;function gt(e){let{exec:o}=require("child_process"),t=process.platform==="darwin"?`open "${e}"`:process.platform==="win32"?`start "" "${e}"`:`xdg-open "${e}"`;o(t)}function ut(e){return new Promise(o=>setTimeout(o,e))}async function Be(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?vo:Eo).request(i,{method:o.method??"GET",headers:o.headers??{}},a=>{let l="";a.on("data",w=>l+=w),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 pt(e,o,t,n){return new Promise((i,s)=>{let r=new URL(e),a=r.protocol==="https:"?vo:Eo,l={"Content-Type":t,"Content-Length":o.length};n&&(l["X-Wizard-Session"]=n.sessionSecret,l["X-Wizard-Session-Id"]=n.sessionId);let w=a.request(r,{method:"PUT",headers:l},m=>{if((m.statusCode??500)>=400){let $="";m.on("data",b=>$+=b),m.on("end",()=>s(new Error(`PUT failed ${m.statusCode}: ${$}`)));return}m.resume(),i()});w.on("error",s),w.write(o),w.end()})}function mt(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function Ro(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=mt(i);if(!r)throw new Error("Could not parse surveyId from CFM_INSTANCE_ID JWT");let a=ke(),l=Y(a),w=l.activeConfigPath,m=e.apply?!1:e.review!==!1;console.log(`
131
131
  ${d.bold}${d.cyan}\u{1F3A8} CFM UI Customization (AWS)${d.reset}
132
- `),y&&(console.log(`${d.dim} Review mode: seed kept in survey-ui-config.json; final + diff written on complete.${d.reset}`),console.log(`${d.dim} Apply later with: npx cfm-sdk confirm-ui-config${d.reset}
133
- `));let{outputDir:P,files:C,surveyTypes:R}=await se({projectRoot:a,useTemplatesOnly:e.useTemplatesOnly}),F=C.map(S=>({path:S.path,contentType:S.contentType,sizeBytes:S.sizeBytes})),{config:m,source:f}=re({projectRoot:a,surveyTypes:R,instanceId:r});Ne(f),y&&(fe.writeFileSync(l.seedPath,JSON.stringify(m,null,2),"utf8"),fe.writeFileSync(w,JSON.stringify(m,null,2),"utf8"),console.log(`${d.dim} Seed snapshot \u2192 survey-ui-config.json (+ .seed.json)${d.reset}`));let u=await Be(`${s}/wizard/session/start`,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({files:F,surveyTypes:R,initialConfig:m})});console.log(`${d.dim} Uploading ${F.length} preview files\u2026${d.reset}`);for(let S of u.uploads){let $=Po.join(P,S.path),T=fe.readFileSync($),A=F.find(B=>B.path===S.path)?.contentType??"application/octet-stream";await ut(S.uploadUrl,T,A)}if(await Be(`${s}/wizard/previews/upload/complete`,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({sessionId:u.sessionId})}),console.log(`${d.green}\u2705 Previews uploaded${d.reset}`),console.log(`${d.dim} ${F.length} component preview page(s) \u2192 S3 (wizard loads via EC2 proxy)${d.reset}`),console.log(`
134
- ${d.bold}${d.cyan}\u{1F517} Client wizard link \u2014 share with the client:${d.reset}`),console.log(`${d.green} ${u.wizardUrl}${d.reset}`),console.log(`${d.dim} (Deployed on EC2 \u2014 client customizes here; agent keeps CLI open until submit)${d.reset}
135
- `),gt(u.wizardUrl),!o){console.log(`${d.yellow}--no-wait: wizard URL (not polling):${d.reset}`),console.log(u.wizardUrl),y&&console.log(`${d.dim} When wizard completes, poll manually or re-run without --no-wait to capture final + diff.${d.reset}`);return}let h=Date.now()+n,x=0;for(;Date.now()<h;){x+=1,process.stdout.write(`\r${d.dim}Waiting for client to finish wizard\u2026 (poll ${x})${d.reset}`);let S=await Be(`${s}/wizard/config/${encodeURIComponent(r)}?sessionId=${u.sessionId}`,{headers:{Authorization:`Bearer ${i}`}});if(S.status==="ready"&&S.config){let $=Re(S)??S.config;if(console.log(`
136
- ${d.green}\u2705 Configuration ready${d.reset}`),S.logoUrl&&console.log(`${d.dim} Logo URL: ${S.logoUrl}${d.reset}`),y){let A=Pe(a,m,$);console.log(`${d.green} Seed (unchanged active): ${w}${d.reset}`),console.log(`${d.green} Final: ${l.finalPath}${d.reset}`),console.log(`${d.green} Diff: ${l.diffMdPath}${d.reset}`),console.log(`${d.yellow} ${A.changed.length} changed, ${A.added.length} added, ${A.removed.length} removed${d.reset}`);let B=$.global?.logo;if(B?.fileName)try{await Z({projectRoot:a,fileName:B.fileName,logoUrl:S.logoUrl,jwt:i,apiBase:s,surveyId:r}),console.log(`${d.green} Logo saved to public/${B.fileName}${d.reset}`)}catch(No){console.warn(`${d.yellow} Logo download deferred: ${L(No)}${d.reset}`)}console.log(`${d.dim} Apply when ready: npx cfm-sdk confirm-ui-config${d.reset}`);return}fe.writeFileSync(w,JSON.stringify($,null,2),"utf8"),console.log(`${d.green} Written ${w}${d.reset}`);let T=$.global?.logo;T?.fileName&&(await Z({projectRoot:a,fileName:T.fileName,logoUrl:S.logoUrl,jwt:i,apiBase:s,surveyId:r}),console.log(`${d.green} Logo saved to public/${T.fileName}${d.reset}`));return}await pt(t)}throw new Error("Timed out waiting for wizard completion")}me();U();var j=c,Q=process.argv.slice(2),q=Q[0];async function xt(){if(q==="customize"||q==="init"){q==="init"&&console.log(`${j.yellow}\u26A0 cfm-sdk init is deprecated. Use \`cfm-sdk customize\` instead.${j.reset}
132
+ `),m&&(console.log(`${d.dim} Review mode: seed kept in survey-ui-config.json; final + diff written on complete.${d.reset}`),console.log(`${d.dim} Apply later with: npx cfm-sdk confirm-ui-config${d.reset}
133
+ `));let $=[...G],{outputDir:b,files:I}=await se({projectRoot:a,useTemplatesOnly:e.useTemplatesOnly,surveyTypes:$}),j=I.map(S=>({path:S.path,contentType:S.contentType,sizeBytes:S.sizeBytes})),{config:h,source:f}=re({projectRoot:a,surveyTypes:$,instanceId:r});h.surveyTypes=$,Ne(f),m&&(fe.writeFileSync(l.seedPath,JSON.stringify(h,null,2),"utf8"),fe.writeFileSync(w,JSON.stringify(h,null,2),"utf8"),console.log(`${d.dim} Seed snapshot \u2192 survey-ui-config.json (+ .seed.json)${d.reset}`));let g=await Be(`${s}/wizard/session/start`,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({files:j,surveyTypes:$,initialConfig:h})});console.log(`${d.dim} Uploading ${j.length} preview files\u2026${d.reset}`);for(let S of g.uploads){let T=Po.join(b,S.path),P=fe.readFileSync(T),A=j.find(B=>B.path===S.path)?.contentType??"application/octet-stream";await pt(S.uploadUrl,P,A,{sessionId:g.sessionId,sessionSecret:g.sessionSecret})}if(await Be(`${s}/wizard/previews/upload/complete`,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({sessionId:g.sessionId})}),console.log(`${d.green}\u2705 Previews uploaded${d.reset}`),console.log(`${d.dim} ${j.length} component preview page(s) \u2192 EC2 local server (disk)${d.reset}`),console.log(`
134
+ ${d.bold}${d.cyan}\u{1F517} Client wizard link \u2014 share with the client:${d.reset}`),console.log(`${d.green} ${g.wizardUrl}${d.reset}`),console.log(`${d.dim} (Deployed on EC2 \u2014 client customizes here; agent keeps CLI open until submit)${d.reset}
135
+ `),gt(g.wizardUrl),!o){console.log(`${d.yellow}--no-wait: wizard URL (not polling):${d.reset}`),console.log(g.wizardUrl),m&&console.log(`${d.dim} When wizard completes, poll manually or re-run without --no-wait to capture final + diff.${d.reset}`);return}let y=Date.now()+n,x=0;for(;Date.now()<y;){x+=1,process.stdout.write(`\r${d.dim}Waiting for client to finish wizard\u2026 (poll ${x})${d.reset}`);let S=await Be(`${s}/wizard/config/${encodeURIComponent(r)}?sessionId=${g.sessionId}`,{headers:{Authorization:`Bearer ${i}`}});if(S.status==="abandoned")throw console.log(`
136
+ ${d.yellow}\u26A0 Client quit the wizard \u2014 session cleaned up on S3${d.reset}`),new Error("Client quit the wizard without saving. S3 preview garbage was removed. Re-run customize-ui to start a new session.");if(S.status==="ready"&&S.config){let T=Re(S)??S.config;if(console.log(`
137
+ ${d.green}\u2705 Configuration ready${d.reset}`),S.logoUrl&&console.log(`${d.dim} Logo URL: ${S.logoUrl}${d.reset}`),m){let A=Ee(a,h,T);console.log(`${d.green} Seed (unchanged active): ${w}${d.reset}`),console.log(`${d.green} Final: ${l.finalPath}${d.reset}`),console.log(`${d.green} Diff: ${l.diffMdPath}${d.reset}`),console.log(`${d.yellow} ${A.changed.length} changed, ${A.added.length} added, ${A.removed.length} removed${d.reset}`);let B=T.global?.logo;if(B?.fileName)try{await ee({projectRoot:a,fileName:B.fileName,logoUrl:S.logoUrl,jwt:i,apiBase:s,surveyId:r}),console.log(`${d.green} Logo saved to public/${B.fileName}${d.reset}`)}catch(No){console.warn(`${d.yellow} Logo download deferred: ${L(No)}${d.reset}`)}console.log(`${d.dim} Apply when ready: npx cfm-sdk confirm-ui-config${d.reset}`);return}fe.writeFileSync(w,JSON.stringify(T,null,2),"utf8"),console.log(`${d.green} Written ${w}${d.reset}`);let P=T.global?.logo;P?.fileName&&(await ee({projectRoot:a,fileName:P.fileName,logoUrl:S.logoUrl,jwt:i,apiBase:s,surveyId:r}),console.log(`${d.green} Logo saved to public/${P.fileName}${d.reset}`));return}await ut(t)}throw new Error("Timed out waiting for wizard completion")}me();U();var F=c,Q=process.argv.slice(2),q=Q[0];async function xt(){if(q==="customize"||q==="init"){q==="init"&&console.log(`${F.yellow}\u26A0 cfm-sdk init is deprecated. Use \`cfm-sdk customize\` instead.${F.reset}
137
138
  `);try{await So()}catch(e){console.error(`
138
- ${j.red}\u274C Error: ${L(e)}${j.reset}`),process.exit(1)}}else if(q==="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 vo({useTemplatesOnly:e,wait:!o,review:n,apply:t})}catch(i){console.error(`
139
- ${j.red}\u274C Error: ${L(i)}${j.reset}`),process.exit(1)}}else if(q==="confirm-ui-config"){let e=Q.includes("--diff-only");try{let{runConfirmUiConfig:o}=await Promise.resolve().then(()=>(Fo(),Io));await o({diffOnly:e})}catch(o){console.error(`
140
- ${j.red}\u274C Error: ${L(o)}${j.reset}`),process.exit(1)}}else if(q==="fetch-ui-config"){let o=Q.find(t=>t.startsWith("--session="))?.split("=")[1];try{let{runFetchUiConfig:t}=await Promise.resolve().then(()=>(Ao(),jo));await t({sessionId:o})}catch(t){console.error(`
141
- ${j.red}\u274C Error: ${L(t)}${j.reset}`),process.exit(1)}}else if(q==="export-previews"){let e=Q.includes("--use-templates-only");try{await se({useTemplatesOnly:e})}catch(o){console.error(`
142
- ${j.red}\u274C Error: ${L(o)}${j.reset}`),process.exit(1)}}else if(q==="resolve-ui-config"){let e=Q.includes("--write");try{if(e){let o=_e();console.log(`${j.green}\u2705 Wrote ${o}${j.reset}`)}else{let{resolveInitialConfig:o}=await Promise.resolve().then(()=>(me(),po)),{config:t,source:n}=o({surveyTypes:[]});console.log(JSON.stringify({source:n,config:t},null,2))}}catch(o){console.error(`
143
- ${j.red}\u274C Error: ${L(o)}${j.reset}`),process.exit(1)}}else if(q==="deploy")try{await Qe()}catch(e){console.error(`
144
- ${j.red}\u274C Error: ${L(e)}${j.reset}`),process.exit(1)}else console.log(`
145
- ${j.bold}${j.cyan}CFM SDK CLI Tool${j.reset}`),console.log(`
139
+ ${F.red}\u274C Error: ${L(e)}${F.reset}`),process.exit(1)}}else if(q==="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 Ro({useTemplatesOnly:e,wait:!o,review:n,apply:t})}catch(i){console.error(`
140
+ ${F.red}\u274C Error: ${L(i)}${F.reset}`),process.exit(1)}}else if(q==="confirm-ui-config"){let e=Q.includes("--diff-only");try{let{runConfirmUiConfig:o}=await Promise.resolve().then(()=>(jo(),Io));await o({diffOnly:e})}catch(o){console.error(`
141
+ ${F.red}\u274C Error: ${L(o)}${F.reset}`),process.exit(1)}}else if(q==="fetch-ui-config"){let o=Q.find(t=>t.startsWith("--session="))?.split("=")[1];try{let{runFetchUiConfig:t}=await Promise.resolve().then(()=>(Ao(),Fo));await t({sessionId:o})}catch(t){console.error(`
142
+ ${F.red}\u274C Error: ${L(t)}${F.reset}`),process.exit(1)}}else if(q==="export-previews"){let e=Q.includes("--use-templates-only");try{await se({useTemplatesOnly:e})}catch(o){console.error(`
143
+ ${F.red}\u274C Error: ${L(o)}${F.reset}`),process.exit(1)}}else if(q==="resolve-ui-config"){let e=Q.includes("--write");try{if(e){let o=_e();console.log(`${F.green}\u2705 Wrote ${o}${F.reset}`)}else{let{resolveInitialConfig:o}=await Promise.resolve().then(()=>(me(),uo)),{config:t,source:n}=o({surveyTypes:[]});console.log(JSON.stringify({source:n,config:t},null,2))}}catch(o){console.error(`
144
+ ${F.red}\u274C Error: ${L(o)}${F.reset}`),process.exit(1)}}else if(q==="deploy")try{await Qe()}catch(e){console.error(`
145
+ ${F.red}\u274C Error: ${L(e)}${F.reset}`),process.exit(1)}else console.log(`
146
+ ${F.bold}${F.cyan}CFM SDK CLI Tool${F.reset}`),console.log(`
146
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)}xt();