@explorer02/cfm-survey-sdk 0.2.9 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/cli/index.js +41 -38
  2. package/dist/cli/index.mjs +39 -36
  3. package/package.json +1 -1
  4. package/templates/docs/00-integration/agent-execution-flow.md +6 -6
  5. package/templates/docs/00-integration/agent-operating-contract.md +1 -2
  6. package/templates/docs/00-integration/component-checklist.md +0 -1
  7. package/templates/docs/00-integration/ui-customization-wizard.md +38 -29
  8. package/templates/docs/00-integration/wizard-chrome-contract.md +1 -11
  9. package/templates/docs/00-integration/wizard-config-handoff.md +19 -11
  10. package/templates/docs/00-integration/wizard-post-customize-build.md +0 -6
  11. package/templates/docs/00-integration/wizard-question-type-styling.md +3 -3
  12. package/templates/docs/00-integration/wizard-troubleshooting.md +4 -20
  13. package/templates/docs/index.md +1 -1
  14. package/templates/docs/templates/CsatMatrixScale.tsx +59 -53
  15. package/templates/docs/templates/CustomSliderTrack.tsx +8 -17
  16. package/templates/docs/templates/FileUploadScale.tsx +4 -12
  17. package/templates/docs/templates/Header.tsx +48 -32
  18. package/templates/docs/templates/HeatmapScale.tsx +2 -5
  19. package/templates/docs/templates/LikertMatrixScale.tsx +45 -57
  20. package/templates/docs/templates/MatrixDropdown.tsx +11 -12
  21. package/templates/docs/templates/Question.tsx +24 -4
  22. package/templates/docs/templates/RankOrderScale.tsx +9 -42
  23. package/templates/docs/templates/RatingScale.tsx +0 -38
  24. package/templates/docs/templates/SliderMatrixScale.tsx +3 -4
  25. package/templates/docs/templates/verify-agent-build.sh +0 -17
  26. package/templates/preview-harness/preview-bridge.inline.js +17 -14
  27. package/templates/preview-harness/previewPages.js +23 -15
  28. package/templates/preview-harness/previewPages.ts +7 -5
  29. package/templates/preview-harness/vite-app/src/QuestionPreview.tsx +22 -14
  30. package/templates/preview-harness/vite-app/src/fixtures/questions.ts +13 -2
  31. package/templates/preview-harness/vite-app/src/preview-live-overrides.css +6 -11
  32. package/templates/previewBridge.ts +5 -5
  33. package/templates/survey-theme.css +17 -17
  34. package/templates/wizard-dist/assets/{PreviewMock-CysRws9G.js → PreviewMock-Bax7oRAL.js} +1 -1
  35. package/templates/wizard-dist/assets/{TypePanel-DWX1LL3q.js → TypePanel-D2t4FPSd.js} +1 -1
  36. package/templates/wizard-dist/assets/index-BhWM50Yu.css +1 -0
  37. package/templates/wizard-dist/assets/index-c5lka74l.js +34 -0
  38. package/templates/wizard-dist/index.html +2 -2
  39. package/templates/wizard-dist/assets/index-DIuc7AU2.js +0 -34
  40. package/templates/wizard-dist/assets/index-pCM8n0FT.css +0 -1
package/dist/cli/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var Oo=Object.create;var Ne=Object.defineProperty;var Lo=Object.getOwnPropertyDescriptor;var Mo=Object.getOwnPropertyNames;var Uo=Object.getPrototypeOf,zo=Object.prototype.hasOwnProperty;var B=(e,o)=>()=>(e&&(o=e(e=0)),o);var je=(e,o)=>{for(var t in o)Ne(e,t,{get:o[t],enumerable:!0})},Bo=(e,o,t,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let i of Mo(o))!zo.call(e,i)&&i!==t&&Ne(e,i,{get:()=>o[i],enumerable:!(n=Lo(o,i))||n.enumerable});return e};var P=(e,o,t)=>(t=e!=null?Oo(Uo(e)):{},Bo(o||!e||!e.__esModule?Ne(t,"default",{value:e,enumerable:!0}):t,e));var c,U=B(()=>{"use strict";c={reset:"\x1B[0m",bold:"\x1B[1m",green:"\x1B[32m",red:"\x1B[31m",cyan:"\x1B[36m",yellow:"\x1B[33m",dim:"\x1B[2m"}});var G,$e=B(()=>{"use strict";G=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"]});function Ho(e){let o={};for(let t of e)Ze[t]&&(o[t]={...Ze[t]});return o}function Vo(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:Ho(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 eo(e){let o=(e.surveyTypes??[]).filter(r=>G.includes(r)),t=Vo(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 _,Ze,oo=B(()=>{"use strict";$e();_={primary:"#1A1F36",secondary:"#E8F5FD",accent:"#00B5AD",background:"#FFFFFF",text:"#1A1F36",buttonText:"#FFFFFF"},Ze={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 so(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 ro(e){if(!e)return;let o=parseFloat(e.replace(/%$/,""));return Number.isFinite(o)?o:void 0}function ge(e){if(!e)return;let o=parseFloat(e);return Number.isFinite(o)?o:void 0}function co(e){let o={global:{},questionTypes:{}},t=o.global,n={},i={},s={},r={},a={},l={},y={},m=o.questionTypes;if(e["--cfm-primary"]&&(n.primary=e["--cfm-primary"]),e["--cfm-secondary"]&&(n.secondary=e["--cfm-secondary"]),e["--cfm-accent"]&&(n.accent=e["--cfm-accent"]),e["--cfm-background"]&&(n.background=e["--cfm-background"]),e["--cfm-text"]&&(n.text=e["--cfm-text"]),e["--cfm-button-text"]&&(n.buttonText=e["--cfm-button-text"]),e["--cfm-max-width"]&&to[e["--cfm-max-width"]]&&(a.width=to[e["--cfm-max-width"]]),e["--cfm-border-radius"]&&no[e["--cfm-border-radius"]]&&(a.borderStyle=no[e["--cfm-border-radius"]]),e["--cfm-font-family"]&&(l.fontFamily=e["--cfm-font-family"],io[e["--cfm-font-family"]]&&(a.fontStyle=io[e["--cfm-font-family"]])),e["--cfm-heading-weight"]&&(l.headingWeight=ge(e["--cfm-heading-weight"])),e["--cfm-motion-duration"]){let A=b(e["--cfm-motion-duration"]);A!==void 0&&(y.durationMs=A,y.enabled=A>0)}e["--cfm-header-height"]&&(i.height=b(e["--cfm-header-height"])),e["--cfm-header-logo-width"]&&(i.logoBoxWidth=b(e["--cfm-header-logo-width"])),e["--cfm-header-logo-height"]&&(i.logoBoxHeight=b(e["--cfm-header-logo-height"])),e["--cfm-header-logo-padding"]&&(i.logoPadding=b(e["--cfm-header-logo-padding"])),e["--cfm-header-bg"]&&(i.backgroundColor=e["--cfm-header-bg"]),e["--cfm-header-company-color"]&&(i.companyNameColor=e["--cfm-header-company-color"]),e["--cfm-header-company-size"]&&(i.companyNameFontSize=b(e["--cfm-header-company-size"])),e["--cfm-header-company-weight"]&&(i.companyNameFontWeight=ge(e["--cfm-header-company-weight"])),e["--cfm-header-border"]&&(i.borderBottomColor=e["--cfm-header-border"]),e["--cfm-header-padding-x"]&&(i.contentPaddingX=b(e["--cfm-header-padding-x"])),e["--cfm-footer-bg"]&&(s.backgroundColor=e["--cfm-footer-bg"]),e["--cfm-footer-text"]&&(s.textColor=e["--cfm-footer-text"]),e["--cfm-footer-link"]&&(s.linkColor=e["--cfm-footer-link"]),e["--cfm-footer-link-hover"]&&(s.linkHoverColor=e["--cfm-footer-link-hover"]),e["--cfm-footer-logo-width"]&&(s.logoWidth=b(e["--cfm-footer-logo-width"])),e["--cfm-footer-logo-height"]&&(s.logoHeight=b(e["--cfm-footer-logo-height"])),e["--cfm-footer-padding-y"]&&(s.paddingY=b(e["--cfm-footer-padding-y"])),e["--cfm-footer-padding-x"]&&(s.paddingX=b(e["--cfm-footer-padding-x"])),e["--cfm-background"]&&(r.pageBackground=e["--cfm-background"]),e["--cfm-card-bg"]&&(r.cardBackground=e["--cfm-card-bg"]),e["--cfm-card-border-color"]&&(r.cardBorderColor=e["--cfm-card-border-color"]),e["--cfm-card-padding"]&&(r.cardPadding=b(e["--cfm-card-padding"])),e["--cfm-card-shadow"]&&(r.cardShadowEnabled=e["--cfm-card-shadow"]!=="none"),e["--cfm-selected-bg"]&&(r.selectedBackground=e["--cfm-selected-bg"]),e["--cfm-zebra-row"]&&(r.zebraRowColor=e["--cfm-zebra-row"]),e["--cfm-row-band"]&&(r.rowBandColor=e["--cfm-row-band"]),e["--cfm-validation-border"]&&(r.validationBorder=e["--cfm-validation-border"]),e["--cfm-validation-bg"]&&(r.validationBackground=e["--cfm-validation-bg"]),e["--cfm-tooltip-bg"]&&(r.tooltipBackground=e["--cfm-tooltip-bg"]),e["--cfm-progress-height"]&&(r.progressTrackHeight=b(e["--cfm-progress-height"])),e["--cfm-progress-track"]&&(r.progressTrackColor=e["--cfm-progress-track"]),e["--cfm-progress-fill"]&&(r.progressFillColor=e["--cfm-progress-fill"]),e["--cfm-sticky-pt"]&&(r.stickyChromePaddingTop=b(e["--cfm-sticky-pt"])),e["--cfm-sticky-pb"]&&(r.stickyChromePaddingBottom=b(e["--cfm-sticky-pb"]));let C={};e["--cfm-mcq-selected-accent"]&&(C.selectedAccent=e["--cfm-mcq-selected-accent"]),e["--cfm-mcq-border-radius"]&&(C.borderRadius=b(e["--cfm-mcq-border-radius"])),e["--cfm-mcq-option-gap"]&&(C.optionGap=b(e["--cfm-mcq-option-gap"])),e["--cfm-mcq-card-padding"]&&(C.cardPadding=b(e["--cfm-mcq-card-padding"])),e["--cfm-mcq-selected-bg"]&&(C.selectedBackground=e["--cfm-mcq-selected-bg"]),e["--cfm-mcq-hover-border"]&&(C.hoverBorderColor=e["--cfm-mcq-hover-border"]),Object.keys(C).length&&(m.MCQ=C);let S={};e["--cfm-input-radius"]&&(S.inputRadius=b(e["--cfm-input-radius"])),e["--cfm-input-focus-ring"]&&(S.focusRing=e["--cfm-input-focus-ring"]),e["--cfm-input-border"]&&(S.borderColor=e["--cfm-input-border"]),e["--cfm-input-padding"]&&(S.inputPadding=b(e["--cfm-input-padding"])),e["--cfm-input-height"]&&(S.inputHeight=b(e["--cfm-input-height"])),e["--cfm-input-placeholder"]&&(S.placeholderColor=e["--cfm-input-placeholder"]),Object.keys(S).length&&(m.TEXTFIELD=S);let 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=b(e["--cfm-nps-cell-size"])),e["--cfm-nps-cell-gap"]&&(I.cellGap=b(e["--cfm-nps-cell-gap"])),Object.keys(I).length&&(m.NPS_SCALE=I);let R=b(e["--cfm-matrix-row-width"]),x={};R!==void 0&&(x.rowLabelWidth=R),e["--cfm-matrix-selected"]&&(x.cellSelectedColor=e["--cfm-matrix-selected"]),e["--cfm-matrix-bipolar-width"]&&(x.bipolarColumnWidthPercent=ro(e["--cfm-matrix-bipolar-width"])),e["--cfm-matrix-carousel-dot"]&&(x.carouselDotColor=e["--cfm-matrix-carousel-dot"]),e["--cfm-matrix-cell-padding"]&&(x.cellPadding=b(e["--cfm-matrix-cell-padding"])),Object.keys(x).length&&(m.CFM_MATRIX=x);let d={...x};e["--cfm-csat-accent"]&&(d.accentColor=e["--cfm-csat-accent"]),e["--cfm-csat-emoji-size"]&&(d.emojiSize=b(e["--cfm-csat-emoji-size"])),e["--cfm-csat-unselected-opacity"]&&(d.unselectedOpacity=ge(e["--cfm-csat-unselected-opacity"])),e["--cfm-csat-ring-color"]&&(d.selectedRingColor=e["--cfm-csat-ring-color"]),e["--cfm-csat-cell-size"]&&(d.cellSize=b(e["--cfm-csat-cell-size"])),e["--cfm-csat-tooltip-bg"]&&(d.tooltipBg=e["--cfm-csat-tooltip-bg"]),(Object.keys(d).length>Object.keys(x).length||e["--cfm-csat-accent"])&&(m.CSAT_MATRIX=d);let f={};e["--cfm-star-color"]&&(f.starColor=e["--cfm-star-color"]),e["--cfm-badge-color"]&&(f.badgeColor=e["--cfm-badge-color"]),R!==void 0&&(f.rowLabelWidth=R),e["--cfm-star-unselected-opacity"]&&(f.unselectedStarOpacity=ge(e["--cfm-star-unselected-opacity"])),Object.keys(f).length&&(m.RATING_MATRIX=f);let T={};e["--cfm-slider-track"]&&(T.trackColor=e["--cfm-slider-track"]),e["--cfm-slider-thumb"]&&(T.thumbColor=e["--cfm-slider-thumb"]),e["--cfm-slider-tick"]&&(T.tickColor=e["--cfm-slider-tick"]),R!==void 0&&(T.rowLabelWidth=R),e["--cfm-slider-row-band"]&&(T.rowBandColor=e["--cfm-slider-row-band"]),e["--cfm-slider-tick-size"]&&(T.tickBadgeSize=b(e["--cfm-slider-tick-size"])),Object.keys(T).length&&(m.SLIDER_MATRIX=T);let $={};e["--cfm-upload-accent"]&&($.accentColor=e["--cfm-upload-accent"]),e["--cfm-upload-padding"]&&($.dropzonePadding=b(e["--cfm-upload-padding"])),Object.keys($).length&&(m.FILE_UPLOAD=$);let h={};e["--cfm-media-max-width"]&&(h.mediaMaxWidth=ro(e["--cfm-media-max-width"])),e["--cfm-media-radius"]&&(h.mediaRadius=b(e["--cfm-media-radius"])),e["--cfm-media-caption-color"]&&(h.captionColor=e["--cfm-media-caption-color"]),e["--cfm-media-caption-size"]&&(h.captionSize=b(e["--cfm-media-caption-size"])),Object.keys(h).length&&(m.TEXT_AND_MEDIA=h);let E={};e["--cfm-heatmap-pin"]&&(E.pinColor=e["--cfm-heatmap-pin"]),e["--cfm-heatmap-pin-size"]&&(E.pinSize=b(e["--cfm-heatmap-pin-size"])),e["--cfm-heatmap-pin-border"]&&(E.pinBorderColor=e["--cfm-heatmap-pin-border"]),e["--cfm-heatmap-overlay-opacity"]&&(E.overlayOpacity=ge(e["--cfm-heatmap-overlay-opacity"])),Object.keys(E).length&&(m.HEATMAP=E);let w={};return e["--cfm-rank-item-bg"]&&(w.itemBg=e["--cfm-rank-item-bg"]),e["--cfm-rank-badge"]&&(w.rankBadgeColor=e["--cfm-rank-badge"]),e["--cfm-rank-handle"]&&(w.dragHandleColor=e["--cfm-rank-handle"]),e["--cfm-rank-item-padding"]&&(w.itemPadding=b(e["--cfm-rank-item-padding"])),e["--cfm-rank-item-gap"]&&(w.itemGap=b(e["--cfm-rank-item-gap"])),Object.keys(w).length&&(m.RANK_ORDER=w),Object.keys(n).length&&(t.colorScheme=n),Object.keys(i).length&&(t.header=i),Object.keys(s).length&&(t.footer=s),Object.keys(r).length&&(t.theme=r),Object.keys(a).length&&(t.layout=a),Object.keys(l).length&&(t.typography=l),Object.keys(y).length&&(t.motion=y),o}function re(e){let o=[me.join(e,"src","styles","survey-theme.css"),me.join(e,"src","app","survey-theme.css"),me.join(e,"src","styles","globals.css"),me.join(e,"src","app","globals.css")];for(let t of o)if(xe.existsSync(t)&&xe.readFileSync(t,"utf8").includes("--cfm-"))return t;return null}var xe,me,to,no,io,Te=B(()=>{"use strict";xe=P(require("fs")),me=P(require("path")),to={"36rem":"narrow","48rem":"standard","64rem":"wide"},no={"0px":"sharp","12px":"rounded","9999px":"pill"},io={"system-ui, sans-serif":"system","Inter, sans-serif":"modern","Georgia, serif":"serif"}});function qo(e){for(let o of Xo){let t=ao.join(e,o);if(Pe.existsSync(t))return t}return null}function Qo(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 lo(e){let o=qo(e);if(!o)return null;let t=Pe.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=Qo(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 Pe,ao,Xo,fo=B(()=>{"use strict";Pe=P(require("fs")),ao=P(require("path")),Xo=["src/components/Header.tsx","components/Header.tsx","app/components/Header.tsx"]});var ho={};je(ho,{logSeedSource:()=>_e,resolveInitialConfig:()=>ce,writeResolvedUiConfig:()=>De});function Ae(e){return e.filter(o=>G.includes(o))}function uo(e){try{let o=JSON.parse(W.readFileSync(e,"utf8"));return o.version!=="1.0"?null:(delete o.configuredAt,o)}catch{return null}}function Yo(e){let o={global:{}};if(!W.existsSync(e))return o;let t=W.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 mo(e,o){let t=X.join(e,o);if(!W.existsSync(t))return null;let n=W.readFileSync(t);if(n.length>Go)return{fileName:o,dataUrl:""};let i=X.extname(o).toLowerCase(),s=Ko[i]??"application/octet-stream";return{fileName:o,dataUrl:`data:${s};base64,${n.toString("base64")}`}}function po(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=mo(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 go(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 ce(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=re(o);if(l){let w=W.readFileSync(l,"utf8"),A=so(w);Object.keys(A).length>0&&(r=co(A),a="survey-theme.css")}let y=Yo(n);r=go(r,y);let m=uo(t);m&&(r=go(r,m),a="survey-ui-config.json");let C=X.join(o,"survey-ui-config.final.json"),S=uo(C),I=!!m?.configuredAt,R=!!S?.configuredAt;if(S&&R&&!I){let w=po(i,S.global?.logo);w&&(r.global={...r.global??{},logo:{fileName:w.fileName,url:w.url}})}let x=po(i,r.global?.logo),d=lo(o),f=!!m?.configuredAt,T=x?.fileName!=null&&/^logo_\d+_/i.test(x.fileName),$=d?.mode==="image"?d.fileName:null,h=!f&&T&&$!=null&&x?.fileName!==$;if(x&&!h)r.global={...r.global??{},logo:{fileName:x.fileName,url:x.url}};else if(d?.mode==="image"){let w=mo(i,d.fileName);r.global={...r.global??{},logo:{fileName:d.fileName,url:w?.dataUrl||null}}}else d?.mode==="text"&&(r.global={...r.global??{},logo:{fileName:null,url:null},companyName:r.global?.companyName??d.label});return r.surveyTypes=Ae(r.surveyTypes??s),r.surveyTypes?.length||(r.surveyTypes=s),e.instanceId&&(r.instanceId=e.instanceId),{config:eo(r),source:a}}function _e(e){console.log(e==="survey-ui-config.json"?`${se.dim} Seeding wizard from survey-ui-config.json${se.reset}`:e==="survey-theme.css"?`${se.dim} Seeding wizard from survey-theme.css + defaults${se.reset}`:`${se.dim} Seeding wizard from SDK defaults${se.reset}`)}function De(e={}){let o=e.projectRoot??process.env.INIT_CWD??process.cwd(),t=e.surveyTypes??Ae(G),{config:n}=ce({projectRoot:o,surveyTypes:t,instanceId:e.instanceId}),i=X.join(o,"survey-ui-config.json");return W.writeFileSync(i,JSON.stringify(n,null,2),"utf8"),i}var W,X,se,Go,Ko,he=B(()=>{"use strict";W=P(require("fs")),X=P(require("path"));U();oo();Te();$e();fo();se=c,Go=512e3,Ko={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml"}});function To(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Po(e,o){return JSON.stringify(e)===JSON.stringify(o)}function le(e){return typeof e=="string"&&e.startsWith("data:")&&e.length>80?`${e.slice(0,48)}\u2026 (${e.length} chars)`:e}function ko(e,o,t,n){if(Po(e,o)){n.unchangedCount+=1;return}if(e===void 0&&o!==void 0){n.added.push({path:t,before:void 0,after:le(o)});return}if(e!==void 0&&o===void 0){n.removed.push({path:t,before:le(e),after:void 0});return}if(Array.isArray(e)&&Array.isArray(o)){Po(e,o)?n.unchangedCount+=1:n.changed.push({path:t,before:le(e),after:le(o)});return}if(To(e)&&To(o)){let i=new Set([...Object.keys(e),...Object.keys(o)]);for(let s of i){if(dt.has(s)&&t==="")continue;let r=t?`${t}.${s}`:s;ko(e[s],o[s],r,n)}return}n.changed.push({path:t,before:le(e),after:le(o)})}function Be(e,o){let t={changed:[],added:[],removed:[],unchangedCount:0};return ko(e,o,"",t),t}function ve(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 Z(e){return{seedPath:de.join(e,"survey-ui-config.seed.json"),finalPath:de.join(e,"survey-ui-config.final.json"),diffJsonPath:de.join(e,"survey-ui-config.diff.json"),diffMdPath:de.join(e,"survey-ui-config.diff.md"),activeConfigPath:de.join(e,"survey-ui-config.json")}}function Ee(e,o,t){let n=Z(e),i=Be(o,t);return fe.writeFileSync(n.seedPath,JSON.stringify(o,null,2),"utf8"),fe.writeFileSync(n.finalPath,JSON.stringify(t,null,2),"utf8"),fe.writeFileSync(n.diffJsonPath,JSON.stringify(i,null,2),"utf8"),fe.writeFileSync(n.diffMdPath,ve(i),"utf8"),fe.writeFileSync(n.activeConfigPath,JSON.stringify(o,null,2),"utf8"),i}var fe,de,dt,Re=B(()=>{"use strict";fe=P(require("fs")),de=P(require("path")),dt=new Set(["configuredAt","instanceId"])});function Ie(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 vo(e){return new Promise((o,t)=>{let n=new URL(e);(n.protocol==="https:"?Ro:Eo).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 ut(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?Ro:Eo).request(i,{method:"GET",headers:o.headers??{}},a=>{let l="";a.on("data",y=>l+=y),a.on("end",()=>{if((a.statusCode??500)>=400){n(new Error(`HTTP ${a.statusCode}: ${l}`));return}try{t(JSON.parse(l))}catch{n(new Error(`Invalid JSON: ${l.slice(0,200)}`))}})});r.on("error",n),r.end()})}async function oe(e){let{projectRoot:o,fileName:t,logoUrl:n,jwt:i,apiBase:s,surveyId:r}=e,a=We.join(o,"public");ee.existsSync(a)||ee.mkdirSync(a,{recursive:!0});let l=We.join(a,t);if(n){let y=await vo(n);return ee.writeFileSync(l,y),l}if(i&&s&&r){let y=await ut(`${s.replace(/\/$/,"")}/wizard/logo/${encodeURIComponent(r)}/${encodeURIComponent(t)}`,{headers:{Authorization:`Bearer ${i}`}}),m=await vo(y.downloadUrl);return ee.writeFileSync(l,m),l}throw new Error("Logo download requires logoUrl from wizard poll or CFM_INSTANCE_ID + CFM_DEPLOY_API_BASE")}var ee,Eo,Ro,We,Fe=B(()=>{"use strict";ee=P(require("fs")),Eo=P(require("http")),Ro=P(require("https")),We=P(require("path"))});var jo={};je(jo,{runConfirmUiConfig:()=>St});function wt(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function St(e={}){let o=process.env.INIT_CWD??process.cwd(),t=Z(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=Be(n,i);if(console.log(`
4
- ${z.bold}${z.cyan}\u{1F4CB} UI config review${z.reset}
5
- `),console.log(ve(s)),e.diffOnly){H.writeFileSync(t.diffJsonPath,JSON.stringify(s,null,2),"utf8"),H.writeFileSync(t.diffMdPath,ve(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(/\/$/,""),y=a?wt(a):null;try{await oe({projectRoot:o,fileName:r.fileName,logoUrl:r.url,jwt:a??void 0,apiBase:l||void 0,surveyId:y??void 0}),console.log(`${z.green} Logo saved to public/${r.fileName}${z.reset}`),r.url&&console.log(`${z.dim} Public logo URL: ${r.url}${z.reset}`)}catch(m){console.log(`${z.yellow} Logo not downloaded \u2014 ${m instanceof Error?m.message:String(m)}${z.reset}`)}}var H,z,Ao=B(()=>{"use strict";H=P(require("fs"));U();Re();Fe();z=c});var _o={};je(_o,{runFetchUiConfig:()=>Tt});async function $t(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?Ct:bt).request(i,{method:"GET",headers:o.headers??{}},a=>{let l="";a.on("data",y=>l+=y),a.on("end",()=>{if((a.statusCode??500)>=400){n(new Error(`HTTP ${a.statusCode}: ${l}`));return}try{t(JSON.parse(l))}catch{n(new Error(`Invalid JSON: ${l.slice(0,200)}`))}})});r.on("error",n),r.end()})}function xt(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function Tt(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=xt(o);if(!i)throw new Error("Could not parse surveyId from CFM_INSTANCE_ID JWT");let s=process.env.INIT_CWD??process.cwd(),r=Z(s),a=Se.existsSync(r.seedPath)?r.seedPath:r.activeConfigPath;if(!Se.existsSync(a))throw new Error(`Missing seed config at ${a}. Run customize-ui --review first.`);let l=await $t(`${t}/wizard/config/${encodeURIComponent(i)}?sessionId=${encodeURIComponent(n)}`,{headers:{Authorization:`Bearer ${o}`}});if(l.status!=="ready"||!l.config)throw new Error(`Wizard not complete yet (status: ${l.status})`);let y=Ie(l)??l.config,m=JSON.parse(Se.readFileSync(a,"utf8")),C=Ee(s,m,y),S=y.global?.logo;if(S?.fileName)try{await oe({projectRoot:s,fileName:S.fileName,logoUrl:l.logoUrl,jwt:o,apiBase:t,surveyId:i}),console.log(`${L.green} Logo saved to public/${S.fileName}${L.reset}`)}catch(I){console.warn(`${L.yellow} Logo download failed: ${I}${L.reset}`)}console.log(`
6
- ${L.green}\u2705 Fetched final config (review mode)${L.reset}`),console.log(`${L.green} Final: ${r.finalPath}${L.reset}`),console.log(`${L.green} Diff: ${r.diffMdPath}${L.reset}`),console.log(`${L.yellow} ${C.changed.length} changed, ${C.added.length} added, ${C.removed.length} removed${L.reset}`),console.log(`${L.dim} Apply when ready: npx cfm-sdk confirm-ui-config${L.reset}`)}var Se,bt,Ct,L,Do=B(()=>{"use strict";Se=P(require("fs")),bt=P(require("http")),Ct=P(require("https"));U();Re();Fe();L=c});U();U();var ue=require("child_process");function ne(e){try{let o=process.platform==="win32"?`where ${e}`:`command -v ${e}`;return(0,ue.execSync)(o,{stdio:"ignore"}),!0}catch{return!1}}var Wo={stdio:"inherit",shell:process.platform==="win32"?"cmd.exe":"/bin/sh"};function pe(e,o){try{let t=`${e} ${o.join(" ")}`;return(0,ue.execSync)(t,Wo),!0}catch{return!1}}function be(e,o){return new Promise(t=>{(0,ue.spawn)(e,o,{stdio:"inherit",shell:!0}).on("close",i=>{t(i)})})}var Ve=P(require("readline/promises")),Ce=require("process");async function ie(e){let o=Ve.default.createInterface({input:Ce.stdin,output:Ce.stdout});try{return(await o.question(e)).trim()}finally{o.close()}}async function Xe(){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 ie("Would you like to install/upgrade Node.js v18+ automatically? (y/N): ");o.toLowerCase()==="y"||o.toLowerCase()==="yes"||(console.log(`
2
+ "use strict";var Do=Object.create;var Fe=Object.defineProperty;var Oo=Object.getOwnPropertyDescriptor;var Lo=Object.getOwnPropertyNames;var Mo=Object.getPrototypeOf,Uo=Object.prototype.hasOwnProperty;var W=(e,o)=>()=>(e&&(o=e(e=0)),o);var Ne=(e,o)=>{for(var t in o)Fe(e,t,{get:o[t],enumerable:!0})},zo=(e,o,t,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let i of Lo(o))!Uo.call(e,i)&&i!==t&&Fe(e,i,{get:()=>o[i],enumerable:!(n=Oo(o,i))||n.enumerable});return e};var k=(e,o,t)=>(t=e!=null?Do(Mo(e)):{},zo(o||!e||!e.__esModule?Fe(t,"default",{value:e,enumerable:!0}):t,e));var c,z=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,$e=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 Jo(e){let o={};for(let t of e)Ye[t]&&(o[t]={...Ye[t]});return o}function Ho(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:{...D},colorSource:"auto",typography:{fontFamily:"Inter, sans-serif",headingWeight:700},motion:{enabled:!1,durationMs:200}},questionTypes:Jo(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 Ze(e){let o=(e.surveyTypes??[]).filter(r=>G.includes(r)),t=Ho(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 D,Ye,eo=W(()=>{"use strict";$e();D={primary:"#1A1F36",secondary:"#E8F5FD",accent:"#00B5AD",background:"#FFFFFF",text:"#1A1F36",buttonText:"#FFFFFF"},Ye={MCQ:{cardStyle:"outlined",selectedAccent:D.accent,optionGap:8,borderRadius:8,cardPadding:12,selectedBackground:D.secondary,hoverBorderColor:D.accent},TEXTFIELD:{inputRadius:8,focusRing:D.accent,borderColor:"#E5E7EB",inputPadding:12,inputHeight:44,placeholderColor:"#9CA3AF"},NPS_SCALE:{buttonStyle:"standard",selectedFill:D.secondary,labelColor:D.text,trackBarColor:"#F2F2F2",trackHighlightColor:"#FBE8F3",cellSize:40,cellGap:4},CFM_MATRIX:{rowLabelWidth:180,cellSelectedColor:D.accent,headerStyle:"bold",bipolarColumnWidthPercent:25,carouselDotColor:"#2563EB",cellPadding:8},CSAT_MATRIX:{rowLabelWidth:180,cellSelectedColor:D.accent,headerStyle:"bold",bipolarColumnWidthPercent:25,carouselDotColor:D.primary,cellPadding:8,accentColor:D.accent,emojiSize:24,unselectedOpacity:.5,selectedRingColor:D.accent,cellSize:40,tooltipBg:"#1F2937"},RATING_MATRIX:{starColor:"#F59E0B",badgeColor:D.primary,rowLabelWidth:180,unselectedStarOpacity:.5},SLIDER_MATRIX:{trackColor:D.accent,thumbColor:D.primary,tickColor:"#9CA3AF",rowLabelWidth:180,rowBandColor:"#F3F4F6",tickBadgeSize:28},FILE_UPLOAD:{dropzoneStyle:"dashed",accentColor:D.accent,dropzonePadding:24},TEXT_AND_MEDIA:{mediaMaxWidth:100,mediaRadius:8,captionColor:"#6B7280",captionSize:14},HEATMAP:{pinColor:D.accent,pinSize:12,pinBorderColor:"#FFFFFF",overlayOpacity:.3},RANK_ORDER:{itemBg:"#F9FAFB",dragHandleColor:"#9CA3AF",rankBadgeColor:D.primary,itemPadding:12,itemGap:8}}});function ro(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 io(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 so(e){let o={global:{},questionTypes:{}},t=o.global,n={},i={},s={},r={},a={},l={},y={},m=o.questionTypes;if(e["--cfm-primary"]&&(n.primary=e["--cfm-primary"]),e["--cfm-secondary"]&&(n.secondary=e["--cfm-secondary"]),e["--cfm-accent"]&&(n.accent=e["--cfm-accent"]),e["--cfm-background"]&&(n.background=e["--cfm-background"]),e["--cfm-text"]&&(n.text=e["--cfm-text"]),e["--cfm-button-text"]&&(n.buttonText=e["--cfm-button-text"]),e["--cfm-max-width"]&&oo[e["--cfm-max-width"]]&&(a.width=oo[e["--cfm-max-width"]]),e["--cfm-border-radius"]&&to[e["--cfm-border-radius"]]&&(a.borderStyle=to[e["--cfm-border-radius"]]),e["--cfm-font-family"]&&(l.fontFamily=e["--cfm-font-family"],no[e["--cfm-font-family"]]&&(a.fontStyle=no[e["--cfm-font-family"]])),e["--cfm-heading-weight"]&&(l.headingWeight=pe(e["--cfm-heading-weight"])),e["--cfm-motion-duration"]){let _=b(e["--cfm-motion-duration"]);_!==void 0&&(y.durationMs=_,y.enabled=_>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 C={};e["--cfm-mcq-selected-accent"]&&(C.selectedAccent=e["--cfm-mcq-selected-accent"]),e["--cfm-mcq-border-radius"]&&(C.borderRadius=b(e["--cfm-mcq-border-radius"])),e["--cfm-mcq-option-gap"]&&(C.optionGap=b(e["--cfm-mcq-option-gap"])),e["--cfm-mcq-card-padding"]&&(C.cardPadding=b(e["--cfm-mcq-card-padding"])),e["--cfm-mcq-selected-bg"]&&(C.selectedBackground=e["--cfm-mcq-selected-bg"]),e["--cfm-mcq-hover-border"]&&(C.hoverBorderColor=e["--cfm-mcq-hover-border"]),Object.keys(C).length&&(m.MCQ=C);let S={};e["--cfm-input-radius"]&&(S.inputRadius=b(e["--cfm-input-radius"])),e["--cfm-input-focus-ring"]&&(S.focusRing=e["--cfm-input-focus-ring"]),e["--cfm-input-border"]&&(S.borderColor=e["--cfm-input-border"]),e["--cfm-input-padding"]&&(S.inputPadding=b(e["--cfm-input-padding"])),e["--cfm-input-height"]&&(S.inputHeight=b(e["--cfm-input-height"])),e["--cfm-input-placeholder"]&&(S.placeholderColor=e["--cfm-input-placeholder"]),Object.keys(S).length&&(m.TEXTFIELD=S);let v={};e["--cfm-nps-selected-fill"]&&(v.selectedFill=e["--cfm-nps-selected-fill"]),e["--cfm-nps-label-color"]&&(v.labelColor=e["--cfm-nps-label-color"]),e["--cfm-nps-track-bar"]&&(v.trackBarColor=e["--cfm-nps-track-bar"]),e["--cfm-nps-track-highlight"]&&(v.trackHighlightColor=e["--cfm-nps-track-highlight"]),e["--cfm-nps-cell-size"]&&(v.cellSize=b(e["--cfm-nps-cell-size"])),e["--cfm-nps-cell-gap"]&&(v.cellGap=b(e["--cfm-nps-cell-gap"])),Object.keys(v).length&&(m.NPS_SCALE=v);let R=b(e["--cfm-matrix-row-width"]),x={};R!==void 0&&(x.rowLabelWidth=R),e["--cfm-matrix-selected"]&&(x.cellSelectedColor=e["--cfm-matrix-selected"]),e["--cfm-matrix-bipolar-width"]&&(x.bipolarColumnWidthPercent=io(e["--cfm-matrix-bipolar-width"])),e["--cfm-matrix-carousel-dot"]&&(x.carouselDotColor=e["--cfm-matrix-carousel-dot"]),e["--cfm-matrix-cell-padding"]&&(x.cellPadding=b(e["--cfm-matrix-cell-padding"])),Object.keys(x).length&&(m.CFM_MATRIX=x);let d={...x};e["--cfm-csat-accent"]&&(d.accentColor=e["--cfm-csat-accent"]),e["--cfm-csat-emoji-size"]&&(d.emojiSize=b(e["--cfm-csat-emoji-size"])),e["--cfm-csat-unselected-opacity"]&&(d.unselectedOpacity=pe(e["--cfm-csat-unselected-opacity"])),e["--cfm-csat-ring-color"]&&(d.selectedRingColor=e["--cfm-csat-ring-color"]),e["--cfm-csat-cell-size"]&&(d.cellSize=b(e["--cfm-csat-cell-size"])),e["--cfm-csat-tooltip-bg"]&&(d.tooltipBg=e["--cfm-csat-tooltip-bg"]),(Object.keys(d).length>Object.keys(x).length||e["--cfm-csat-accent"])&&(m.CSAT_MATRIX=d);let f={};e["--cfm-star-color"]&&(f.starColor=e["--cfm-star-color"]),e["--cfm-badge-color"]&&(f.badgeColor=e["--cfm-badge-color"]),R!==void 0&&(f.rowLabelWidth=R),e["--cfm-star-unselected-opacity"]&&(f.unselectedStarOpacity=pe(e["--cfm-star-unselected-opacity"])),Object.keys(f).length&&(m.RATING_MATRIX=f);let T={};e["--cfm-slider-track"]&&(T.trackColor=e["--cfm-slider-track"]),e["--cfm-slider-thumb"]&&(T.thumbColor=e["--cfm-slider-thumb"]),e["--cfm-slider-tick"]&&(T.tickColor=e["--cfm-slider-tick"]),R!==void 0&&(T.rowLabelWidth=R),e["--cfm-slider-row-band"]&&(T.rowBandColor=e["--cfm-slider-row-band"]),e["--cfm-slider-tick-size"]&&(T.tickBadgeSize=b(e["--cfm-slider-tick-size"])),Object.keys(T).length&&(m.SLIDER_MATRIX=T);let $={};e["--cfm-upload-accent"]&&($.accentColor=e["--cfm-upload-accent"]),e["--cfm-upload-padding"]&&($.dropzonePadding=b(e["--cfm-upload-padding"])),Object.keys($).length&&(m.FILE_UPLOAD=$);let h={};e["--cfm-media-max-width"]&&(h.mediaMaxWidth=io(e["--cfm-media-max-width"])),e["--cfm-media-radius"]&&(h.mediaRadius=b(e["--cfm-media-radius"])),e["--cfm-media-caption-color"]&&(h.captionColor=e["--cfm-media-caption-color"]),e["--cfm-media-caption-size"]&&(h.captionSize=b(e["--cfm-media-caption-size"])),Object.keys(h).length&&(m.TEXT_AND_MEDIA=h);let E={};e["--cfm-heatmap-pin"]&&(E.pinColor=e["--cfm-heatmap-pin"]),e["--cfm-heatmap-pin-size"]&&(E.pinSize=b(e["--cfm-heatmap-pin-size"])),e["--cfm-heatmap-pin-border"]&&(E.pinBorderColor=e["--cfm-heatmap-pin-border"]),e["--cfm-heatmap-overlay-opacity"]&&(E.overlayOpacity=pe(e["--cfm-heatmap-overlay-opacity"])),Object.keys(E).length&&(m.HEATMAP=E);let w={};return e["--cfm-rank-item-bg"]&&(w.itemBg=e["--cfm-rank-item-bg"]),e["--cfm-rank-badge"]&&(w.rankBadgeColor=e["--cfm-rank-badge"]),e["--cfm-rank-handle"]&&(w.dragHandleColor=e["--cfm-rank-handle"]),e["--cfm-rank-item-padding"]&&(w.itemPadding=b(e["--cfm-rank-item-padding"])),e["--cfm-rank-item-gap"]&&(w.itemGap=b(e["--cfm-rank-item-gap"])),Object.keys(w).length&&(m.RANK_ORDER=w),Object.keys(n).length&&(t.colorScheme=n),Object.keys(i).length&&(t.header=i),Object.keys(s).length&&(t.footer=s),Object.keys(r).length&&(t.theme=r),Object.keys(a).length&&(t.layout=a),Object.keys(l).length&&(t.typography=l),Object.keys(y).length&&(t.motion=y),o}function ie(e){let o=[me.join(e,"src","styles","survey-theme.css"),me.join(e,"src","app","survey-theme.css"),me.join(e,"src","styles","globals.css"),me.join(e,"src","app","globals.css")];for(let t of o)if(xe.existsSync(t)&&xe.readFileSync(t,"utf8").includes("--cfm-"))return t;return null}var xe,me,oo,to,no,Te=W(()=>{"use strict";xe=k(require("fs")),me=k(require("path")),oo={"36rem":"narrow","48rem":"standard","64rem":"wide"},to={"0px":"sharp","12px":"rounded","9999px":"pill"},no={"system-ui, sans-serif":"system","Inter, sans-serif":"modern","Georgia, serif":"serif"}});function Xo(e){for(let o of Vo){let t=co.join(e,o);if(ke.existsSync(t))return t}return null}function qo(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 ao(e){let o=Xo(e);if(!o)return null;let t=ke.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=qo(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 ke,co,Vo,lo=W(()=>{"use strict";ke=k(require("fs")),co=k(require("path")),Vo=["src/components/Header.tsx","components/Header.tsx","app/components/Header.tsx"]});var mo={};Ne(mo,{logSeedSource:()=>_e,resolveInitialConfig:()=>se,writeResolvedUiConfig:()=>De});function Ae(e){return e.filter(o=>G.includes(o))}function fo(e){try{let o=JSON.parse(J.readFileSync(e,"utf8"));return o.version!=="1.0"?null:(delete o.configuredAt,o)}catch{return null}}function Ko(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 po(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=Go[i]??"application/octet-stream";return{fileName:o,dataUrl:`data:${s};base64,${n.toString("base64")}`}}function go(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=po(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 uo(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 se(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=ie(o);if(l){let w=J.readFileSync(l,"utf8"),_=ro(w);Object.keys(_).length>0&&(r=so(_),a="survey-theme.css")}let y=Ko(n);r=uo(r,y);let m=fo(t);m&&(r=uo(r,m),a="survey-ui-config.json");let C=X.join(o,"survey-ui-config.final.json"),S=fo(C),v=!!m?.configuredAt,R=!!S?.configuredAt;if(S&&R&&!v){let w=go(i,S.global?.logo);w&&(r.global={...r.global??{},logo:{fileName:w.fileName,url:w.url}})}let x=go(i,r.global?.logo),d=ao(o),f=!!m?.configuredAt,T=x?.fileName!=null&&/^logo_\d+_/i.test(x.fileName),$=d?.mode==="image"?d.fileName:null,h=!f&&T&&$!=null&&x?.fileName!==$;if(x&&!h)r.global={...r.global??{},logo:{fileName:x.fileName,url:x.url}};else if(d?.mode==="image"){let w=po(i,d.fileName);r.global={...r.global??{},logo:{fileName:d.fileName,url:w?.dataUrl||null}}}else d?.mode==="text"&&(r.global={...r.global??{},logo:{fileName:null,url:null},companyName:r.global?.companyName??d.label});return r.surveyTypes=Ae(r.surveyTypes??s),r.surveyTypes?.length||(r.surveyTypes=s),e.instanceId&&(r.instanceId=e.instanceId),{config:Ze(r),source:a}}function _e(e){console.log(e==="survey-ui-config.json"?`${re.dim} Seeding wizard from survey-ui-config.json${re.reset}`:e==="survey-theme.css"?`${re.dim} Seeding wizard from survey-theme.css + defaults${re.reset}`:`${re.dim} Seeding wizard from SDK defaults${re.reset}`)}function De(e={}){let o=e.projectRoot??process.env.INIT_CWD??process.cwd(),t=e.surveyTypes??Ae(G),{config:n}=se({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,re,Qo,Go,he=W(()=>{"use strict";J=k(require("fs")),X=k(require("path"));z();eo();Te();$e();lo();re=c,Qo=512e3,Go={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml"}});function $o(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function xo(e,o){return JSON.stringify(e)===JSON.stringify(o)}function ae(e){return typeof e=="string"&&e.startsWith("data:")&&e.length>80?`${e.slice(0,48)}\u2026 (${e.length} chars)`:e}function To(e,o,t,n){if(xo(e,o)){n.unchangedCount+=1;return}if(e===void 0&&o!==void 0){n.added.push({path:t,before:void 0,after:ae(o)});return}if(e!==void 0&&o===void 0){n.removed.push({path:t,before:ae(e),after:void 0});return}if(Array.isArray(e)&&Array.isArray(o)){xo(e,o)?n.unchangedCount+=1:n.changed.push({path:t,before:ae(e),after:ae(o)});return}if($o(e)&&$o(o)){let i=new Set([...Object.keys(e),...Object.keys(o)]);for(let s of i){if(dt.has(s)&&t==="")continue;let r=t?`${t}.${s}`:s;To(e[s],o[s],r,n)}return}n.changed.push({path:t,before:ae(e),after:ae(o)})}function Be(e,o){let t={changed:[],added:[],removed:[],unchangedCount:0};return To(e,o,"",t),t}function Ee(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:fe.join(e,"survey-ui-config.seed.json"),finalPath:fe.join(e,"survey-ui-config.final.json"),diffJsonPath:fe.join(e,"survey-ui-config.diff.json"),diffMdPath:fe.join(e,"survey-ui-config.diff.md"),activeConfigPath:fe.join(e,"survey-ui-config.json")}}function ve(e,o,t){let n=Y(e),i=Be(o,t);return le.writeFileSync(n.seedPath,JSON.stringify(o,null,2),"utf8"),le.writeFileSync(n.finalPath,JSON.stringify(t,null,2),"utf8"),le.writeFileSync(n.diffJsonPath,JSON.stringify(i,null,2),"utf8"),le.writeFileSync(n.diffMdPath,Ee(i),"utf8"),le.writeFileSync(n.activeConfigPath,JSON.stringify(o,null,2),"utf8"),i}var le,fe,dt,Re=W(()=>{"use strict";le=k(require("fs")),fe=k(require("path")),dt=new Set(["configuredAt","instanceId"])});function Ie(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 ko(e){return new Promise((o,t)=>{let n=new URL(e);(n.protocol==="https:"?Eo:Po).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 gt(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?Eo:Po).request(i,{method:"GET",headers:o.headers??{}},a=>{let l="";a.on("data",y=>l+=y),a.on("end",()=>{if((a.statusCode??500)>=400){n(new Error(`HTTP ${a.statusCode}: ${l}`));return}try{t(JSON.parse(l))}catch{n(new Error(`Invalid JSON: ${l.slice(0,200)}`))}})});r.on("error",n),r.end()})}async function ee(e){let{projectRoot:o,fileName:t,logoUrl:n,jwt:i,apiBase:s,surveyId:r}=e,a=We.join(o,"public");Z.existsSync(a)||Z.mkdirSync(a,{recursive:!0});let l=We.join(a,t);if(n){let y=await ko(n);return Z.writeFileSync(l,y),l}if(i&&s&&r){let y=await gt(`${s.replace(/\/$/,"")}/wizard/logo/${encodeURIComponent(r)}/${encodeURIComponent(t)}`,{headers:{Authorization:`Bearer ${i}`}}),m=await ko(y.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,Po,Eo,We,je=W(()=>{"use strict";Z=k(require("fs")),Po=k(require("http")),Eo=k(require("https")),We=k(require("path"))});var Fo={};Ne(Fo,{runConfirmUiConfig:()=>wt});function yt(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function wt(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=Be(n,i);if(console.log(`
4
+ ${B.bold}${B.cyan}\u{1F4CB} UI config review${B.reset}
5
+ `),console.log(Ee(s)),e.diffOnly){H.writeFileSync(t.diffJsonPath,JSON.stringify(s,null,2),"utf8"),H.writeFileSync(t.diffMdPath,Ee(s),"utf8"),console.log(`${B.dim} Updated ${t.diffMdPath}${B.reset}`);return}H.writeFileSync(t.activeConfigPath,JSON.stringify(i,null,2),"utf8"),console.log(`${B.green}\u2705 Applied final config \u2192 ${t.activeConfigPath}${B.reset}`);let r=i.global?.logo;if(!r?.fileName)return;let a=process.env.CFM_INSTANCE_ID,l=(process.env.CFM_DEPLOY_API_BASE??"").replace(/\/$/,""),y=a?yt(a):null;try{await ee({projectRoot:o,fileName:r.fileName,logoUrl:r.url,jwt:a??void 0,apiBase:l||void 0,surveyId:y??void 0}),console.log(`${B.green} Logo saved to public/${r.fileName}${B.reset}`),r.url&&console.log(`${B.dim} Public logo URL: ${r.url}${B.reset}`)}catch(m){console.log(`${B.yellow} Logo not downloaded \u2014 ${m instanceof Error?m.message:String(m)}${B.reset}`)}}var H,B,No=W(()=>{"use strict";H=k(require("fs"));z();Re();je();B=c});var Ao={};Ne(Ao,{runFetchUiConfig:()=>xt});async function Ct(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?bt:St).request(i,{method:"GET",headers:o.headers??{}},a=>{let l="";a.on("data",y=>l+=y),a.on("end",()=>{if((a.statusCode??500)>=400){n(new Error(`HTTP ${a.statusCode}: ${l}`));return}try{t(JSON.parse(l))}catch{n(new Error(`Invalid JSON: ${l.slice(0,200)}`))}})});r.on("error",n),r.end()})}function $t(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function xt(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=$t(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=Se.existsSync(r.seedPath)?r.seedPath:r.activeConfigPath;if(!Se.existsSync(a))throw new Error(`Missing seed config at ${a}. Run customize-ui --review first.`);let l=await Ct(`${t}/wizard/config/${encodeURIComponent(i)}?sessionId=${encodeURIComponent(n)}`,{headers:{Authorization:`Bearer ${o}`}});if(l.status!=="ready"||!l.config)throw new Error(`Wizard not complete yet (status: ${l.status})`);let y=Ie(l)??l.config,m=JSON.parse(Se.readFileSync(a,"utf8")),C=ve(s,m,y),S=y.global?.logo;if(S?.fileName)try{await ee({projectRoot:s,fileName:S.fileName,logoUrl:l.logoUrl,jwt:o,apiBase:t,surveyId:i}),console.log(`${M.green} Logo saved to public/${S.fileName}${M.reset}`)}catch(v){console.warn(`${M.yellow} Logo download failed: ${v}${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} ${C.changed.length} changed, ${C.added.length} added, ${C.removed.length} removed${M.reset}`),console.log(`${M.dim} Apply when ready: npx cfm-sdk confirm-ui-config${M.reset}`)}var Se,St,bt,M,_o=W(()=>{"use strict";Se=k(require("fs")),St=k(require("http")),bt=k(require("https"));z();Re();je();M=c});z();z();var ge=require("child_process");function te(e){try{let o=process.platform==="win32"?`where ${e}`:`command -v ${e}`;return(0,ge.execSync)(o,{stdio:"ignore"}),!0}catch{return!1}}var Bo={stdio:"inherit",shell:process.platform==="win32"?"cmd.exe":"/bin/sh"};function ue(e,o){try{let t=`${e} ${o.join(" ")}`;return(0,ge.execSync)(t,Bo),!0}catch{return!1}}function be(e,o){return new Promise(t=>{(0,ge.spawn)(e,o,{stdio:"inherit",shell:!0}).on("close",i=>{t(i)})})}var He=k(require("readline/promises")),Ce=require("process");async function ne(e){let o=He.default.createInterface({input:Ce.stdin,output:Ce.stdout});try{return(await o.question(e)).trim()}finally{o.close()}}async function Ve(){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 ne("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?ne("winget")?(console.log(`
10
- \u{1F4E6} ${c.green}winget package manager found! Installing Node.js v18+ in background...${c.reset}`),pe("winget",["upgrade","OpenJS.NodeJS","--silent","--accept-package-agreements","--accept-source-agreements"])?(console.log(`
9
+ `),process.exit(1));let n=process.platform==="win32",i=process.platform==="darwin";n?te("winget")?(console.log(`
10
+ \u{1F4E6} ${c.green}winget package manager found! Installing Node.js v18+ in background...${c.reset}`),ue("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?ne("brew")?(console.log(`
17
- \u{1F4E6} ${c.green}Homebrew package manager found! Installing Node.js v18+ in background...${c.reset}`),pe("brew",["install","node"])?console.log(`
16
+ `),process.exit(1)):i?te("brew")?(console.log(`
17
+ \u{1F4E6} ${c.green}Homebrew package manager found! Installing Node.js v18+ in background...${c.reset}`),ue("brew",["install","node"])?console.log(`
18
18
  \u2714 ${c.green}Node.js installed successfully via Homebrew.${c.reset}
19
19
  `):(console.log(`
20
20
  \u274C ${c.red}Homebrew installation failed. Please install Node.js manually at https://nodejs.org/${c.reset}
@@ -22,18 +22,18 @@ ${L.green}\u2705 Fetched final config (review mode)${L.reset}`),console.log(`${L
22
22
  \u274C ${c.red}Homebrew package manager (brew) is not installed on this system.${c.reset}`),console.log(`${c.bold}\u{1F449} To proceed, please either:${c.reset}`),console.log(" 1. Install Homebrew by running the following command in your terminal:"),console.log(` ${c.cyan}/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"${c.reset}`),console.log(` 2. Or manually download and install Node.js (v18+) from: https://nodejs.org/
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
- `),process.exit(1))}else console.log(`\u2714 ${c.green}Node.js version (v${e}) is sufficient.${c.reset}`)}U();async function qe(){console.log(`
26
- ${c.dim}Step 2/4: Checking Vercel CLI...${c.reset}`);let e="vercel",o=!1;if(ne("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 ie("\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}`),pe("npm",["install","-g","vercel"])&&ne("vercel")?console.log(`\u2714 ${c.green}Vercel CLI installed successfully!${c.reset}`):(console.log(`
28
- \u26A0\uFE0F ${c.yellow}Global installation failed or permissions restricted.${c.reset}`),console.log(`\u2139 ${c.dim}Falling back: Running Vercel dynamically via npx.${c.reset}`),e="npx --yes vercel",o=!0)):(console.log(`\u2139 ${c.dim}Skipping global installation. Running Vercel dynamically via npx.${c.reset}`),e="npx --yes vercel",o=!0)}return{vercelCmd:e,useNpx:o}}var Qe=require("child_process");U();var Jo={stdio:"ignore",shell:process.platform==="win32"?"cmd.exe":"/bin/sh"};async function Ge(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,Qe.execSync)(e?"npx --yes vercel whoami":"vercel whoami",Jo),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 ie("\u{1F449} Press [Enter] to login to Vercel... ");let n=["login"],i=e?"npx":"vercel",s=e?["--yes","vercel",...n]:n;if(await be(i,s)!==0)throw new Error("Vercel login failed or was aborted.");console.log(`
30
- \u2714 ${c.green}Logged in successfully!${c.reset}`)}return o}U();async function Ke(e,o){console.log(`
25
+ `),process.exit(1))}else console.log(`\u2714 ${c.green}Node.js version (v${e}) is sufficient.${c.reset}`)}z();async function Xe(){console.log(`
26
+ ${c.dim}Step 2/4: Checking Vercel CLI...${c.reset}`);let e="vercel",o=!1;if(te("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 ne("\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}`),ue("npm",["install","-g","vercel"])&&te("vercel")?console.log(`\u2714 ${c.green}Vercel CLI installed successfully!${c.reset}`):(console.log(`
28
+ \u26A0\uFE0F ${c.yellow}Global installation failed or permissions restricted.${c.reset}`),console.log(`\u2139 ${c.dim}Falling back: Running Vercel dynamically via npx.${c.reset}`),e="npx --yes vercel",o=!0)):(console.log(`\u2139 ${c.dim}Skipping global installation. Running Vercel dynamically via npx.${c.reset}`),e="npx --yes vercel",o=!0)}return{vercelCmd:e,useNpx:o}}var qe=require("child_process");z();var Wo={stdio:"ignore",shell:process.platform==="win32"?"cmd.exe":"/bin/sh"};async function Qe(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,qe.execSync)(e?"npx --yes vercel whoami":"vercel whoami",Wo),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 ne("\u{1F449} Press [Enter] to login to Vercel... ");let n=["login"],i=e?"npx":"vercel",s=e?["--yes","vercel",...n]:n;if(await be(i,s)!==0)throw new Error("Vercel login failed or was aborted.");console.log(`
30
+ \u2714 ${c.green}Logged in successfully!${c.reset}`)}return o}z();async function Ge(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
32
  `),await be(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
- `)}async function Ye(){console.log(`
34
+ `)}async function Ke(){console.log(`
35
35
  ${c.bold}${c.cyan}\u{1F680} Starting CFM Vercel Deployment...${c.reset}
36
- `),await Xe();let{vercelCmd:e,useNpx:o}=await qe(),t=await Ge(o);await Ke(o,t)}var we=P(require("http")),v=P(require("fs")),j=P(require("path"));U();function O(e){return e instanceof Error?e.message:String(e)}he();var N=P(require("fs")),F=P(require("path"));U();Te();var u=P(require("fs")),p=P(require("path")),yo=require("child_process");Te();function Y(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()?Y(n,i):u.copyFileSync(n,i)}}}function Oe(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 Zo(e,o){let t=Oe(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 et(e,o){let t=[...Oe(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 ot(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 tt(e){let o=`import React from 'react';
36
+ `),await Ve();let{vercelCmd:e,useNpx:o}=await Xe(),t=await Qe(o);await Ge(o,t)}var we=k(require("http")),P=k(require("fs")),N=k(require("path"));z();function L(e){return e instanceof Error?e.message:String(e)}he();var j=k(require("fs")),I=k(require("path"));z();Te();var u=k(require("fs")),p=k(require("path")),ho=require("child_process");Te();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 Oe(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 Yo(e,o){let t=Oe(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 Zo(e,o){let t=[...Oe(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 et(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 ot(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';
@@ -76,7 +76,7 @@ mountPreview(<EndPage page={FIXTURE_END} />);`;default:return`${o}import { Quest
76
76
  import { PREVIEW_FIXTURES } from '../fixtures/questions';
77
77
  const question = PREVIEW_FIXTURES[${JSON.stringify(e)}];
78
78
  if (!question) throw new Error('Missing fixture for ${e}');
79
- mountPreview(<QuestionPreview question={question} />);`}}function nt(e,o,t,n){let i=Zo(o,t),s=n.map(a=>` '${a}': path.resolve(workDir, '${a}', 'index.html'),`).join(`
79
+ mountPreview(<QuestionPreview question={question} />);`}}function tt(e,o,t,n){let i=Yo(o,t),s=n.map(a=>` '${a}': path.resolve(workDir, '${a}', 'index.html'),`).join(`
80
80
  `),r=`import path from 'path';
81
81
  import { fileURLToPath } from 'url';
82
82
  import { defineConfig } from 'vite';
@@ -111,34 +111,37 @@ ${s}
111
111
  },
112
112
  },
113
113
  });
114
- `;u.writeFileSync(p.join(e,"vite.config.mjs"),r)}function it(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}
114
+ `;u.writeFileSync(p.join(e,"vite.config.mjs"),r)}function nt(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}`,u.writeFileSync(e,t)}function rt(e){return e.replace(/_/g," ")}async function wo(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=ot(o),a=p.join(t,".preview-vite-work");u.existsSync(a)&&u.rmSync(a,{recursive:!0,force:!0}),Y(s,a),u.mkdirSync(p.join(a,"agent","src"),{recursive:!0}),Y(r.componentsDir,p.join(a,"agent","src","components")),r.libDir&&Y(r.libDir,p.join(a,"agent","src","lib")),r.publicDir&&Y(r.publicDir,p.join(a,"agent","public"));let l=re(o),y=p.join(a,"src","survey-theme.css");u.writeFileSync(y,l?u.readFileSync(l,"utf8"):u.readFileSync(p.join(i,"templates","survey-theme.css"),"utf8")),u.mkdirSync(p.join(a,"src","entries"),{recursive:!0});for(let f of n)u.mkdirSync(p.join(a,f),{recursive:!0}),u.writeFileSync(p.join(a,f,"index.html"),`<!DOCTYPE html>
116
+ ${n}`,u.writeFileSync(e,t)}function it(e){return e.replace(/_/g," ")}async function yo(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=et(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=ie(o),y=p.join(a,"src","survey-theme.css");u.writeFileSync(y,l?u.readFileSync(l,"utf8"):u.readFileSync(p.join(i,"templates","survey-theme.css"),"utf8")),u.mkdirSync(p.join(a,"src","entries"),{recursive:!0});for(let f of n)u.mkdirSync(p.join(a,f),{recursive:!0}),u.writeFileSync(p.join(a,f,"index.html"),`<!DOCTYPE html>
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>${rt(f)} \u2014 CFM Preview</title>
121
+ <title>${it(f)} \u2014 CFM Preview</title>
122
122
  </head>
123
123
  <body>
124
124
  <div id="root"></div>
125
125
  <script type="module" src="../src/entries/${f}.tsx"></script>
126
126
  </body>
127
- </html>`),u.writeFileSync(p.join(a,"src","entries",`${f}.tsx`),tt(f));u.writeFileSync(p.join(a,"tsconfig.json"),JSON.stringify({compilerOptions:{target:"ES2020",lib:["ES2020","DOM","DOM.Iterable"],module:"ESNext",moduleResolution:"bundler",jsx:"react-jsx",strict:!0,skipLibCheck:!0,paths:{"@/*":["./agent/src/*"]}},include:["src","agent/src","stubs"]},null,2)),nt(a,o,i,n);let m=et(i,o),C=Oe(o).join(p.delimiter);(0,yo.execSync)(`node "${m}" build --config "${p.join(a,"vite.config.mjs")}"`,{cwd:a,stdio:"inherit",env:{...process.env,NODE_PATH:C}});let S=p.join(t,"previews");u.mkdirSync(S,{recursive:!0});let I=p.join(a,"dist"),R=u.readFileSync(p.join(i,"templates","preview-harness","preview-bridge.inline.js"),"utf8");for(let f of n){let T=p.join(I,f),$=p.join(S,f);if(!u.existsSync(p.join(T,"index.html")))throw new Error(`Vite build did not produce ${f}/index.html`);u.existsSync($)&&u.rmSync($,{recursive:!0,force:!0}),Y(T,$),it(p.join($,"index.html"),R)}let x=p.join(I,"assets");u.existsSync(x)&&Y(x,p.join(S,"assets"));let d=p.join(a,"agent","public");if(u.existsSync(d))for(let f of u.readdirSync(d)){let T=p.join(d,f);u.statSync(T).isFile()&&u.copyFileSync(T,p.join(S,f))}u.rmSync(a,{recursive:!0,force:!0})}var Le=P(require("fs")),Me=P(require("path"));function ke(e){if(e)return e;let o=process.cwd();if(Le.existsSync(Me.join(o,"src","components","Question.tsx")))return o;let t=process.env.INIT_CWD;return t&&Le.existsSync(Me.join(t,"src","components","Question.tsx"))?t:o}var D=c;function st(){return F.join(__dirname,"..","..","templates")}function ct(e){let o=N.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 at(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 Ue(e,o,t){if(N.existsSync(e))for(let n of N.readdirSync(e)){let i=F.join(e,n),s=F.posix.join(o,n);if(N.statSync(i).isDirectory())Ue(i,s,t);else{let r=F.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:N.statSync(i).size})}}}async function ae(e={}){let o=ke(e.projectRoot),t=e.outputDir??F.join(o,"out"),n=st(),i=F.join(n,"preview-harness");e.useTemplatesOnly&&console.log(`${D.dim} Using SDK template preview harness only (--use-templates-only)${D.reset}`);let s=F.join(i,"previewPages.js"),{PREVIEW_PAGE_DEFS:r,buildPreviewHtml:a,PREVIEW_KEYS:l}=require(s),y=(()=>{let d=re(o);return d?(console.log(`${D.dim} Using project theme: ${F.relative(o,d)}${D.reset}`),N.readFileSync(d,"utf8")):N.readFileSync(F.join(n,"survey-theme.css"),"utf8")})(),m=N.readFileSync(F.join(i,"preview-bridge.inline.js"),"utf8"),C=e.surveyTypes;if(!C){let d=F.join(o,"implementation_plan.md");C=N.existsSync(d)?ct(d):["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"]}let S=at(l,C),I=F.join(t,"previews");if(N.existsSync(I)&&(N.rmSync(I,{recursive:!0,force:!0}),console.log(`${D.dim} Cleared previous preview output${D.reset}`)),N.mkdirSync(I,{recursive:!0}),!e.useTemplatesOnly)try{console.log(`${D.dim} Building previews from agent components (Vite)\u2026${D.reset}`),await wo({projectRoot:o,outputDir:t,keys:S});let d={};for(let T of S)d[T]=`previews/${T}/index.html`;N.writeFileSync(F.join(t,"previews","manifest.json"),JSON.stringify(d,null,2));let f=[];return Ue(F.join(t,"previews"),"previews",f),console.log(`${D.green}\u2705 Exported ${S.length} agent component previews \u2192 ${t}${D.reset}`),{outputDir:t,manifestPath:F.join(t,"previews","manifest.json"),files:f,surveyTypes:C}}catch(d){console.warn(`${D.yellow}\u26A0 Agent Vite preview build failed; falling back to template harness.${D.reset}`),console.warn(`${D.dim} ${O(d)}${D.reset}`)}for(let d of r){if(!S.includes(d.key))continue;let f=F.join(t,"previews",d.key);N.mkdirSync(f,{recursive:!0}),N.writeFileSync(F.join(f,"index.html"),a(d,y,m))}let R={};for(let d of S)R[d]=`previews/${d}/index.html`;N.writeFileSync(F.join(t,"previews","manifest.json"),JSON.stringify(R,null,2));let x=[];return Ue(F.join(t,"previews"),"previews",x),console.log(`${D.green}\u2705 Exported ${S.length} preview pages \u2192 ${t}${D.reset}`),{outputDir:t,manifestPath:F.join(t,"previews","manifest.json"),files:x,surveyTypes:C}}var K=c,ye=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"];function $o(e){return new Promise(o=>{let t=we.createServer();t.listen(e,()=>{t.close(()=>o(e))}),t.on("error",()=>o($o(e+1)))})}function So(e){return new Promise((o,t)=>{let n="";e.on("data",i=>n+=i),e.on("end",()=>o(n)),e.on("error",t)})}function lt(e){let{exec:o}=require("child_process"),t=process.platform==="darwin"?`open "${e}"`:process.platform==="win32"?`start "" "${e}"`:`xdg-open "${e}"`;o(t)}function bo(e){let o=j.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 ft(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 ye)e.includes(s)&&o.add(s);let i=e.matchAll(/\|\s*`([A-Z_]+)`\s*\|/g);for(let s of i)ye.includes(s[1])&&o.add(s[1]);return{surveyTypes:o.size>0?[...o]:[...ye],instanceId:t}}async function Co(e){return new Promise(o=>{try{let t=we.get(e,n=>{o((n.statusCode??500)<500),n.resume()});t.on("error",()=>o(!1)),t.setTimeout(2e3,()=>{t.destroy(),o(!1)})}catch{o(!1)}})}function ze(e){let o=j.join(e,"out","previews");v.existsSync(o)&&(v.rmSync(o,{recursive:!0,force:!0}),console.log(`${K.dim} Removed local preview files: out/previews/${K.reset}`))}async function xo(){let e=process.env.INIT_CWD||process.cwd(),o=j.join(e,"public"),t=j.join(e,"survey-ui-config.json"),n=j.join(e,"implementation_plan.md"),i=j.join(__dirname,"..","..","templates"),s=j.join(i,"wizard-dist"),r=process.env.CFM_PREVIEW_URL??"http://localhost:3000",a={},l=j.join(e,"out","previews"),y=j.join(l,"manifest.json");v.existsSync(y)||(console.log(`${K.dim} Exporting component previews for local wizard\u2026${K.reset}`),await ae({projectRoot:e,surveyTypes:[...ye]})),v.existsSync(y)&&(a=JSON.parse(v.readFileSync(y,"utf8")));let m=await $o(4200),C=`http://localhost:${m}`;return new Promise((S,I)=>{let R=we.createServer(async(d,f)=>{try{let T=d.url??"/";if(d.method==="GET"&&T==="/api/inventory"){let $;if(v.existsSync(n)){let w=v.readFileSync(n,"utf8");$=ft(w).instanceId}if(v.existsSync(t))try{let w=JSON.parse(v.readFileSync(t,"utf8"));w.instanceId&&($=w.instanceId)}catch{}let h=[...ye],{config:E}=ce({projectRoot:e,surveyTypes:h,instanceId:$});f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({surveyTypes:h,instanceId:$,previewUrl:r,initialConfig:E,previewManifest:Object.fromEntries(Object.keys(a).map(w=>[w,`${C}/previews/${w}/index.html`]))}));return}if(d.method==="GET"&&T==="/api/preview-url"){let $=await Co(r);f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({url:r,connected:$}));return}if(d.method==="POST"&&T.split("?")[0]==="/api/wizard-quit"){ze(e),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!0,deleted:"out/previews"})),setTimeout(()=>{R.close(()=>S({saved:!1}))},300);return}if(d.method==="POST"&&T==="/api/upload-logo"){let $=await So(d),h=JSON.parse($);v.existsSync(o)||v.mkdirSync(o,{recursive:!0});let E=h.base64.replace(/^data:image\/\w+;base64,/,""),w=Buffer.from(E,"base64"),A=j.extname(h.filename),M=j.basename(h.filename,A).toLowerCase().replace(/[^a-z0-9_-]/g,""),te=`logo_${Date.now()}_${M}${A||".png"}`;v.writeFileSync(j.join(o,te),w),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({fileName:te}));return}if(d.method==="POST"&&T==="/api/save-config"){let $=await So(d),h=JSON.parse($);h.configuredAt=new Date().toISOString();let E=h.global?.logo;E?.url?.startsWith("data:")&&(E.url=null),v.writeFileSync(t,JSON.stringify(h,null,2),"utf8"),console.log(`
128
- ${K.green}\u2705 UI configuration saved to ${t}${K.reset}`),ze(e),console.log(`${K.dim} Local preview garbage collection complete (out/previews removed)${K.reset}`),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!0})),setTimeout(()=>{R.close(()=>S({saved:!0}))},500);return}if(d.method==="GET"){let $=T.split("?")[0];if($==="/"&&($="/index.html"),$.startsWith("/previews/")&&v.existsSync(l)){let w=$.replace(/^\/previews\//,""),A=j.join(l,w),M=j.normalize(A);if(M.startsWith(l)&&v.existsSync(M)&&v.statSync(M).isFile()){let te=v.readFileSync(M);f.writeHead(200,{"Content-Type":bo(M)}),f.end(te);return}}let h=v.existsSync(s),E=h?j.join(s,$):j.join(i,"wizard.html");if(h&&v.existsSync(E)&&v.statSync(E).isFile()){let w=v.readFileSync(E);f.writeHead(200,{"Content-Type":bo(E)}),f.end(w);return}if(!h&&$==="/index.html"){let w=v.readFileSync(j.join(i,"wizard.html"),"utf8");f.writeHead(200,{"Content-Type":"text/html"}),f.end(w);return}}f.writeHead(404,{"Content-Type":"text/plain"}),f.end("Not found")}catch(T){f.writeHead(500,{"Content-Type":"text/plain"}),f.end(`Server error: ${O(T)}`)}});R.listen(m,async()=>{let d=C;if(!await Co(`${d}/`)){R.close(()=>I(new Error(`Wizard server failed health check on ${d}`)));return}console.log(`WIZARD_LINK=${d}`),process.env.CFM_WIZARD_OPEN_BROWSER==="1"&&lt(d)}),R.on("error",I);let x=()=>{ze(e),R.close(()=>process.exit(130))};process.once("SIGINT",x),process.once("SIGTERM",x)})}var J=P(require("fs")),He=P(require("path")),Io=P(require("http")),Fo=P(require("https"));U();$e();he();Re();Fe();var g=c;function pt(e){let{exec:o}=require("child_process"),t=process.platform==="darwin"?`open "${e}"`:process.platform==="win32"?`start "" "${e}"`:`xdg-open "${e}"`;o(t)}function gt(e){return new Promise(o=>setTimeout(o,e))}async function Je(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?Fo:Io).request(i,{method:o.method??"GET",headers:o.headers??{}},a=>{let l="";a.on("data",y=>l+=y),a.on("end",()=>{if((a.statusCode??500)>=400){n(new Error(`HTTP ${a.statusCode}: ${l}`));return}try{t(JSON.parse(l))}catch{n(new Error(`Invalid JSON: ${l.slice(0,200)}`))}})});r.on("error",n),o.body&&r.write(o.body),r.end()})}async function mt(e,o,t,n){return new Promise((i,s)=>{let r=new URL(e),a=r.protocol==="https:"?Fo:Io,l={"Content-Type":t,"Content-Length":o.length};n&&(l["X-Wizard-Session"]=n.sessionSecret,l["X-Wizard-Session-Id"]=n.sessionId);let y=a.request(r,{method:"PUT",headers:l},m=>{if((m.statusCode??500)>=400){let C="";m.on("data",S=>C+=S),m.on("end",()=>s(new Error(`PUT failed ${m.statusCode}: ${C}`)));return}m.resume(),i()});y.on("error",s),y.write(o),y.end()})}function ht(e){let o=He.join(e,"out","previews");J.existsSync(o)&&(J.rmSync(o,{recursive:!0,force:!0}),console.log(`${g.dim} Removed local preview files: out/previews/${g.reset}`))}function yt(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function No(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=yt(i);if(!r)throw new Error("Could not parse surveyId from CFM_INSTANCE_ID JWT");let a=ke(),l=Z(a),y=l.activeConfigPath,m=e.apply?!1:e.review!==!1;console.log(`
127
+ </html>`),u.writeFileSync(p.join(a,"src","entries",`${f}.tsx`),ot(f));u.writeFileSync(p.join(a,"tsconfig.json"),JSON.stringify({compilerOptions:{target:"ES2020",lib:["ES2020","DOM","DOM.Iterable"],module:"ESNext",moduleResolution:"bundler",jsx:"react-jsx",strict:!0,skipLibCheck:!0,paths:{"@/*":["./agent/src/*"]}},include:["src","agent/src","stubs"]},null,2)),tt(a,o,i,n);let m=Zo(i,o),C=Oe(o).join(p.delimiter);(0,ho.execSync)(`node "${m}" build --config "${p.join(a,"vite.config.mjs")}"`,{cwd:a,stdio:"inherit",env:{...process.env,NODE_PATH:C}});let S=p.join(t,"previews");u.mkdirSync(S,{recursive:!0});let v=p.join(a,"dist"),R=u.readFileSync(p.join(i,"templates","preview-harness","preview-bridge.inline.js"),"utf8");for(let f of n){let T=p.join(v,f),$=p.join(S,f);if(!u.existsSync(p.join(T,"index.html")))throw new Error(`Vite build did not produce ${f}/index.html`);u.existsSync($)&&u.rmSync($,{recursive:!0,force:!0}),K(T,$),nt(p.join($,"index.html"),R)}let x=p.join(v,"assets");u.existsSync(x)&&K(x,p.join(S,"assets"));let d=p.join(a,"agent","public");if(u.existsSync(d))for(let f of u.readdirSync(d)){let T=p.join(d,f);u.statSync(T).isFile()&&u.copyFileSync(T,p.join(S,f))}u.rmSync(a,{recursive:!0,force:!0})}var Le=k(require("fs")),Me=k(require("path"));function Pe(e){if(e)return e;let o=process.cwd();if(Le.existsSync(Me.join(o,"src","components","Question.tsx")))return o;let t=process.env.INIT_CWD;return t&&Le.existsSync(Me.join(t,"src","components","Question.tsx"))?t:o}var O=c;function rt(){return I.join(__dirname,"..","..","templates")}function st(e){let o=j.readFileSync(e,"utf8"),t=new Set,n=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"];for(let i of n)o.includes(i)&&t.add(i);return t.size?[...t]:n}function ct(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 Ue(e,o,t){if(j.existsSync(e))for(let n of j.readdirSync(e)){let i=I.join(e,n),s=I.posix.join(o,n);if(j.statSync(i).isDirectory())Ue(i,s,t);else{let r=I.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:j.statSync(i).size})}}}async function ce(e={}){let o=Pe(e.projectRoot),t=e.outputDir??I.join(o,"out"),n=rt(),i=I.join(n,"preview-harness");e.useTemplatesOnly&&console.log(`${O.dim} Using SDK template preview harness only (--use-templates-only)${O.reset}`);let s=I.join(i,"previewPages.js"),{PREVIEW_PAGE_DEFS:r,buildPreviewHtml:a,PREVIEW_KEYS:l}=require(s),y=(()=>{let d=ie(o);return d?(console.log(`${O.dim} Using project theme: ${I.relative(o,d)}${O.reset}`),j.readFileSync(d,"utf8")):j.readFileSync(I.join(n,"survey-theme.css"),"utf8")})(),m=j.readFileSync(I.join(i,"preview-bridge.inline.js"),"utf8"),C=e.surveyTypes;if(!C){let d=I.join(o,"implementation_plan.md");C=j.existsSync(d)?st(d):["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"]}let S=ct(l,C),v=I.join(t,"previews");if(j.existsSync(v)&&(j.rmSync(v,{recursive:!0,force:!0}),console.log(`${O.dim} Cleared previous preview output${O.reset}`)),j.mkdirSync(v,{recursive:!0}),!e.useTemplatesOnly)try{console.log(`${O.dim} Building previews from agent components (Vite)\u2026${O.reset}`),await yo({projectRoot:o,outputDir:t,keys:S});let d={};for(let T of S)d[T]=`previews/${T}/index.html`;j.writeFileSync(I.join(t,"previews","manifest.json"),JSON.stringify(d,null,2));let f=[];return Ue(I.join(t,"previews"),"previews",f),console.log(`${O.green}\u2705 Exported ${S.length} agent component previews \u2192 ${t}${O.reset}`),{outputDir:t,manifestPath:I.join(t,"previews","manifest.json"),files:f,surveyTypes:C}}catch(d){console.warn(`${O.yellow}\u26A0 Agent Vite preview build failed; falling back to template harness.${O.reset}`),console.warn(`${O.dim} ${L(d)}${O.reset}`)}for(let d of r){if(!S.includes(d.key))continue;let f=I.join(t,"previews",d.key);j.mkdirSync(f,{recursive:!0}),j.writeFileSync(I.join(f,"index.html"),a(d,y,m))}let R={};for(let d of S)R[d]=`previews/${d}/index.html`;j.writeFileSync(I.join(t,"previews","manifest.json"),JSON.stringify(R,null,2));let x=[];return Ue(I.join(t,"previews"),"previews",x),console.log(`${O.green}\u2705 Exported ${S.length} preview pages \u2192 ${t}${O.reset}`),{outputDir:t,manifestPath:I.join(t,"previews","manifest.json"),files:x,surveyTypes:C}}var F=c,ye=["MCQ","TEXTFIELD","NPS_SCALE","CFM_MATRIX","CSAT_MATRIX","RATING_MATRIX","SLIDER_MATRIX","FILE_UPLOAD","TEXT_AND_MEDIA","HEATMAP","RANK_ORDER"];function bo(e){return new Promise(o=>{let t=we.createServer();t.listen(e,()=>{t.close(()=>o(e))}),t.on("error",()=>o(bo(e+1)))})}function wo(e){return new Promise((o,t)=>{let n="";e.on("data",i=>n+=i),e.on("end",()=>o(n)),e.on("error",t)})}function at(e){let{exec:o}=require("child_process"),t=process.platform==="darwin"?`open "${e}"`:process.platform==="win32"?`start "" "${e}"`:`xdg-open "${e}"`;o(t)}function So(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 lt(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 ye)e.includes(s)&&o.add(s);let i=e.matchAll(/\|\s*`([A-Z_]+)`\s*\|/g);for(let s of i)ye.includes(s[1])&&o.add(s[1]);return{surveyTypes:o.size>0?[...o]:[...ye],instanceId:t}}async function ft(e){return new Promise(o=>{try{let t=we.get(e,n=>{o((n.statusCode??500)<500),n.resume()});t.on("error",()=>o(!1)),t.setTimeout(2e3,()=>{t.destroy(),o(!1)})}catch{o(!1)}})}function ze(e){let o=N.join(e,"out","previews");P.existsSync(o)&&(P.rmSync(o,{recursive:!0,force:!0}),console.log(`${F.dim} Removed local preview files: out/previews/${F.reset}`))}async function Co(){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"),y=N.join(l,"manifest.json");P.existsSync(y)||(console.log(`${F.dim} Exporting component previews for local wizard\u2026${F.reset}`),await ce({projectRoot:e,surveyTypes:[...ye]})),P.existsSync(y)&&(a=JSON.parse(P.readFileSync(y,"utf8")));let m=await bo(4200),C=`http://localhost:${m}`;return new Promise((S,v)=>{let R=we.createServer(async(d,f)=>{try{let T=d.url??"/";if(d.method==="GET"&&T==="/api/inventory"){let $;if(P.existsSync(n)){let w=P.readFileSync(n,"utf8");$=lt(w).instanceId}if(P.existsSync(t))try{let w=JSON.parse(P.readFileSync(t,"utf8"));w.instanceId&&($=w.instanceId)}catch{}let h=[...ye],{config:E}=se({projectRoot:e,surveyTypes:h,instanceId:$});f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({surveyTypes:h,instanceId:$,previewUrl:r,initialConfig:E,previewManifest:Object.fromEntries(Object.keys(a).map(w=>[w,`${C}/previews/${w}/index.html`]))}));return}if(d.method==="GET"&&T==="/api/preview-url"){let $=await ft(r);f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({url:r,connected:$}));return}if(d.method==="POST"&&T.split("?")[0]==="/api/wizard-quit"){ze(e),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!0,deleted:"out/previews"})),setTimeout(()=>{R.close(()=>{v(new Error("Client quit the wizard without saving. Local preview garbage collection complete (out/previews removed)."))})},300);return}if(d.method==="POST"&&T==="/api/upload-logo"){let $=await wo(d),h=JSON.parse($);P.existsSync(o)||P.mkdirSync(o,{recursive:!0});let E=h.base64.replace(/^data:image\/\w+;base64,/,""),w=Buffer.from(E,"base64"),_=N.extname(h.filename),U=N.basename(h.filename,_).toLowerCase().replace(/[^a-z0-9_-]/g,""),oe=`logo_${Date.now()}_${U}${_||".png"}`;P.writeFileSync(N.join(o,oe),w),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({fileName:oe}));return}if(d.method==="POST"&&T==="/api/save-config"){let $=await wo(d),h=JSON.parse($);h.configuredAt=new Date().toISOString();let E=h.global?.logo;E?.url?.startsWith("data:")&&(E.url=null),P.writeFileSync(t,JSON.stringify(h,null,2),"utf8"),console.log(`
128
+ ${F.green}\u2705 UI configuration saved to ${t}${F.reset}`),ze(e),console.log(`${F.dim} Local preview garbage collection complete (out/previews removed)${F.reset}`),f.writeHead(200,{"Content-Type":"application/json"}),f.end(JSON.stringify({ok:!0})),setTimeout(()=>{R.close(()=>S())},500);return}if(d.method==="GET"){let $=T.split("?")[0];if($==="/"&&($="/index.html"),$.startsWith("/previews/")&&P.existsSync(l)){let w=$.replace(/^\/previews\//,""),_=N.join(l,w),U=N.normalize(_);if(U.startsWith(l)&&P.existsSync(U)&&P.statSync(U).isFile()){let oe=P.readFileSync(U);f.writeHead(200,{"Content-Type":So(U)}),f.end(oe);return}}let h=P.existsSync(s),E=h?N.join(s,$):N.join(i,"wizard.html");if(h&&P.existsSync(E)&&P.statSync(E).isFile()){let w=P.readFileSync(E);f.writeHead(200,{"Content-Type":So(E)}),f.end(w);return}if(!h&&$==="/index.html"){let w=P.readFileSync(N.join(i,"wizard.html"),"utf8");f.writeHead(200,{"Content-Type":"text/html"}),f.end(w);return}}f.writeHead(404,{"Content-Type":"text/plain"}),f.end("Not found")}catch(T){f.writeHead(500,{"Content-Type":"text/plain"}),f.end(`Server error: ${L(T)}`)}});R.listen(m,()=>{let d=C;console.log(`
129
+ ${F.bold}${F.cyan}\u{1F3A8} Survey UI Customization Wizard${F.reset}`),console.log(`${F.bold}\u{1F517} Client wizard link \u2014 share this URL only:${F.reset}`),console.log(` ${F.green}${d}${F.reset}`),console.log(`${F.dim} Port ${m} (auto-selected if 4200 was in use)${F.reset}`),console.log(`${F.dim} Live previews: ${F.reset}${Object.keys(a).length} components`),console.log(`${F.dim} Preview target: ${F.reset}${r}`),console.log(`${F.dim} Default wizard \u2014 saves directly to survey-ui-config.json when client clicks Review & Build${F.reset}
130
+ `),at(d)}),R.on("error",v);let x=()=>{ze(e),R.close(()=>process.exit(130))};process.once("SIGINT",x),process.once("SIGTERM",x)})}var de=k(require("fs")),vo=k(require("path")),Ro=k(require("http")),Io=k(require("https"));z();$e();he();Re();je();var g=c;function ut(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 Je(e,o={}){return new Promise((t,n)=>{let i=new URL(e),r=(i.protocol==="https:"?Io:Ro).request(i,{method:o.method??"GET",headers:o.headers??{}},a=>{let l="";a.on("data",y=>l+=y),a.on("end",()=>{if((a.statusCode??500)>=400){n(new Error(`HTTP ${a.statusCode}: ${l}`));return}try{t(JSON.parse(l))}catch{n(new Error(`Invalid JSON: ${l.slice(0,200)}`))}})});r.on("error",n),o.body&&r.write(o.body),r.end()})}async function mt(e,o,t,n){return new Promise((i,s)=>{let r=new URL(e),a=r.protocol==="https:"?Io:Ro,l={"Content-Type":t,"Content-Length":o.length};n&&(l["X-Wizard-Session"]=n.sessionSecret,l["X-Wizard-Session-Id"]=n.sessionId);let y=a.request(r,{method:"PUT",headers:l},m=>{if((m.statusCode??500)>=400){let C="";m.on("data",S=>C+=S),m.on("end",()=>s(new Error(`PUT failed ${m.statusCode}: ${C}`)));return}m.resume(),i()});y.on("error",s),y.write(o),y.end()})}function ht(e){try{let o=e.split(".")[1];return JSON.parse(Buffer.from(o,"base64url").toString("utf8")).surveyId??null}catch{return null}}async function jo(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=ht(i);if(!r)throw new Error("Could not parse surveyId from CFM_INSTANCE_ID JWT");let a=Pe(),l=Y(a),y=l.activeConfigPath,m=e.apply?!1:e.review!==!1;console.log(`
129
131
  ${g.bold}${g.cyan}\u{1F3A8} CFM UI Customization (AWS)${g.reset}
130
132
  `),m&&(console.log(`${g.dim} Review mode: seed kept in survey-ui-config.json; final + diff written on complete.${g.reset}`),console.log(`${g.dim} Apply later with: npx cfm-sdk confirm-ui-config${g.reset}
131
- `));let C=[...G],{outputDir:S,files:I}=await ae({projectRoot:a,useTemplatesOnly:e.useTemplatesOnly,surveyTypes:C}),R=I.map(h=>({path:h.path,contentType:h.contentType,sizeBytes:h.sizeBytes})),{config:x,source:d}=ce({projectRoot:a,surveyTypes:C,instanceId:r});x.surveyTypes=C,_e(d),m&&(J.writeFileSync(l.seedPath,JSON.stringify(x,null,2),"utf8"),J.writeFileSync(y,JSON.stringify(x,null,2),"utf8"),console.log(`${g.dim} Seed snapshot \u2192 survey-ui-config.json (+ .seed.json)${g.reset}`));let f=await Je(`${s}/wizard/session/start`,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({files:R,surveyTypes:C,initialConfig:x})});console.log(`${g.dim} Uploading ${R.length} preview files\u2026${g.reset}`);for(let h of f.uploads){let E=He.join(S,h.path),w=J.readFileSync(E),A=R.find(M=>M.path===h.path)?.contentType??"application/octet-stream";await mt(h.uploadUrl,w,A,{sessionId:f.sessionId,sessionSecret:f.sessionSecret})}if(await Je(`${s}/wizard/previews/upload/complete`,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({sessionId:f.sessionId})}),console.log(`${g.green}\u2705 Previews uploaded${g.reset}`),console.log(`${g.dim} ${R.length} component preview page(s) \u2192 EC2 local server (disk)${g.reset}`),console.log(`WIZARD_LINK=${f.wizardUrl}`),process.env.CFM_WIZARD_OPEN_BROWSER==="1"&&pt(f.wizardUrl),!o)return m&&console.log(`${g.dim} When wizard completes, poll manually or re-run without --no-wait to capture final + diff.${g.reset}`),{saved:!1};let T=Date.now()+n,$=0;for(;Date.now()<T;){$+=1,process.stdout.write(`\r${g.dim}Waiting for client to finish wizard\u2026 (poll ${$})${g.reset}`);let h=await Je(`${s}/wizard/config/${encodeURIComponent(r)}?sessionId=${f.sessionId}`,{headers:{Authorization:`Bearer ${i}`}});if(h.status==="abandoned")return ht(a),{saved:!1};if(h.status==="ready"&&h.config){let E=Ie(h)??h.config;if(console.log(`
132
- ${g.green}\u2705 Configuration ready${g.reset}`),h.logoUrl&&console.log(`${g.dim} Logo URL: ${h.logoUrl}${g.reset}`),m){let A=Ee(a,x,E);console.log(`${g.green} Seed (unchanged active): ${y}${g.reset}`),console.log(`${g.green} Final: ${l.finalPath}${g.reset}`),console.log(`${g.green} Diff: ${l.diffMdPath}${g.reset}`),console.log(`${g.yellow} ${A.changed.length} changed, ${A.added.length} added, ${A.removed.length} removed${g.reset}`);let M=E.global?.logo;if(M?.fileName)try{await oe({projectRoot:a,fileName:M.fileName,logoUrl:h.logoUrl,jwt:i,apiBase:s,surveyId:r}),console.log(`${g.green} Logo saved to public/${M.fileName}${g.reset}`)}catch(te){console.warn(`${g.yellow} Logo download deferred: ${O(te)}${g.reset}`)}return console.log(`${g.dim} Apply when ready: npx cfm-sdk confirm-ui-config${g.reset}`),{saved:!0}}J.writeFileSync(y,JSON.stringify(E,null,2),"utf8"),console.log(`${g.green} Written ${y}${g.reset}`);let w=E.global?.logo;return w?.fileName&&(await oe({projectRoot:a,fileName:w.fileName,logoUrl:h.logoUrl,jwt:i,apiBase:s,surveyId:r}),console.log(`${g.green} Logo saved to public/${w.fileName}${g.reset}`)),{saved:!0}}await gt(t)}throw new Error("Timed out waiting for wizard completion")}he();U();var k=c,Q=process.argv.slice(2),q=Q[0];async function Pt(){if(q==="customize"||q==="init"){q==="init"&&console.log(`${k.yellow}\u26A0 cfm-sdk init is deprecated. Use \`cfm-sdk customize\` instead.${k.reset}
133
- `);try{(await xo()).saved||(console.log(`
134
- ${k.yellow}\u26A0 Client quit without saving. Preview garbage collection complete (out/previews removed).${k.reset}`),console.log(`${k.dim} Do not re-run the wizard. Skip Phase 6c. Ask client for deploy confirmation (Phase 7 / INPUT 4).${k.reset}`),process.exit(0))}catch(e){console.error(`
135
- ${k.red}\u274C Error: ${O(e)}${k.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 No({useTemplatesOnly:e,wait:!o,review:n,apply:t})).saved||(console.log(`
136
- ${k.yellow}\u26A0 Client quit without saving. Session and preview garbage collection complete.${k.reset}`),console.log(`${k.dim} Do not re-run the wizard. Skip Phase 6c. Ask client for deploy confirmation (Phase 7 / INPUT 4).${k.reset}`),process.exit(0))}catch(i){console.error(`
137
- ${k.red}\u274C Error: ${O(i)}${k.reset}`),process.exit(1)}}else if(q==="confirm-ui-config"){let e=Q.includes("--diff-only");try{let{runConfirmUiConfig:o}=await Promise.resolve().then(()=>(Ao(),jo));await o({diffOnly:e})}catch(o){console.error(`
138
- ${k.red}\u274C Error: ${O(o)}${k.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(()=>(Do(),_o));await t({sessionId:o})}catch(t){console.error(`
139
- ${k.red}\u274C Error: ${O(t)}${k.reset}`),process.exit(1)}}else if(q==="export-previews"){let e=Q.includes("--use-templates-only");try{await ae({useTemplatesOnly:e})}catch(o){console.error(`
140
- ${k.red}\u274C Error: ${O(o)}${k.reset}`),process.exit(1)}}else if(q==="resolve-ui-config"){let e=Q.includes("--write");try{if(e){let o=De();console.log(`${k.green}\u2705 Wrote ${o}${k.reset}`)}else{let{resolveInitialConfig:o}=await Promise.resolve().then(()=>(he(),ho)),{config:t,source:n}=o({surveyTypes:[]});console.log(JSON.stringify({source:n,config:t},null,2))}}catch(o){console.error(`
141
- ${k.red}\u274C Error: ${O(o)}${k.reset}`),process.exit(1)}}else if(q==="deploy")try{await Ye()}catch(e){console.error(`
142
- ${k.red}\u274C Error: ${O(e)}${k.reset}`),process.exit(1)}else console.log(`
143
- ${k.bold}${k.cyan}CFM SDK CLI Tool${k.reset}`),console.log(`
144
- 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)}Pt();
133
+ `));let C=[...G],{outputDir:S,files:v}=await ce({projectRoot:a,useTemplatesOnly:e.useTemplatesOnly,surveyTypes:C}),R=v.map(h=>({path:h.path,contentType:h.contentType,sizeBytes:h.sizeBytes})),{config:x,source:d}=se({projectRoot:a,surveyTypes:C,instanceId:r});x.surveyTypes=C,_e(d),m&&(de.writeFileSync(l.seedPath,JSON.stringify(x,null,2),"utf8"),de.writeFileSync(y,JSON.stringify(x,null,2),"utf8"),console.log(`${g.dim} Seed snapshot \u2192 survey-ui-config.json (+ .seed.json)${g.reset}`));let f=await Je(`${s}/wizard/session/start`,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({files:R,surveyTypes:C,initialConfig:x})});console.log(`${g.dim} Uploading ${R.length} preview files\u2026${g.reset}`);for(let h of f.uploads){let E=vo.join(S,h.path),w=de.readFileSync(E),_=R.find(U=>U.path===h.path)?.contentType??"application/octet-stream";await mt(h.uploadUrl,w,_,{sessionId:f.sessionId,sessionSecret:f.sessionSecret})}if(await Je(`${s}/wizard/previews/upload/complete`,{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({sessionId:f.sessionId})}),console.log(`${g.green}\u2705 Previews uploaded${g.reset}`),console.log(`${g.dim} ${R.length} component preview page(s) \u2192 EC2 local server (disk)${g.reset}`),console.log(`
134
+ ${g.bold}${g.cyan}\u{1F517} Client wizard link \u2014 share with the client:${g.reset}`),console.log(`${g.green} ${f.wizardUrl}${g.reset}`),console.log(`${g.dim} (Deployed on EC2 \u2014 client customizes here; agent keeps CLI open until submit)${g.reset}
135
+ `),ut(f.wizardUrl),!o){console.log(`${g.yellow}--no-wait: wizard URL (not polling):${g.reset}`),console.log(f.wizardUrl),m&&console.log(`${g.dim} When wizard completes, poll manually or re-run without --no-wait to capture final + diff.${g.reset}`);return}let T=Date.now()+n,$=0;for(;Date.now()<T;){$+=1,process.stdout.write(`\r${g.dim}Waiting for client to finish wizard\u2026 (poll ${$})${g.reset}`);let h=await Je(`${s}/wizard/config/${encodeURIComponent(r)}?sessionId=${f.sessionId}`,{headers:{Authorization:`Bearer ${i}`}});if(h.status==="abandoned")throw console.log(`
136
+ ${g.yellow}\u26A0 Client quit the wizard \u2014 session cleaned up on S3${g.reset}`),new Error("Client quit the wizard without saving. S3 preview garbage was removed. Re-run customize-ui to start a new session.");if(h.status==="ready"&&h.config){let E=Ie(h)??h.config;if(console.log(`
137
+ ${g.green}\u2705 Configuration ready${g.reset}`),h.logoUrl&&console.log(`${g.dim} Logo URL: ${h.logoUrl}${g.reset}`),m){let _=ve(a,x,E);console.log(`${g.green} Seed (unchanged active): ${y}${g.reset}`),console.log(`${g.green} Final: ${l.finalPath}${g.reset}`),console.log(`${g.green} Diff: ${l.diffMdPath}${g.reset}`),console.log(`${g.yellow} ${_.changed.length} changed, ${_.added.length} added, ${_.removed.length} removed${g.reset}`);let U=E.global?.logo;if(U?.fileName)try{await ee({projectRoot:a,fileName:U.fileName,logoUrl:h.logoUrl,jwt:i,apiBase:s,surveyId:r}),console.log(`${g.green} Logo saved to public/${U.fileName}${g.reset}`)}catch(oe){console.warn(`${g.yellow} Logo download deferred: ${L(oe)}${g.reset}`)}console.log(`${g.dim} Apply when ready: npx cfm-sdk confirm-ui-config${g.reset}`);return}de.writeFileSync(y,JSON.stringify(E,null,2),"utf8"),console.log(`${g.green} Written ${y}${g.reset}`);let w=E.global?.logo;w?.fileName&&(await ee({projectRoot:a,fileName:w.fileName,logoUrl:h.logoUrl,jwt:i,apiBase:s,surveyId:r}),console.log(`${g.green} Logo saved to public/${w.fileName}${g.reset}`));return}await pt(t)}throw new Error("Timed out waiting for wizard completion")}he();z();var A=c,Q=process.argv.slice(2),q=Q[0];async function Tt(){if(q==="customize"||q==="init"){q==="init"&&console.log(`${A.yellow}\u26A0 cfm-sdk init is deprecated. Use \`cfm-sdk customize\` instead.${A.reset}
138
+ `);try{await Co()}catch(e){console.error(`
139
+ ${A.red}\u274C Error: ${L(e)}${A.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 jo({useTemplatesOnly:e,wait:!o,review:n,apply:t})}catch(i){console.error(`
140
+ ${A.red}\u274C Error: ${L(i)}${A.reset}`),process.exit(1)}}else if(q==="confirm-ui-config"){let e=Q.includes("--diff-only");try{let{runConfirmUiConfig:o}=await Promise.resolve().then(()=>(No(),Fo));await o({diffOnly:e})}catch(o){console.error(`
141
+ ${A.red}\u274C Error: ${L(o)}${A.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(()=>(_o(),Ao));await t({sessionId:o})}catch(t){console.error(`
142
+ ${A.red}\u274C Error: ${L(t)}${A.reset}`),process.exit(1)}}else if(q==="export-previews"){let e=Q.includes("--use-templates-only");try{await ce({useTemplatesOnly:e})}catch(o){console.error(`
143
+ ${A.red}\u274C Error: ${L(o)}${A.reset}`),process.exit(1)}}else if(q==="resolve-ui-config"){let e=Q.includes("--write");try{if(e){let o=De();console.log(`${A.green}\u2705 Wrote ${o}${A.reset}`)}else{let{resolveInitialConfig:o}=await Promise.resolve().then(()=>(he(),mo)),{config:t,source:n}=o({surveyTypes:[]});console.log(JSON.stringify({source:n,config:t},null,2))}}catch(o){console.error(`
144
+ ${A.red}\u274C Error: ${L(o)}${A.reset}`),process.exit(1)}}else if(q==="deploy")try{await Ke()}catch(e){console.error(`
145
+ ${A.red}\u274C Error: ${L(e)}${A.reset}`),process.exit(1)}else console.log(`
146
+ ${A.bold}${A.cyan}CFM SDK CLI Tool${A.reset}`),console.log(`
147
+ Usage:`),console.log(" npx cfm-sdk customize \u2013 Local UI customization wizard"),console.log(" npx cfm-sdk customize-ui \u2013 AWS wizard (review mode: seed + diff, no auto-apply)"),console.log(" npx cfm-sdk customize-ui --apply \u2013 AWS wizard (legacy: write final config immediately)"),console.log(" npx cfm-sdk confirm-ui-config \u2013 Apply survey-ui-config.final.json after review"),console.log(" npx cfm-sdk fetch-ui-config \u2013 Pull final + diff after client completes (--no-wait)"),console.log(" npx cfm-sdk export-previews \u2013 Build component preview pages only"),console.log(" npx cfm-sdk resolve-ui-config --write \u2013 Write draft survey-ui-config.json from project"),console.log(" npx cfm-sdk deploy \u2013 Deploy to Vercel"),process.exit(0)}Tt();