{"version":3,"sources":["../../src/cli/const.ts","../../src/cli/utils/exec.ts","../../src/cli/workflow-prompts.ts","../../src/cli/workflow-state.ts","../../src/cli/resolve-project-root.ts","../../src/cli/doc-read-audit.ts","../../src/cli/detect-framework.ts","../../src/cli/install-manifest.ts","../../src/types/shared.ts","../../src/fetchSurvey/utils/constants.ts","../../src/fetchSurvey/utils/url.ts","../../src/utils/decodeInstanceJwt.ts","../../src/fetchSurvey/utils/extractSurveyLanguages.ts","../../src/fetchSurvey/constants/questionConfigKeys.ts","../../src/surveyLogic/fields/questionHintUtils.ts","../../src/fetchSurvey/utils/mappers/question/shared/configUtils.ts","../../src/fetchSurvey/utils/mappers/question/shared/resolveQuestionShell.ts","../../src/fetchSurvey/utils/mappers/question/shared/mapLogicFilters.ts","../../src/fetchSurvey/utils/mappers/question/shared/mapSkipLogics.ts","../../src/fetchSurvey/utils/mappers/question/shared/mapDisplayLogic.ts","../../src/fetchSurvey/utils/mappers/question/shared/mapQuestionDisplayVariants.ts","../../src/fetchSurvey/utils/mappers/question/shared/attachQuestionLogics.ts","../../src/fetchSurvey/constants/questionTypes.ts","../../src/fetchSurvey/utils/mappers/question/shared/choiceRandomization.ts","../../src/fetchSurvey/utils/mappers/question/mcq/applyMcqChoiceRandomization.ts","../../src/fetchSurvey/utils/mappers/question/shared/mapAnswerLogic.ts","../../src/fetchSurvey/utils/mappers/question/mcq/extractOtherOptionConfig.ts","../../src/fetchSurvey/utils/mappers/question/mcq/buildMcqOptions.ts","../../src/fetchSurvey/utils/mappers/question/mcq/extractAnswerConditions.ts","../../src/fetchSurvey/utils/mappers/question/mcq/extractDefaultOptionIds.ts","../../src/fetchSurvey/utils/mappers/question/mcq/mapMcqQuestion.ts","../../src/logger/logger.ts","../../src/fetchSurvey/logger/mapperLogger.ts","../../src/fetchSurvey/constants/displayStyles.ts","../../src/fetchSurvey/utils/mappers/question/labels/extractHintLabels.ts","../../src/fetchSurvey/utils/mappers/question/matrix/buildSelectableScalePoints.ts","../../src/fetchSurvey/utils/mappers/question/nps/buildNpsScalePoints.ts","../../src/fetchSurvey/utils/mappers/question/nps/mapNpsQuestion.ts","../../src/fetchSurvey/utils/mappers/question/textInput/mapTextInputQuestion.ts","../../src/fetchSurvey/utils/mappers/question/shared/detectMatrixFormat.ts","../../src/fetchSurvey/utils/mappers/question/matrix/resolveStatementText.ts","../../src/fetchSurvey/utils/mappers/question/cfmMatrix/buildCfmStatementRows.ts","../../src/fetchSurvey/utils/mappers/question/matrix/buildScaleColumns.ts","../../src/fetchSurvey/utils/mappers/question/cfmMatrix/mapCfmMatrixQuestion.ts","../../src/fetchSurvey/utils/mappers/question/shared/detectDisplayStyle.ts","../../src/fetchSurvey/utils/mappers/question/matrix/buildSimpleStatementRows.ts","../../src/fetchSurvey/utils/mappers/question/matrix/resolveMatrixScaleOptions.ts","../../src/fetchSurvey/utils/mappers/question/csat/mapCsatQuestion.ts","../../src/fetchSurvey/utils/mappers/question/ratingMatrix/mapRatingMatrixQuestion.ts","../../src/fetchSurvey/utils/mappers/question/sliderMatrix/buildSliderMatrixRows.ts","../../src/fetchSurvey/utils/mappers/question/sliderMatrix/mapSliderMatrixQuestion.ts","../../src/fetchSurvey/utils/mappers/question/textAndMedia/buildMediaConfig.ts","../../src/fetchSurvey/utils/mappers/question/textAndMedia/mapTextAndMediaQuestion.ts","../../src/fetchSurvey/utils/mappers/question/fileUpload/mapFileUploadQuestion.ts","../../src/fetchSurvey/utils/mappers/question/heatmap/buildHeatmapRegions.ts","../../src/fetchSurvey/utils/mappers/question/heatmap/mapHeatmapQuestion.ts","../../src/fetchSurvey/utils/mappers/question/rankOrder/buildRankOrderOptions.ts","../../src/fetchSurvey/utils/mappers/question/rankOrder/mapRankOrderQuestion.ts","../../src/fetchSurvey/utils/mappers/question/registry.ts","../../src/fetchSurvey/utils/mappers/question/index.ts","../../src/fetchSurvey/utils/mappers/survey/mapCtaButton.ts","../../src/fetchSurvey/utils/mapSurveyPages.ts","../../src/fetchSurvey/utils/mappers/survey/mapSpecialPages.ts","../../src/fetchSurvey/utils/mappers/survey/mapSurvey.ts","../../src/cli/ui-config-types.ts","../../src/cli/fetch-survey-inventory.ts","../../src/cli/survey-inventory-extract.ts","../../src/cli/fill-implementation-plan.ts","../../src/cli/sync-from-fetch.ts","../../src/cli/resolve-deploy-target.ts","../../src/cli/create-distribution.ts","../../src/cli/deploy.ts","../../src/cli/utils/nodeCheck.ts","../../src/cli/utils/prompts.ts","../../src/cli/utils/vercelCliCheck.ts","../../src/cli/utils/vercelLoginCheck.ts","../../src/cli/utils/vercelDeploy.ts","../../src/cli/scaffold-check.ts","../../src/cli/scaffold-validation.ts","../../src/cli/verify-build.ts","../../src/cli/project-source-scan.ts","../../src/cli/seed-phase5.ts","../../src/cli/vite-scaffold.ts","../../src/cli/index.ts"],"sourcesContent":["export const colors = {\n  reset: '\\x1b[0m',\n  bold: '\\x1b[1m',\n  green: '\\x1b[32m',\n  red: '\\x1b[31m',\n  cyan: '\\x1b[36m',\n  yellow: '\\x1b[33m',\n  dim: '\\x1b[2m',\n};\n\n/** Production distribution dashboard — agents use this when CFM_DASHBOARD_API is unset. */\nexport const DEFAULT_DISTRIBUTION_DASHBOARD_URL =\n  'https://distribution-dashboard-three.vercel.app';\n","import { execSync, spawn } from 'child_process';\nimport type { ExecSyncOptions } from 'child_process';\n\nexport interface RunCommandOptions {\n  cwd?: string;\n}\n\n// Check if a shell executable is available in the user's system PATH\nexport function hasCommand(cmd: string): boolean {\n  try {\n    const checkCmd = process.platform === 'win32' ? `where ${cmd}` : `command -v ${cmd}`;\n    execSync(checkCmd, { stdio: 'ignore' });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nconst inheritShellOptions: ExecSyncOptions = {\n  stdio: 'inherit',\n  shell: process.platform === 'win32' ? 'cmd.exe' : '/bin/sh',\n};\n\n// Execute a command synchronously and capture output/return code\nexport function runCommandSync(cmd: string, args: string[], options: RunCommandOptions = {}): boolean {\n  try {\n    const fullCmd = `${cmd} ${args.join(' ')}`;\n    execSync(fullCmd, { ...inheritShellOptions, cwd: options.cwd });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n// Spawn an interactive command that inherits stdin/stdout/stderr\nexport function runCommandInteractive(cmd: string, args: string[]): Promise<number | null> {\n  return new Promise((resolve) => {\n    const child = spawn(cmd, args, {\n      stdio: 'inherit',\n      shell: true,\n    });\n\n    child.on('close', (code) => {\n      resolve(code);\n    });\n  });\n}\n","/** Canonical client-facing prompts — keep in sync with agent docs and lint-agent-docs.sh */\n\nimport { DEFAULT_DISTRIBUTION_DASHBOARD_URL } from './const';\n\nexport const CLIENT_CHAT_HEADER = 'COPY TO CLIENT CHAT';\nexport const AGENT_ONLY_HEADER = 'AGENT ONLY — do not paste below to client';\n\nconst BORDER = '═'.repeat(56);\n\n/** Step 5 — Instance ID (INPUT 2) */\nexport const INPUT_2_CLIENT_CHAT = `Hi! I've finished building your survey app on my side.\n\nTo load your real survey questions (instead of demo data), I need one thing from you:\n\n**Your survey instance ID** — a long access token from Sprinklr. It usually looks like three chunks of letters and numbers separated by dots.\n\n**What to do:** Copy that token from Sprinklr and paste it in your next message here.\n\n**What happens next:** I'll connect it, restart the preview, and send you a link to try the survey on your computer.`;\n\n/** Step 7 — Deploy + platform (INPUT 3) */\nexport const INPUT_4A_CLIENT_CHAT = `Your survey design is ready.\n\n**Would you like to publish it as a live link people can open in their browser?**\n\n**Please reply:** **yes** or **no**\n\nIf **yes**, also tell me which hosting you prefer:\n- **AWS** (Sprinklr / enterprise CDN — recommended for production surveys)\n- **Vercel** (quick hosting alternative)\n\nExample reply: \"yes, AWS\" or \"no\"`;\n\nexport const CFM_NEXT_STEP_ASK_DEPLOY = 'CFM_NEXT_STEP=ASK_DEPLOY';\n\nexport type DeployTargetLabel = 'aws' | 'vercel';\n\nexport function formatDeployTargetLabel(target: DeployTargetLabel): string {\n  return target === 'vercel' ? 'Vercel' : 'AWS';\n}\n\nexport function formatInput5ClientChat(surveyId: string): string {\n  return `Almost there! One last step to create your **shareable live link**.\n\nI've set everything up on my side. You just need to generate a short code in our distribution dashboard — then paste it back to me and I'll publish the link.\n\n| | |\n|---|---|\n| **Your Survey ID** | \\`${surveyId}\\` |\n| **Open this dashboard** | ${DEFAULT_DISTRIBUTION_DASHBOARD_URL} |\n\n**What to do:**\n1. Open the dashboard link above\n2. Click **Create distribution**\n3. Paste your **Survey ID** from the table and click **Generate key**\n4. Copy the key that appears (a short code like \\`a3f91c2e8b4d7016\\`)\n5. Paste that key in your next message here\n\n**What happens next:** I'll publish your live survey link and send it to you in this chat.\n\n*(You don't need to click Deploy in the dashboard — I'll handle that once you send me the key.)*`;\n}\n\nexport function formatDistributionDoneClientChat(liveUrl: string): string {\n  return `Done! Your survey is live.\n\n**Share this link with participants:**\n${liveUrl}\n\nThe dashboard also shows this link as **Deployed** with an **Open** button.\n\nWant another link for the same survey (e.g. a second campaign)? Say the word — we'll generate a new key the same way.`;\n}\n\nexport function formatInput2BClientChat(devUrl: string): string {\n  return `Your survey is connected.\n\n**Preview link:** ${devUrl}\n\n**What to do:**\n1. Open the link above\n2. Click **Let's Get Started** (or **Start Survey**) on the intro page\n3. Confirm the survey loads and looks right\n\nReply **\"looks good\"** when you're happy with the preview, or tell me what to fix.`;\n}\n\nexport function formatClientChatBlock(step: string, title: string, body: string): string {\n  return [BORDER, `  ${CLIENT_CHAT_HEADER} — ${step}: ${title}`, BORDER, '', body, ''].join('\\n');\n}\n\nexport function formatAgentOnlyBlock(body: string): string {\n  return [BORDER, `  ${AGENT_ONLY_HEADER}`, BORDER, '', body, '', BORDER].join('\\n');\n}\n\nexport function formatInput2ClientChatBlock(): string {\n  return formatClientChatBlock('Step 5 of 9', 'Connect your survey', INPUT_2_CLIENT_CHAT);\n}\n\nexport function formatInput2AgentBlock(): string {\n  return formatAgentOnlyBlock(\n    [\n      'After the client pastes their instance ID:',\n      '1. Paste into .env / .env.local per instance-id-quick-wire.md',\n      '2. Restart the dev server',\n      '3. Share preview link (Step 6) after smoke test',\n    ].join('\\n'),\n  );\n}\n\nexport function formatInput2HandoffBlocks(): string {\n  return [formatInput2ClientChatBlock(), formatInput2AgentBlock()].join('\\n');\n}\n\nexport function formatInput2BHandoffBlocks(devUrl: string): string {\n  return [\n    formatClientChatBlock('Step 6 of 9', 'Preview your survey', formatInput2BClientChat(devUrl)),\n    formatAgentOnlyBlock(\n      [\n        'After client confirms preview:',\n        '  npx cfm-sdk sync-from-fetch',\n        '  npx cfm-sdk verify-build',\n      ].join('\\n'),\n    ),\n  ].join('\\n');\n}\n\nexport function formatInput4AClientChatBlock(): string {\n  return formatClientChatBlock('Step 7 of 9', 'Publish live link', INPUT_4A_CLIENT_CHAT);\n}\n\nexport function formatInput4DeployAgentBlock(): string {\n  return formatAgentOnlyBlock(\n    [\n      'After the client answers deploy + platform:',\n      '  npx cfm-sdk set-deploy-target aws|vercel',\n      '',\n      'If deploy yes + AWS: show Step 8 (distribution key) — do NOT run deploy-to-aws.sh.',\n      'If deploy yes + Vercel: npx cfm-sdk deploy',\n      'If deploy no: stop — survey stays on localhost only.',\n    ].join('\\n'),\n  );\n}\n\nexport function formatInput4DeployHandoffBlocks(): string {\n  return [formatInput4AClientChatBlock(), formatInput4DeployAgentBlock()].join('\\n');\n}\n\nexport function formatInput5HandoffBlocks(surveyId: string): string {\n  return [\n    formatClientChatBlock(\n      'Step 8 of 9',\n      'Generate your distribution key',\n      formatInput5ClientChat(surveyId),\n    ),\n    formatAgentOnlyBlock(\n      [\n        'Wait for the client to paste the key.',\n        'Then run: npx cfm-sdk create-distribution --s3-key=<key>',\n        '',\n        'Do NOT share any live URL until create-distribution prints ✓ Dashboard updated.',\n      ].join('\\n'),\n    ),\n  ].join('\\n');\n}\n\nexport function formatDistributionDoneHandoffBlocks(liveUrl: string): string {\n  return formatClientChatBlock(\n    'Step 9 of 9',\n    'Your survey is live',\n    formatDistributionDoneClientChat(liveUrl),\n  );\n}\n\nexport function formatDeployGateFailure(): string {\n  return [\n    'FAIL: Deploy not confirmed.',\n    '',\n    'Ask Step 7 client message first (deploy yes/no).',\n    'After client says yes + platform, run: npx cfm-sdk set-deploy-target aws|vercel',\n  ].join('\\n');\n}\n\n/** All CLIENT_CHAT bodies for jargon lint in tests */\nexport function getClientChatBodies(): string[] {\n  return [\n    INPUT_2_CLIENT_CHAT,\n    INPUT_4A_CLIENT_CHAT,\n    formatInput5ClientChat('example-survey-id'),\n    formatDistributionDoneClientChat('https://example.com/live'),\n    formatInput2BClientChat('http://localhost:3000'),\n  ];\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { formatDeployGateFailure } from './workflow-prompts';\n\nexport const WORKFLOW_STATE_FILE = '.cfm-agent-state.json';\n\nexport interface AgentWorkflowState {\n  version: 1;\n  coreVerifyPassedAt: string | null;\n  deployConfirmed: boolean | null;\n  distributionS3Key: string | null;\n}\n\nfunction statePath(projectRoot: string): string {\n  return path.join(projectRoot, WORKFLOW_STATE_FILE);\n}\n\nexport function isWorkflowGateSkipped(): boolean {\n  return process.env.CFM_SKIP_WORKFLOW_GATE === '1';\n}\n\nexport function readWorkflowState(projectRoot: string): AgentWorkflowState | null {\n  const file = statePath(projectRoot);\n  if (!fs.existsSync(file)) return null;\n  try {\n    const raw = JSON.parse(fs.readFileSync(file, 'utf8')) as AgentWorkflowState & {\n      input3?: unknown;\n    };\n    if (raw.version !== 1) return null;\n    return {\n      version: 1,\n      coreVerifyPassedAt: raw.coreVerifyPassedAt ?? null,\n      deployConfirmed: raw.deployConfirmed ?? null,\n      distributionS3Key: raw.distributionS3Key ?? null,\n    };\n  } catch {\n    return null;\n  }\n}\n\nfunction writeWorkflowState(projectRoot: string, state: AgentWorkflowState): void {\n  fs.writeFileSync(statePath(projectRoot), `${JSON.stringify(state, null, 2)}\\n`, 'utf8');\n}\n\nexport function writeCoreVerifyPassed(projectRoot: string): void {\n  writeWorkflowState(projectRoot, {\n    version: 1,\n    coreVerifyPassedAt: new Date().toISOString(),\n    deployConfirmed: null,\n    distributionS3Key: null,\n  });\n}\n\nexport function recordDeployConfirmed(projectRoot: string): AgentWorkflowState {\n  const existing = readWorkflowState(projectRoot);\n  if (!existing?.coreVerifyPassedAt) {\n    throw new Error(\n      'Core verify not recorded. Run npx cfm-sdk verify-build successfully before set-deploy-target.',\n    );\n  }\n  const next: AgentWorkflowState = {\n    ...existing,\n    deployConfirmed: true,\n  };\n  writeWorkflowState(projectRoot, next);\n  return next;\n}\n\nexport function recordDistributionS3Key(projectRoot: string, s3Key: string): AgentWorkflowState {\n  const existing = readWorkflowState(projectRoot);\n  if (!existing?.deployConfirmed) {\n    throw new Error(formatDeployGateFailure());\n  }\n  const next: AgentWorkflowState = {\n    ...existing,\n    distributionS3Key: s3Key.trim(),\n  };\n  writeWorkflowState(projectRoot, next);\n  return next;\n}\n\nexport function assertDeployAllowed(projectRoot: string): void {\n  if (isWorkflowGateSkipped()) return;\n\n  const state = readWorkflowState(projectRoot);\n  if (!state?.coreVerifyPassedAt) {\n    throw new Error(\n      'Core verify not recorded. Run npx cfm-sdk verify-build successfully before deploy.',\n    );\n  }\n  if (state.deployConfirmed !== true) {\n    throw new Error(formatDeployGateFailure());\n  }\n}\n\nexport function assertDistributionDeployAllowed(projectRoot: string, s3Key?: string): void {\n  if (isWorkflowGateSkipped()) return;\n\n  assertDeployAllowed(projectRoot);\n  if (!s3Key?.trim()) {\n    throw new Error(\n      'Missing --s3-key. Display Step 9 client message and wait for the client to paste their distribution key.',\n    );\n  }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nfunction hasSurveyProjectMarkers(root: string): boolean {\n  if (fs.existsSync(path.join(root, 'src', 'components', 'Question.tsx'))) return true;\n  if (fs.existsSync(path.join(root, 'implementation_plan.md'))) return true;\n  const pkgPath = path.join(root, 'package.json');\n  if (fs.existsSync(pkgPath)) {\n    try {\n      const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as {\n        dependencies?: Record<string, string>;\n        devDependencies?: Record<string, string>;\n      };\n      const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n      if (\n        deps['@explorer02/cfm-survey-sdk'] ||\n        deps['@repo/sdk'] ||\n        Object.keys(deps).some(key => key.includes('cfm-survey-sdk'))\n      ) {\n        return true;\n      }\n    } catch {\n      return false;\n    }\n  }\n  return false;\n}\n\n/** Prefer cwd with survey project markers over stale INIT_CWD from yarn. */\nexport function resolveProjectRoot(explicit?: string): string {\n  if (explicit) return explicit;\n  const cwd = process.cwd();\n  if (hasSurveyProjectMarkers(cwd)) return cwd;\n  const initCwd = process.env.INIT_CWD;\n  if (initCwd && hasSurveyProjectMarkers(initCwd)) {\n    return initCwd;\n  }\n  return cwd;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { colors } from './const';\n\nconst c = colors;\n\nconst OK_MAX = 150;\nconst WARN_MAX = 250;\n\nconst SLOW_HINTS: Record<string, string> = {\n  'MANIFEST.json': 'skim MANIFEST.routing.json instead',\n  '00-integration/agent-per-type-verification.md': 'mandatory fast-path gate — read Data/Logic/SDK rows for §3b types only',\n  '00-integration/layout-cookbook.md': 'card-per-type reference — read only your fetched types\\' cards, not the whole file',\n  '00-integration/phase-5-6-build-gate.md': 'read build-gate/verify-core.md only',\n  '00-integration/mockup-to-config-guide.md': 'read mockup/index.md + mockup-styling-paths.json',\n  '00-integration/agent-execution-flow.md': 'read execution-flow/index.md on fast path skip',\n  '00-integration/agent-operating-contract.md': 'read operating-contract/index.md on fast path skip',\n  '00-integration/aws-deploy.md': 'INPUT 3 deploy only — read deploy/aws/index.md',\n};\n\nconst MANDATORY_FAST_PATH_READS = new Set([\n  '00-integration/agent-per-type-verification.md',\n  '00-integration/layout-cookbook.md',\n]);\n\nfunction normalizeRelPath(rel: string): string {\n  return rel.replace(/^\\.\\.\\//, '');\n}\n\nexport type DocTier = 'ok' | 'warn' | 'slow' | 'missing';\n\nexport interface DocAuditEntry {\n  relPath: string;\n  lines: number;\n  tier: DocTier;\n  hint?: string;\n}\n\nexport interface DocReadAuditResult {\n  profile: string;\n  entries: DocAuditEntry[];\n  slow: DocAuditEntry[];\n  totalLines: number;\n  ok: boolean;\n}\n\nexport function getSdkDocsRoot(): string {\n  return path.join(__dirname, '..', '..', 'templates', 'docs');\n}\n\nfunction tierForLines(lines: number): DocTier {\n  if (lines <= OK_MAX) return 'ok';\n  if (lines <= WARN_MAX) return 'warn';\n  return 'slow';\n}\n\nfunction resolveDocPath(docsRoot: string, rel: string): string | null {\n  const normalized = rel.split('#')[0]!.split('?')[0]!;\n  if (normalized.includes('*')) return null;\n\n  const candidates = [\n    path.join(docsRoot, normalized),\n    path.join(docsRoot, '..', normalized),\n  ];\n\n  for (const abs of candidates) {\n    if (fs.existsSync(abs) && fs.statSync(abs).isFile()) return abs;\n  }\n  return null;\n}\n\nfunction countLines(filePath: string): number {\n  return fs.readFileSync(filePath, 'utf8').split('\\n').length;\n}\n\nfunction collectManifestPaths(manifest: Record<string, unknown>, profile: string, phaseId?: string): string[] {\n  const paths = new Set<string>();\n\n  if (profile === 'fastPath') {\n    const fp = manifest.fastPath as { read?: string[]; readWhenMockup?: string[] } | undefined;\n    for (const p of fp?.read ?? []) paths.add(p);\n  } else if (profile === 'phase' && phaseId !== undefined) {\n    const phases = manifest.phases as Array<Record<string, unknown>> | undefined;\n    const phase = phases?.find((p) => String(p.id) === String(phaseId));\n    if (phase) {\n      for (const key of Object.keys(phase)) {\n        if (!key.startsWith('read')) continue;\n        const val = phase[key];\n        if (Array.isArray(val)) {\n          for (const p of val) if (typeof p === 'string') paths.add(p);\n        }\n      }\n    }\n  } else if (profile === 'perType') {\n    const qt = manifest.questionTypes as Record<string, Record<string, string>> | undefined;\n    for (const entry of Object.values(qt ?? {})) {\n      for (const field of ['spineSlice', 'blueprint', 'reference', 'uiSpec'] as const) {\n        const p = entry[field];\n        if (typeof p === 'string') paths.add(p);\n      }\n    }\n  }\n\n  return [...paths];\n}\n\nfunction hintFor(relPath: string): string | undefined {\n  const key = relPath.replace(/^\\.\\.\\//, '');\n  return SLOW_HINTS[key] ?? SLOW_HINTS[relPath];\n}\n\nexport function auditDocPaths(\n  docsRoot: string,\n  relPaths: string[],\n  profileLabel: string,\n): DocReadAuditResult {\n  const entries: DocAuditEntry[] = [];\n\n  for (const rel of relPaths) {\n    const abs = resolveDocPath(docsRoot, rel);\n    if (!abs) {\n      entries.push({ relPath: rel, lines: 0, tier: 'missing' });\n      continue;\n    }\n    const lines = countLines(abs);\n    const tier = tierForLines(lines);\n    const hint = tier === 'slow' || tier === 'warn' ? hintFor(rel.replace(/^\\.\\.\\//, '')) : undefined;\n    entries.push({ relPath: rel, lines, tier, hint });\n  }\n\n  entries.sort((a, b) => b.lines - a.lines);\n  const slow = entries.filter((e) => e.tier === 'slow');\n  const blockingSlow = slow.filter((e) => !MANDATORY_FAST_PATH_READS.has(normalizeRelPath(e.relPath)));\n  const totalLines = entries.reduce((sum, e) => sum + e.lines, 0);\n\n  return {\n    profile: profileLabel,\n    entries,\n    slow,\n    totalLines,\n    ok: blockingSlow.length === 0,\n  };\n}\n\nexport function loadManifest(docsRoot: string): Record<string, unknown> {\n  const manifestPath = path.join(docsRoot, 'MANIFEST.json');\n  return JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as Record<string, unknown>;\n}\n\nexport function runDocReadAudit(options: {\n  docsRoot?: string;\n  profile?: 'fastPath' | 'phase' | 'perType';\n  phaseId?: string;\n  warnOnly?: boolean;\n  ci?: boolean;\n  writeInventory?: boolean;\n}): number {\n  const docsRoot = options.docsRoot ?? getSdkDocsRoot();\n  const profile = options.profile ?? 'fastPath';\n  const manifest = loadManifest(docsRoot);\n\n  const relPaths =\n    profile === 'phase'\n      ? collectManifestPaths(manifest, 'phase', options.phaseId)\n      : profile === 'perType'\n        ? collectManifestPaths(manifest, 'perType')\n        : collectManifestPaths(manifest, 'fastPath');\n\n  const label =\n    profile === 'phase' ? `phase ${options.phaseId ?? '?'}` : profile === 'perType' ? 'perType' : 'fastPath';\n  const result = auditDocPaths(docsRoot, relPaths, label);\n\n  console.log(`\\n${c.bold}Doc read budget audit (${result.profile})${c.reset}`);\n  console.log('─'.repeat(40));\n\n  for (const entry of result.entries) {\n    const tag =\n      entry.tier === 'ok'\n        ? `${c.green}OK  ${c.reset}`\n        : entry.tier === 'warn'\n          ? `${c.yellow}WARN${c.reset}`\n          : entry.tier === 'slow'\n            ? `${c.red}SLOW${c.reset}`\n            : `${c.red}MISS${c.reset}`;\n    const hint = entry.hint ? ` — ${entry.hint}` : '';\n    const lineLabel = entry.tier === 'missing' ? 'missing' : `${entry.lines} lines`;\n    console.log(`${tag} ${entry.relPath.padEnd(42)} ${lineLabel}${hint}`);\n  }\n\n  console.log(`\\n${c.dim}Total: ${result.totalLines} lines across ${result.entries.length} paths${c.reset}`);\n\n  if (result.slow.length > 0) {\n    console.log(`\\n${c.yellow}A few doc reads are taking longer than expected even from temp files:${c.reset}`);\n    for (const entry of result.slow) {\n      const hint = entry.hint ? ` — ${entry.hint}` : '';\n      console.log(`  - ${entry.relPath} (${entry.lines} lines)${hint}`);\n    }\n  }\n\n  if (options.writeInventory) {\n    const inventory: Record<string, { lines: number; tier: DocTier }> = {};\n    for (const entry of result.entries) {\n      if (entry.tier !== 'missing') {\n        inventory[entry.relPath] = { lines: entry.lines, tier: entry.tier };\n      }\n    }\n    manifest.docInventory = {\n      generatedBy: 'npx cfm-sdk doc-read-audit --write',\n      caps: { ok: OK_MAX, warn: WARN_MAX },\n      profile: result.profile,\n      files: inventory,\n    };\n    fs.writeFileSync(\n      path.join(docsRoot, 'MANIFEST.json'),\n      `${JSON.stringify(manifest, null, 2)}\\n`,\n      'utf8',\n    );\n    console.log(`\\n${c.green}OK:${c.reset} Wrote docInventory to MANIFEST.json`);\n  }\n\n  if (result.ok || options.warnOnly) {\n    return 0;\n  }\n  if (options.ci) {\n    return 1;\n  }\n  return result.slow.length > 0 ? 1 : 0;\n}\n\nexport function formatDocBudgetHint(docsRoot?: string): string {\n  const root = docsRoot ?? getSdkDocsRoot();\n  const manifest = loadManifest(root);\n  const relPaths = collectManifestPaths(manifest, 'fastPath');\n  const result = auditDocPaths(root, relPaths, 'fastPath');\n  return `Doc budget: npx cfm-sdk doc-read-audit — fast path reads ${result.entries.length} files (~${result.totalLines} lines)`;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nexport type AgentFramework = 'nextjs' | 'vite' | 'cra' | 'unknown';\n\nconst SDK_PACKAGE_NAMES = ['@explorer02/cfm-survey-sdk', '@repo/sdk'] as const;\n\nfunction readPortFromEnv(): number | undefined {\n  const raw = process.env.PORT?.trim();\n  if (!raw) return undefined;\n  const n = Number(raw);\n  return Number.isFinite(n) && n > 0 ? n : undefined;\n}\n\nfunction readViteDevPort(projectRoot: string): number {\n  const candidates = [\n    path.join(projectRoot, 'vite.config.ts'),\n    path.join(projectRoot, 'vite.config.js'),\n    path.join(projectRoot, 'vite.config.mjs'),\n  ];\n  for (const filePath of candidates) {\n    if (!fs.existsSync(filePath)) continue;\n    const source = fs.readFileSync(filePath, 'utf8');\n    const match = source.match(/server\\s*:\\s*\\{[^}]*port\\s*:\\s*(\\d+)/s);\n    if (match) return Number(match[1]);\n  }\n  return 5173;\n}\n\n/** Default local survey app URL for client handoff after INPUT 2 / Phase 6c. */\nexport function resolveSurveyDevUrl(projectRoot: string): string {\n  const pkgPath = path.join(projectRoot, 'package.json');\n  let framework: AgentFramework = 'unknown';\n  if (fs.existsSync(pkgPath)) {\n    const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as {\n      dependencies?: Record<string, string>;\n      devDependencies?: Record<string, string>;\n    };\n    framework = detectFramework(pkg);\n  }\n\n  const portFromEnv = readPortFromEnv();\n  if (portFromEnv) return `http://localhost:${portFromEnv}`;\n\n  switch (framework) {\n    case 'vite':\n      return `http://localhost:${readViteDevPort(projectRoot)}`;\n    case 'nextjs':\n    case 'cra':\n      return 'http://localhost:3000';\n    default:\n      return 'http://localhost:3000';\n  }\n}\n\nexport function detectFramework(packageJson: {\n  dependencies?: Record<string, string>;\n  devDependencies?: Record<string, string>;\n}): AgentFramework {\n  const deps = {\n    ...packageJson.dependencies,\n    ...packageJson.devDependencies,\n  };\n\n  if (deps.next) return 'nextjs';\n  if (deps.vite) return 'vite';\n  if (deps['react-scripts']) return 'cra';\n  return 'unknown';\n}\n\nexport function resolveSdkPackageName(packageJson: {\n  dependencies?: Record<string, string>;\n  devDependencies?: Record<string, string>;\n}): string | undefined {\n  const deps = {\n    ...packageJson.dependencies,\n    ...packageJson.devDependencies,\n  };\n\n  return SDK_PACKAGE_NAMES.find((name) => Boolean(deps[name]));\n}\n\nexport function isAwsDeployTarget(surveyUiConfig: { deploy?: { target?: string } }): boolean {\n  return surveyUiConfig.deploy?.target === 'aws';\n}\n\nexport function nextConfigIncludesTranspilePackages(\n  nextConfigSource: string,\n  sdkPackageName: string,\n): boolean {\n  return (\n    nextConfigSource.includes('transpilePackages') &&\n    nextConfigSource.includes(sdkPackageName)\n  );\n}\n\nexport function nextConfigHasStaticExport(nextConfigSource: string): boolean {\n  return (\n    /output\\s*:\\s*['\"]export['\"]/.test(nextConfigSource) &&\n    /assetPrefix\\s*:\\s*['\"]\\.\\/['\"]/.test(nextConfigSource)\n  );\n}\n\nexport function viteConfigHasRelativeBase(viteConfigSource: string): boolean {\n  return /base\\s*:\\s*['\"]\\.\\/['\"]/.test(viteConfigSource);\n}\n\nexport function sourceHasNextImports(source: string): boolean {\n  return /from\\s+['\"]next\\//.test(source);\n}\n\nexport function sourceHasUseClientDirective(source: string): boolean {\n  return /^['\"]use client['\"];?\\s*$/m.test(source);\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { colors } from './const';\nimport { resolveSdkPackageName } from './detect-framework';\nimport { runCommandSync } from './utils/exec';\n\nconst c = colors;\n\nexport const RANK_ORDER_PACKAGES = [\n  '@dnd-kit/core',\n  '@dnd-kit/sortable',\n  '@dnd-kit/utilities',\n] as const;\n\nexport const MCQ_OTHER_PICKER_PACKAGES = [\n  'react-international-phone',\n  'react-datepicker',\n  'date-fns',\n] as const;\n\nconst CORE_PEER_PACKAGES = ['@tanstack/react-query', 'react-icons'] as const;\n\n/** Tier 1 + Tier 2 — bundle ships all 11 question types including RANK_ORDER. */\nexport const BUNDLE_ALWAYS_PACKAGES = [\n  ...CORE_PEER_PACKAGES,\n  ...RANK_ORDER_PACKAGES,\n] as const;\n\nexport const BUNDLE_ALWAYS_DEV_PACKAGES = ['@types/node'] as const;\n\nexport interface BundleDepsManifest {\n  dependencies: Record<string, string>;\n  devDependencies: Record<string, string>;\n}\n\nfunction getSdkTemplatesRoot(): string {\n  return path.join(__dirname, '..', '..', 'templates');\n}\n\nexport function loadBundleDepsManifest(): BundleDepsManifest {\n  const manifestPath = path.join(getSdkTemplatesRoot(), 'vite-scaffold', 'package.deps.json');\n  if (fs.existsSync(manifestPath)) {\n    try {\n      const raw = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as BundleDepsManifest;\n      return {\n        dependencies: raw.dependencies ?? {},\n        devDependencies: raw.devDependencies ?? {},\n      };\n    } catch {\n      // fall through to defaults\n    }\n  }\n  return {\n    dependencies: {\n      '@dnd-kit/core': '^6.3.1',\n      '@dnd-kit/sortable': '^10.0.0',\n      '@dnd-kit/utilities': '^3.2.2',\n      '@tanstack/react-query': '^5.0.0',\n      'react-icons': '^5.5.0',\n    },\n    devDependencies: {\n      '@types/node': '^22.15.29',\n    },\n  };\n}\n\nexport interface MergeDepsResult {\n  merged: boolean;\n  addedDependencies: string[];\n  addedDevDependencies: string[];\n}\n\n/** Add missing dependency keys only — never overwrite existing versions. */\nexport function mergeDepsIntoPackageJson(projectRoot: string): MergeDepsResult {\n  const pkgPath = path.join(projectRoot, 'package.json');\n  if (!fs.existsSync(pkgPath)) {\n    return { merged: false, addedDependencies: [], addedDevDependencies: [] };\n  }\n\n  const manifest = loadBundleDepsManifest();\n  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as Record<string, unknown>;\n  const deps = (pkg.dependencies as Record<string, string> | undefined) ?? {};\n  const devDeps = (pkg.devDependencies as Record<string, string> | undefined) ?? {};\n\n  const addedDependencies: string[] = [];\n  const addedDevDependencies: string[] = [];\n\n  for (const [name, version] of Object.entries(manifest.dependencies)) {\n    if (!deps[name]) {\n      deps[name] = version;\n      addedDependencies.push(name);\n    }\n  }\n  for (const [name, version] of Object.entries(manifest.devDependencies)) {\n    if (!devDeps[name]) {\n      devDeps[name] = version;\n      addedDevDependencies.push(name);\n    }\n  }\n\n  if (!addedDependencies.length && !addedDevDependencies.length) {\n    return { merged: false, addedDependencies, addedDevDependencies };\n  }\n\n  pkg.dependencies = deps;\n  pkg.devDependencies = devDeps;\n  fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8');\n  return { merged: true, addedDependencies, addedDevDependencies };\n}\n\nexport function getBundleAlwaysPackageNames(): string[] {\n  const manifest = loadBundleDepsManifest();\n  return [\n    ...Object.keys(manifest.dependencies),\n    ...Object.keys(manifest.devDependencies),\n  ];\n}\n\nexport interface InstallBundleDepsResult {\n  ok: boolean;\n  installed: string[];\n  skipped: boolean;\n}\n\n/** Merge package.json keys then npm install only missing packages (skip network when all present). */\nexport function installBundleDepsIfMissing(projectRoot: string): InstallBundleDepsResult {\n  const mergeResult = mergeDepsIntoPackageJson(projectRoot);\n\n  const packages = getBundleAlwaysPackageNames();\n  const missingFromPkg = getMissingPackages(projectRoot, packages);\n  const missingFromNodeModules = getUninstalledNodeModules(projectRoot, packages);\n  const missing = [...new Set([...missingFromPkg, ...missingFromNodeModules])];\n\n  if (!missing.length) {\n    console.log(`${c.green}OK:${c.reset} Bundle deps — all packages already installed`);\n    return { ok: true, installed: [], skipped: true };\n  }\n\n  const cmd = formatNpmInstallCommand(missing);\n  if (!cmd) {\n    return { ok: true, installed: [], skipped: true };\n  }\n\n  if (mergeResult.merged) {\n    console.log(\n      `${c.dim}Merged into package.json: ${[...mergeResult.addedDependencies, ...mergeResult.addedDevDependencies].join(', ')}${c.reset}`,\n    );\n  }\n\n  console.log(`${c.dim}Installing missing bundle deps: ${missing.join(', ')}${c.reset}`);\n  const ok = runCommandSync('npm', ['install', ...missing], { cwd: projectRoot });\n  if (!ok) {\n    console.log(`${c.red}FAIL:${c.reset} npm install failed — run manually: ${cmd}`);\n    return { ok: false, installed: missing, skipped: false };\n  }\n\n  console.log(`${c.green}OK:${c.reset} Installed bundle deps (${missing.join(', ')})`);\n  return { ok: true, installed: missing, skipped: false };\n}\n\nfunction readPackageJson(projectRoot: string): Record<string, unknown> | null {\n  const pkgPath = path.join(projectRoot, 'package.json');\n  if (!fs.existsSync(pkgPath)) return null;\n  try {\n    return JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as Record<string, unknown>;\n  } catch {\n    return null;\n  }\n}\n\nexport function readInstalledPackages(projectRoot: string): Set<string> {\n  const pkg = readPackageJson(projectRoot);\n  if (!pkg) return new Set();\n\n  const installed = new Set<string>();\n  for (const section of ['dependencies', 'devDependencies'] as const) {\n    const deps = pkg[section] as Record<string, string> | undefined;\n    if (!deps) continue;\n    for (const name of Object.keys(deps)) installed.add(name);\n  }\n  return installed;\n}\n\nexport function getCorePackages(projectRoot: string): string[] {\n  const pkg = readPackageJson(projectRoot);\n  const sdk =\n    resolveSdkPackageName({\n      dependencies: pkg?.dependencies as Record<string, string> | undefined,\n      devDependencies: pkg?.devDependencies as Record<string, string> | undefined,\n    }) ?? '@explorer02/cfm-survey-sdk';\n\n  return [sdk, ...CORE_PEER_PACKAGES];\n}\n\nexport function getSurveyTypeDeps(\n  surveyTypes: string[],\n  hasMcqOtherPickers = false,\n): string[] {\n  const packages: string[] = [];\n  if (surveyTypes.includes('RANK_ORDER')) {\n    packages.push(...RANK_ORDER_PACKAGES);\n  }\n  if (hasMcqOtherPickers) {\n    packages.push(...MCQ_OTHER_PICKER_PACKAGES);\n  }\n  return [...new Set(packages)];\n}\n\nexport function getMissingPackages(projectRoot: string, packages: string[]): string[] {\n  const installed = readInstalledPackages(projectRoot);\n  return packages.filter((p) => !installed.has(p));\n}\n\nfunction isPackageInNodeModules(projectRoot: string, packageName: string): boolean {\n  const parts = packageName.split('/');\n  const modPath = path.join(projectRoot, 'node_modules', ...parts);\n  return fs.existsSync(modPath);\n}\n\n/** Packages listed in package.json but absent from node_modules. */\nexport function getUninstalledNodeModules(\n  projectRoot: string,\n  packages: string[],\n): string[] {\n  const listed = readInstalledPackages(projectRoot);\n  return packages.filter((p) => listed.has(p) && !isPackageInNodeModules(projectRoot, p));\n}\n\nexport function formatNpmInstallCommand(\n  packages: string[],\n  dev = false,\n): string | null {\n  if (!packages.length) return null;\n  if (dev) return `npm install -D ${packages.join(' ')}`;\n  return `npm install ${packages.join(' ')}`;\n}\n\nexport function printInstallBlock(options: {\n  title: string;\n  packages: string[];\n  dev?: boolean;\n  source?: string;\n  projectRoot: string;\n}): boolean {\n  const missing = getMissingPackages(options.projectRoot, options.packages);\n  const border = '═'.repeat(56);\n\n  if (!missing.length) {\n    console.log(`${c.green}OK:${c.reset} ${options.title} — all packages already installed`);\n    return true;\n  }\n\n  const cmd = formatNpmInstallCommand(missing, options.dev);\n  console.log('');\n  console.log(border);\n  console.log(`  ${options.title}`);\n  console.log(border);\n  console.log('');\n  if (cmd) console.log(cmd);\n  if (options.source) console.log(`\\nSource: ${options.source}`);\n  console.log(border);\n  console.log('');\n  return false;\n}\n\nexport function printSurveyTypeInstallBlock(\n  projectRoot: string,\n  surveyTypes: string[],\n  hasMcqOtherPickers = false,\n): boolean {\n  const packages = getSurveyTypeDeps(surveyTypes, hasMcqOtherPickers);\n  if (!packages.length) {\n    console.log(\n      `${c.dim}Survey-type deps: none required for inventory [${surveyTypes.join(', ')}]${c.reset}`,\n    );\n    return true;\n  }\n\n  return printInstallBlock({\n    title: 'INSTALL SURVEY-TYPE DEPS (run once before Phase 6)',\n    packages,\n    projectRoot,\n    source: 'setup/conditional-deps.md',\n  });\n}\n\nexport function checkTailwindGlobalsImport(projectRoot: string): boolean {\n  const globalsCandidates = [\n    'src/app/globals.css',\n    'src/styles/globals.css',\n    'src/index.css',\n    'app/globals.css',\n  ];\n  for (const rel of globalsCandidates) {\n    const abs = path.join(projectRoot, rel);\n    if (!fs.existsSync(abs)) continue;\n    const content = fs.readFileSync(abs, 'utf8');\n    if (/@import\\s+[\"']tailwindcss[\"']/.test(content)) return true;\n  }\n  return false;\n}\n","import type { AnswerValue, SurveyAnswers } from '../submitSurvey/types';\n\n/** Structured metadata passed to SDK console log helpers. */\nexport type SdkLogMetadata = Record<string, unknown> | object;\n\n/** Standard error payload for SDK log helpers (Error instances or message strings). */\nexport type SdkLoggableError = Error | string;\n\n/** Before/after pair when a respondent changes an answer after navigating back. */\nexport type AnswerChangeDelta = {\n  oldValue: AnswerValue | null;\n  newValue: AnswerValue | null;\n};\n\n/** Per-question answer diffs detected on backtrack revisit. */\nexport type BacktrackChangedAnswers = Record<string, AnswerChangeDelta>;\n\n/** Snapshot of page answers stored when the user navigates back. */\nexport type BacktrackAnswersSnapshot = Partial<SurveyAnswers>;\n\nexport function getErrorMessage(err: unknown): string {\n  return err instanceof Error ? err.message : String(err);\n}\n\n/** Normalizes catch-boundary values into {@link SdkLoggableError}. */\nexport function toSdkLoggableError(err: unknown): SdkLoggableError {\n  return err instanceof Error ? err : String(err);\n}\n","/**\n * The API base URL for fetching survey configuration data.\n */\nexport const SURVEY_BASE_URL = 'https://custom-p0.feedbook.me/api/feedback/survey/cfm';\n","import { SURVEY_BASE_URL } from './constants';\n\n/**\n * Constructs the external URL used to call the remote survey service api.\n *\n * @param instanceId The instance identifier token.\n * @returns Fully constructed target URL.\n */\nexport function buildExternalSurveyUrl(instanceId: string): string {\n  return `${SURVEY_BASE_URL}?instanceId=${encodeURIComponent(instanceId)}&draftPreview=false`;\n}\n\n/**\n * High-level function that constructs the survey fetch URL.\n * Returns empty string when instanceId is missing — fetch must not run until INPUT 2 JWT is set.\n *\n * @returns Target URL for fetch requests, or '' when no instanceId.\n */\nexport function buildSurveyUrl(instanceId?: string): string {\n  const targetId =\n    typeof instanceId === 'string' && instanceId.trim().length > 0 ? instanceId.trim() : '';\n  if (!targetId) return '';\n  return buildExternalSurveyUrl(targetId);\n}\n","export type InstanceJwtPayload = {\n  surveyResponseId?: string;\n};\n\n/** Decoded JWT payload before field validation. */\ntype RawInstanceJwtPayload = {\n  surveyResponseId?: string;\n};\n\n/**\n * Decode the payload segment of an instance JWT without verification.\n */\nexport function decodeInstanceJwt(instanceId: string): InstanceJwtPayload | null {\n  const token = instanceId.trim();\n  if (!token) return null;\n\n  const parts = token.split('.');\n  if (parts.length < 2) return null;\n\n  try {\n    const base64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n    const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=');\n    const json = atob(padded);\n    const parsed = JSON.parse(json);\n\n    if (typeof parsed !== 'object' || parsed === null) {\n      return null;\n    }\n\n    const payload = parsed as RawInstanceJwtPayload;\n    const surveyResponseId =\n      typeof payload.surveyResponseId === 'string' ? payload.surveyResponseId : undefined;\n\n    return { surveyResponseId };\n  } catch {\n    return null;\n  }\n}\n","import type { SurveyLanguage } from '../types/survey';\nimport type { ApiResponse } from '../internalTypes';\n\nconst LANGUAGE_DISPLAY_NAMES: Record<string, string> = {\n  en: 'English',\n  hi: 'Hindi',\n  de: 'Deutsch',\n  es: 'Español',\n  fr: 'Français',\n  bn: 'Bengali',\n  gu: 'Gujarati',\n  it: 'Italiano',\n  ja: '日本語',\n  ko: '한국어',\n  mr: 'Marathi',\n  pa: 'Punjabi',\n  ta: 'Tamil',\n  te: 'Telugu',\n  ur: 'Urdu',\n  zh: '中文',\n};\n\n/**\n * Resolves the full human-readable display name for a given language code.\n *\n * @param code The ISO language code (e.g. 'de', 'en').\n * @returns The resolved display name string.\n */\nexport function getLanguageName(code: string): string {\n  const norm = code.toLowerCase().trim();\n  return LANGUAGE_DISPLAY_NAMES[norm] || code.toUpperCase();\n}\n\n/**\n * Traverses all questions and translations to gather all unique languages supported by the survey.\n *\n * @param api The raw API response envelope containing the DTO pages.\n * @returns List of supported language objects with code and resolved names.\n */\nexport function extractSurveyLanguages(api: ApiResponse): SurveyLanguage[] {\n  const dto = api.cfmSurveyDTO;\n  const languagesSet = new Set<string>();\n  const defaultLanguage = dto?.baseLanguage ?? 'en';\n  languagesSet.add(defaultLanguage);\n\n  if (dto && Array.isArray(dto.surveyPages)) {\n    dto.surveyPages.forEach(page => {\n      (page.questionHolders ?? []).forEach(holder => {\n        const q = holder.question;\n        if (q && q.translations) {\n          Object.keys(q.translations).forEach(lang => {\n            languagesSet.add(lang);\n          });\n        }\n      });\n    });\n  }\n\n  return Array.from(languagesSet).map(lang => ({\n    code: lang,\n    name: getLanguageName(lang),\n  }));\n}\n","export const QUESTION_CONFIG_KEY = {\n  REQUIRED: 'REQUIRED',\n  REQUIRED_ERROR_MESSAGE: 'REQUIRED_ERROR_MESSAGE',\n  NOT_APPLICABLE_OPTIONS: 'NOT_APPLICABLE_OPTIONS',\n  ENABLE_NON_APPLICABLE: 'ENABLE_NON_APPLICABLE',\n  BUTTON_TYPE: 'BUTTON_TYPE',\n  SCALE_TYPE: 'SCALE_TYPE',\n  VIEW_VARIANT: 'VIEW_VARIANT',\n  NPS_BUTTON_VARIANT: 'NPS_BUTTON_VARIANT',\n  SHOW_SCALE_NUMBERS: 'SHOW_SCALE_NUMBERS',\n  TRANSPOSE_TABLE: 'TRANSPOSE_TABLE',\n  REPEAT_SCALE: 'REPEAT_SCALE',\n  ENABLE_SCALE: 'ENABLE_SCALE',\n  MATRIX_TYPE: 'MATRIX_TYPE',\n} as const;\n","/** Sprinklr draft surveys auto-populate QUESTION_HINT with this placeholder when unset. */\nconst SPRINKLR_DEFAULT_QUESTION_HINT = 'QUESTION HINT';\n\nexport function shouldShowQuestionHint(hint?: string | null): boolean {\n  if (!hint) return false;\n  const plain = hint.replace(/<[^>]*>/g, '').trim();\n  return plain.toUpperCase() !== SPRINKLR_DEFAULT_QUESTION_HINT;\n}\n","export function getConfigValue(\n  configs: { key: string; value?: string[] }[],\n  key: string\n): string | undefined {\n  return configs.find(c => c.key === key)?.value?.[0];\n}\n\nexport function getConfigFlag(\n  configs: { key: string; value?: string[] }[],\n  key: string\n): boolean {\n  return getConfigValue(configs, key)?.toLowerCase() === 'true';\n}\n\nexport function hasReverseScaleOrder(\n  configs: { key: string; value?: string[] }[],\n  raw: { additional?: { reverseScaleOrder?: boolean; reverseScale?: boolean } }\n): boolean {\n  return (\n    configs.some(c => c.key.includes('REVERSE') && c.value?.[0]?.toLowerCase() === 'true') ||\n    raw.additional?.reverseScaleOrder === true ||\n    raw.additional?.reverseScale === true\n  );\n}\n\nexport function hasNotApplicableOption(configs: { key: string; value?: string[] }[]): boolean {\n  return (\n    getConfigFlag(configs, 'NOT_APPLICABLE_OPTIONS') ||\n    getConfigFlag(configs, 'ENABLE_NON_APPLICABLE')\n  );\n}\n","import type { ApiQuestion, ApiQuestionSetting } from '../../../../internalTypes';\nimport { QUESTION_CONFIG_KEY } from '../../../../constants/questionConfigKeys';\nimport type { ContainerMedia } from '../../../../types/shared';\nimport { shouldShowQuestionHint } from '../../../../../surveyLogic/fields/questionHintUtils';\nimport { getConfigFlag } from './configUtils';\n\n/** Internal mapper output — not exported to SDK clients. */\nexport type ResolvedQuestionShell = {\n  id: string;\n  questionText: string;\n  questionDescription?: string;\n  questionHint?: string;\n  required: boolean;\n  requiredErrorMessage?: string;\n  questionNumber?: number;\n  containerMedia?: ContainerMedia;\n  referencedQuestionIds?: string[];\n};\n\nexport function resolveQuestionShell(\n  raw: ApiQuestion,\n  configs: ApiQuestionSetting[],\n  language?: string,\n  placeholders?: Record<string, string>\n): ResolvedQuestionShell {\n  const required = getConfigFlag(configs, QUESTION_CONFIG_KEY.REQUIRED);\n\n  const reqErrConfig = configs.find(c => c.key === QUESTION_CONFIG_KEY.REQUIRED_ERROR_MESSAGE);\n  let requiredErrorMessage = reqErrConfig?.value?.[0];\n  if (language && reqErrConfig?.translations?.[language]?.value?.[0]) {\n    requiredErrorMessage = reqErrConfig.translations[language].value![0];\n  }\n\n  let questionText =\n    (language && raw.translations?.[language]?.questionRichText) ||\n    (language && raw.translations?.[language]?.questionText) ||\n    raw.questionRichText ||\n    raw.questionText ||\n    '';\n\n  if (placeholders) {\n    questionText = questionText.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) =>\n      placeholders[key] !== undefined ? placeholders[key] : match\n    );\n  }\n\n  let questionDescription =\n    (language && raw.translations?.[language]?.descriptionRichText) ||\n    (language && raw.translations?.[language]?.description) ||\n    raw.descriptionRichText ||\n    raw.description ||\n    raw.descriptionText ||\n    (typeof raw.additional?.descriptionRichText === 'string' ? raw.additional.descriptionRichText : '') ||\n    (typeof raw.additional?.description === 'string' ? raw.additional.description : '') ||\n    '';\n\n  if (!questionDescription) {\n    const descConfig = configs.find(c => c.key.includes('DESCRIPTION'));\n    questionDescription = descConfig?.value?.[0] || '';\n    if (language && descConfig?.translations?.[language]?.valueRichText?.[0]) {\n      questionDescription = descConfig.translations[language].valueRichText![0];\n    } else if (language && descConfig?.translations?.[language]?.value?.[0]) {\n      questionDescription = descConfig.translations[language].value![0];\n    }\n  }\n\n  if (questionDescription && placeholders) {\n    questionDescription = questionDescription.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) =>\n      placeholders[key] !== undefined ? placeholders[key] : match\n    );\n  }\n\n  let questionHint = raw.questionHint;\n  const hintConfig = configs.find(c => c.key === 'QUESTION_HINT');\n  if (hintConfig?.value?.[0] && hintConfig.value[0] !== 'true' && hintConfig.value[0] !== 'false') {\n    questionHint = hintConfig.value[0];\n  }\n\n  const containerAssets = raw.questionContainerAssets;\n  const primaryAsset = containerAssets?.[0];\n  const url = primaryAsset?.source || primaryAsset?.mediaUrl || primaryAsset?.previewImageUrl;\n  const mimeType = primaryAsset?.mediaMimeType;\n\n  const alignConfig = configs.find(c => c.key === 'QUESTION_CONTAINER_MEDIA_ALIGNMENT');\n  const alignment = alignConfig?.value?.[0];\n\n  const sizeConfig = configs.find(c => c.key === 'TEXT_AND_MEDIA_SIZE');\n  const size = sizeConfig?.value?.[0] ? Number(sizeConfig.value[0]) : undefined;\n\n  const containerMedia: ContainerMedia | undefined =\n    url || mimeType || alignment || size !== undefined\n      ? {\n          ...(url ? { url } : {}),\n          ...(mimeType ? { mimeType } : {}),\n          ...(alignment ? { alignment } : {}),\n          ...(size !== undefined ? { size } : {}),\n        }\n      : undefined;\n\n  const associatedIds = raw.additionalInfo?.associatedPlaceholderQuestionIds;\n  const referencedQuestionIds = Array.isArray(associatedIds)\n    ? associatedIds.filter((id): id is string => typeof id === 'string' && id.length > 0)\n    : undefined;\n\n  return {\n    id: raw.id ?? '',\n    questionText,\n    ...(questionDescription ? { questionDescription } : {}),\n    ...(shouldShowQuestionHint(questionHint) ? { questionHint } : {}),\n    required,\n    ...(requiredErrorMessage ? { requiredErrorMessage } : {}),\n    ...(raw.questionNumber !== undefined ? { questionNumber: raw.questionNumber } : {}),\n    ...(containerMedia ? { containerMedia } : {}),\n    ...(referencedQuestionIds && referencedQuestionIds.length > 0\n      ? { referencedQuestionIds }\n      : {}),\n  };\n}\n","import type { ApiLogicFilter } from '../../../../internalTypes';\nimport type { ApiConditionEntity } from '../../../../internalTypes/apiControlConfig';\nimport type {\n  CustomFieldType,\n  LogicConditionEntity,\n  LogicFilterGroup,\n  LogicFilterLeaf,\n  LogicFilterNode,\n  LogicSubConditionEntity,\n} from '../../../../types/survey';\nimport type { ApiSubConditionEntity } from '../../../../internalTypes/apiControlConfig';\n\ntype ApiFilterGroup = ApiLogicFilter & { filters: ApiLogicFilter[] };\n\nconst CUSTOM_FIELD_TYPES = new Set<CustomFieldType>([\n  'TEXT',\n  'TEXT_MULTI',\n  'TEXTAREA',\n  'NUMBER',\n  'PICKLIST',\n  'PICKLIST_MULTISELECT',\n  'DATETIME',\n]);\n\nfunction hasNestedFilters(filter: ApiLogicFilter): filter is ApiFilterGroup {\n  return Array.isArray(filter.filters) && filter.filters.length > 0;\n}\n\nfunction isAndOrOperator(value: string | undefined): value is 'AND' | 'OR' {\n  return value === 'AND' || value === 'OR';\n}\n\nfunction isCustomFieldType(value: string | undefined): value is CustomFieldType {\n  return value !== undefined && CUSTOM_FIELD_TYPES.has(value as CustomFieldType);\n}\n\nfunction mapQuestionConditionEntity(\n  entity: ApiConditionEntity | undefined\n): Extract<LogicConditionEntity, { entityType: 'QUESTION' }> | null {\n  if (!entity?.id || entity.entityType !== 'QUESTION') {\n    return null;\n  }\n\n  return {\n    id: entity.id,\n    entityType: 'QUESTION',\n    ...(entity.answerType ? { answerType: entity.answerType } : {}),\n  };\n}\n\nfunction mapCustomFieldConditionEntity(\n  entity: ApiConditionEntity | undefined\n): Extract<LogicConditionEntity, { entityType: 'CUSTOM_FIELD' }> | null {\n  if (!entity?.id || entity.entityType !== 'CUSTOM_FIELD' || !isCustomFieldType(entity.fieldType)) {\n    return null;\n  }\n\n  return {\n    id: entity.id,\n    entityType: 'CUSTOM_FIELD',\n    fieldType: entity.fieldType,\n    ...(entity.assetClass ? { assetClass: entity.assetClass } : {}),\n  };\n}\n\nfunction mapConditionEntity(entity: ApiConditionEntity | undefined): LogicConditionEntity | null {\n  return mapQuestionConditionEntity(entity) ?? mapCustomFieldConditionEntity(entity);\n}\n\nfunction mapSubConditionEntity(\n  entity: ApiSubConditionEntity | undefined\n): LogicSubConditionEntity | null {\n  if (!entity?.id || entity.entityType !== 'OPTION') {\n    return null;\n  }\n\n  return {\n    id: entity.id,\n    entityType: 'OPTION',\n  };\n}\n\nfunction mapLogicFilterLeaf(raw: ApiLogicFilter): LogicFilterLeaf | null {\n  if (!raw.filterType || isAndOrOperator(raw.filterType)) {\n    return null;\n  }\n\n  const conditionEntity = mapConditionEntity(raw.details?.conditionEntity);\n  if (!conditionEntity) {\n    return null;\n  }\n\n  const subConditionEntity = mapSubConditionEntity(raw.details?.subConditionEntity);\n\n  const leaf: LogicFilterLeaf = {\n    filterType: raw.filterType,\n    details: {\n      conditionEntity,\n      ...(subConditionEntity ? { subConditionEntity } : {}),\n    },\n  };\n\n  const timezone = raw.details?.valueAdditional?.timezone;\n  if (timezone) {\n    leaf.details!.valueAdditional = { timezone };\n  }\n\n  if (raw.field) {\n    leaf.field = raw.field;\n  }\n\n  if (raw.values) {\n    leaf.values = raw.values;\n  }\n\n  return leaf;\n}\n\nfunction mapLogicFilterGroupNode(raw: ApiFilterGroup): LogicFilterGroup | null {\n  if (!isAndOrOperator(raw.filterType)) {\n    return null;\n  }\n\n  const childFilters = raw.filters\n    .map(child => mapLogicFilterNode(child))\n    .filter((node): node is LogicFilterNode => node !== null);\n\n  if (childFilters.length === 0) {\n    return null;\n  }\n\n  return {\n    filterType: raw.filterType,\n    filters: childFilters,\n  };\n}\n\nexport function mapLogicFilterNode(raw: ApiLogicFilter): LogicFilterNode | null {\n  if (hasNestedFilters(raw)) {\n    return mapLogicFilterGroupNode(raw);\n  }\n\n  return mapLogicFilterLeaf(raw);\n}\n\nfunction isLogicFilterGroup(node: LogicFilterNode): node is LogicFilterGroup {\n  return 'filters' in node;\n}\n\nexport function mapLogicFilterGroup(raw: ApiLogicFilter | undefined): LogicFilterGroup | null {\n  if (!raw) {\n    return null;\n  }\n\n  const node = mapLogicFilterNode(raw);\n  if (!node) {\n    return null;\n  }\n\n  if (isLogicFilterGroup(node)) {\n    return node;\n  }\n\n  // A single comparison rule is stored as a one-item AND group.\n  return {\n    filterType: 'AND',\n    filters: [node],\n  };\n}\n","import type { ApiSkipLogic } from '../../../../internalTypes';\nimport type { SkipLogic } from '../../../../types/survey';\nimport { mapLogicFilterGroup } from './mapLogicFilters';\n\nexport function mapSkipLogics(raw: ApiSkipLogic[] | undefined): SkipLogic[] | undefined {\n  if (!raw?.length) return undefined;\n\n  const mapped = raw\n    .map(item => {\n      const id = item.id?.trim();\n      const skipToId = item.skipTo?.id?.trim();\n      const entityType = item.skipTo?.entityType;\n      const condition = mapLogicFilterGroup(item.condition);\n\n      if (!id || !skipToId || !entityType || !condition) return null;\n      if (entityType !== 'QUESTION' && entityType !== 'END_OF_SURVEY') return null;\n\n      return {\n        id,\n        skipTo: { id: skipToId, entityType },\n        condition,\n      } satisfies SkipLogic;\n    })\n    .filter((item): item is SkipLogic => item !== null);\n\n  return mapped.length > 0 ? mapped : undefined;\n}\n","import type { ApiDisplayLogic } from '../../../../internalTypes';\nimport type { DisplayLogic } from '../../../../types/survey';\nimport { mapLogicFilterGroup } from './mapLogicFilters';\n\nexport function mapDisplayLogic(raw: ApiDisplayLogic | undefined): DisplayLogic | undefined {\n  if (!raw) return undefined;\n\n  const condition = mapLogicFilterGroup(raw.condition);\n  if (!condition) return undefined;\n\n  return {\n    condition,\n    isDynamicAppearanceEnabled: raw.isDynamicAppearanceEnabled === true,\n  };\n}\n","import type { ApiQuestion, ApiQuestionDisplayVariant } from '../../../../internalTypes';\nimport type { QuestionDisplayVariant } from '../../../../types/survey';\nimport { mapDisplayLogic } from './mapDisplayLogic';\n\nfunction resolveVariantText(\n  raw: ApiQuestionDisplayVariant,\n  language?: string,\n  placeholders?: Record<string, string>\n): string {\n  let questionText: string =\n    (language && raw.translations?.[language]?.questionRichText) ||\n    (language && raw.translations?.[language]?.questionText) ||\n    raw.questionRichText ||\n    raw.questionText ||\n    '';\n\n  if (placeholders) {\n    questionText = questionText.replace(/\\{\\{(\\w+)\\}\\}/g, (match: string, key: string) =>\n      placeholders[key] !== undefined ? placeholders[key] : match\n    );\n  }\n\n  return questionText;\n}\n\nexport function mapQuestionDisplayVariants(\n  raw: ApiQuestion,\n  language?: string,\n  placeholders?: Record<string, string>\n): QuestionDisplayVariant[] | undefined {\n  const variants = raw.questionDisplayVariants;\n  if (!variants?.length) return undefined;\n\n  const mapped: QuestionDisplayVariant[] = [];\n\n  for (const variant of variants) {\n    const id = variant.id;\n    if (!id) continue;\n\n    const questionText = resolveVariantText(variant, language, placeholders);\n    if (!questionText) continue;\n\n    const displayLogic = mapDisplayLogic(variant.controlConfig?.displayLogic);\n\n    if (!displayLogic) continue;\n\n    mapped.push({\n      id,\n      questionText,\n      ...(displayLogic ? { displayLogic } : {}),\n    });\n  }\n\n  return mapped.length > 0 ? mapped : undefined;\n}\n","import type {\n  DisplayLogic,\n  QuestionDisplayVariant,\n  SkipLogic,\n  SurveyQuestion,\n} from '../../../../types/survey';\nimport type { QuestionBeforeLogics } from './questionMapperTypes';\n\n/** Adds skip, display, and variant rules to a mapped question. */\nexport function attachQuestionLogics(\n  question: QuestionBeforeLogics,\n  skipLogics: SkipLogic[] | undefined,\n  displayLogic: DisplayLogic | undefined,\n  displayVariants: QuestionDisplayVariant[] | undefined\n): SurveyQuestion {\n  return {\n    ...question,\n    ...(skipLogics?.length ? { skipLogics } : {}),\n    ...(displayLogic ? { displayLogic } : {}),\n    ...(displayVariants?.length ? { displayVariants } : {}),\n  };\n}\n","export const QUESTION_TYPE = {\n  MCQ: 'MCQ',\n  TEXTFIELD: 'TEXTFIELD',\n  NPS_SCALE: 'NPS_SCALE',\n  CFM_MATRIX: 'CFM_MATRIX',\n  CSAT_MATRIX: 'CSAT_MATRIX',\n  RATING_MATRIX: 'RATING_MATRIX',\n  SLIDER_MATRIX: 'SLIDER_MATRIX',\n  FILE_UPLOAD: 'FILE_UPLOAD',\n  TEXT_AND_MEDIA: 'TEXT_AND_MEDIA',\n  HEATMAP: 'HEATMAP',\n  RANK_ORDER: 'RANK_ORDER',\n} as const;\n\nexport type QuestionType = (typeof QUESTION_TYPE)[keyof typeof QUESTION_TYPE];\n","import type { ApiQuestionSetting } from '../../../../internalTypes';\n\nexport type ChoiceRandomizationType = 'RANDOM_ORDER' | 'RANDOM_FLIP' | 'LIMITED_CHOICES';\n\nexport type ChoiceRandomizationConfig = {\n  enabled: true;\n  type: ChoiceRandomizationType;\n  numberOfChoices?: number;\n};\n\nfunction shuffleArray<T>(items: T[]): T[] {\n  const result = [...items];\n  for (let i = result.length - 1; i > 0; i -= 1) {\n    const j = Math.floor(Math.random() * (i + 1));\n    [result[i], result[j]] = [result[j], result[i]];\n  }\n  return result;\n}\n\nexport function parseChoiceRandomization(\n  configs: ApiQuestionSetting[]\n): ChoiceRandomizationConfig | undefined {\n  const choiceConfig = configs.find(config => config.key === 'CHOICE_RANDOMIZATION');\n  if (choiceConfig?.value?.[0]?.toLowerCase() === 'true') {\n    const rawType = choiceConfig.childConfigs\n      ?.find(config => config.key === 'RANDOMIZATION_TYPE')\n      ?.value?.[0]?.toUpperCase();\n    const type: ChoiceRandomizationType =\n      rawType === 'RANDOM_FLIP' || rawType === 'LIMITED_CHOICES' ? rawType : 'RANDOM_ORDER';\n    const numberRaw = choiceConfig.childConfigs\n      ?.find(config => config.key === 'NUMBER_OF_CHOICES')\n      ?.value?.[0];\n    const numberOfChoices = numberRaw ? Number(numberRaw) : undefined;\n\n    return {\n      enabled: true,\n      type,\n      ...(numberOfChoices !== undefined && Number.isFinite(numberOfChoices)\n        ? { numberOfChoices }\n        : {}),\n    };\n  }\n\n  const shuffleOrder =\n    configs.find(config => config.key === 'SHUFFLE_ORDER')?.value?.[0]?.toLowerCase() === 'true';\n  if (shuffleOrder) {\n    return { enabled: true, type: 'RANDOM_ORDER' };\n  }\n\n  return undefined;\n}\n\nexport function applyChoiceRandomization<T extends { id: string }>(\n  options: T[],\n  config: ChoiceRandomizationConfig | undefined,\n  pinnedOptionIds?: string[]\n): { options: T[]; shuffleOptions: boolean } {\n  if (!config?.enabled || options.length <= 1) {\n    return { options, shuffleOptions: false };\n  }\n\n  switch (config.type) {\n    case 'RANDOM_FLIP': {\n      const flipped = Math.random() < 0.5 ? [...options].reverse() : options;\n      return { options: flipped, shuffleOptions: true };\n    }\n    case 'LIMITED_CHOICES': {\n      const requestedCount = config.numberOfChoices ?? options.length;\n      const count = Math.min(Math.max(1, requestedCount), options.length);\n      if (count >= options.length) {\n        return { options: shuffleArray(options), shuffleOptions: true };\n      }\n\n      const pinnedSet = new Set(\n        (pinnedOptionIds ?? []).filter(id => options.some(option => option.id === id))\n      );\n      const pinned = options.filter(option => pinnedSet.has(option.id));\n      const remaining = options.filter(option => !pinnedSet.has(option.id));\n      const slotsLeft = Math.max(0, count - pinned.length);\n      const selectedRemaining = shuffleArray(remaining).slice(0, slotsLeft);\n\n      return {\n        options: shuffleArray([...pinned, ...selectedRemaining]),\n        shuffleOptions: true,\n      };\n    }\n    case 'RANDOM_ORDER':\n    default:\n      return { options: shuffleArray(options), shuffleOptions: true };\n  }\n}\n","import type { McqOption } from '../../../../types/mcq';\nimport {\n  applyChoiceRandomization,\n  type ChoiceRandomizationConfig,\n} from '../shared/choiceRandomization';\n\n/** Randomize regular MCQ options only; Other options stay last in original order. */\nexport function applyMcqChoiceRandomization(\n  options: McqOption[],\n  randomization: ChoiceRandomizationConfig | undefined,\n  defaultOptionIds?: string[]\n): { options: McqOption[]; shuffleOptions: boolean } {\n  const otherOptions = options.filter(option => option.otherOption);\n  const regularOptions = options.filter(option => !option.otherOption);\n\n  const regularDefaultIds = defaultOptionIds?.filter(id =>\n    regularOptions.some(option => option.id === id)\n  );\n\n  const { options: randomizedRegular, shuffleOptions } = applyChoiceRandomization(\n    regularOptions,\n    randomization,\n    regularDefaultIds\n  );\n\n  return {\n    options: [...randomizedRegular, ...otherOptions],\n    shuffleOptions,\n  };\n}\n","import type { ApiDisplayLogic } from '../../../../internalTypes';\nimport type { AnswerLogic } from '../../../../types/survey';\nimport { mapLogicFilterGroup } from './mapLogicFilters';\n\nexport function mapAnswerLogic(raw: ApiDisplayLogic | undefined): AnswerLogic | undefined {\n  if (!raw) {\n    return undefined;\n  }\n\n  const condition = mapLogicFilterGroup(raw.condition);\n  if (!condition) {\n    return undefined;\n  }\n\n  return { condition };\n}\n","import type { ApiAnswerOption } from '../../../../internalTypes';\nimport type { ApiQuestionSetting } from '../../../../internalTypes/apiQuestionSetting';\nimport type {\n  McqOtherContentType,\n  McqOtherDateFormat,\n  McqOtherOptionConfig,\n} from '../../../../types/mcq';\n\nfunction findConfig(configs: ApiQuestionSetting[] | undefined, key: string): ApiQuestionSetting | undefined {\n  return configs?.find(c => c.key === key);\n}\n\nfunction firstValue(config: ApiQuestionSetting | undefined): string | undefined {\n  return config?.value?.[0];\n}\n\nfunction parseNumber(raw: string | undefined): number | undefined {\n  if (raw === undefined || raw === '') return undefined;\n  const n = Number(raw);\n  return Number.isFinite(n) ? n : undefined;\n}\n\nfunction mapDateFormat(raw: string | undefined): McqOtherDateFormat {\n  const normalized = raw?.toLowerCase() ?? '';\n  if (normalized.includes('yyyy') && normalized.indexOf('yyyy') < normalized.indexOf('mm')) {\n    return 'YYYY/MM/DD';\n  }\n  if (normalized.startsWith('mm')) {\n    return 'MM/DD/YYYY';\n  }\n  return 'DD/MM/YYYY';\n}\n\nfunction mapContentType(raw: string | undefined): McqOtherContentType {\n  const upper = raw?.toUpperCase() ?? 'TEXT';\n  if (upper === 'PHONE_NUMBER' || upper === 'POSTAL_CODE' || upper === 'DATE' || upper === 'NUMERIC' || upper === 'EMAIL') {\n    return upper;\n  }\n  return 'TEXT';\n}\n\nfunction extractContentTypeConfig(otherConfig: ApiQuestionSetting): McqOtherOptionConfig | undefined {\n  const contentTypeConfig = findConfig(otherConfig.childConfigs, 'CONTENT_TYPE');\n  const contentType = mapContentType(firstValue(contentTypeConfig));\n  const contentChildren = contentTypeConfig?.childConfigs ?? [];\n  const errorMessage = firstValue(findConfig(contentChildren, 'ERROR_MESSAGE'));\n\n  const base = {\n    label: '',\n    helpText: '',\n    markRequired: false,\n    ...(errorMessage !== undefined ? { errorMessage } : {}),\n  };\n\n  switch (contentType) {\n    case 'TEXT': {\n      const minCharacters = parseNumber(firstValue(findConfig(contentChildren, 'MIN_CHARACTER_COUNT')));\n      const maxCharacters = parseNumber(firstValue(findConfig(contentChildren, 'MAX_CHARACTER_COUNT')));\n      return {\n        ...base,\n        contentType: 'TEXT',\n        ...(minCharacters !== undefined ? { minCharacters } : {}),\n        ...(maxCharacters !== undefined ? { maxCharacters } : {}),\n      };\n    }\n    case 'NUMERIC': {\n      const minNumber = parseNumber(firstValue(findConfig(contentChildren, 'MIN_NUMBER')));\n      const maxNumber = parseNumber(firstValue(findConfig(contentChildren, 'MAX_NUMBER')));\n      const decimalCount = parseNumber(firstValue(findConfig(contentChildren, 'DECIMAL_COUNT')));\n      return {\n        ...base,\n        contentType: 'NUMERIC',\n        ...(minNumber !== undefined ? { minNumber } : {}),\n        ...(maxNumber !== undefined ? { maxNumber } : {}),\n        ...(decimalCount !== undefined ? { decimalCount } : {}),\n      };\n    }\n    case 'EMAIL':\n      return { ...base, contentType: 'EMAIL' };\n    case 'PHONE_NUMBER':\n    case 'POSTAL_CODE': {\n      const countryCodes = findConfig(contentChildren, 'COUNTRY_CODE')?.value ?? [];\n      return {\n        ...base,\n        contentType,\n        countryCodes,\n      };\n    }\n    case 'DATE': {\n      const dateFormat = mapDateFormat(firstValue(findConfig(contentChildren, 'DATE_FORMAT')));\n      const dateRange = findConfig(contentChildren, 'DATE_RANGE')?.value ?? [];\n      const minDate = parseNumber(dateRange[0]);\n      const maxDate = parseNumber(dateRange[1]);\n      return {\n        ...base,\n        contentType: 'DATE',\n        dateFormat,\n        ...(minDate !== undefined ? { minDate } : {}),\n        ...(maxDate !== undefined ? { maxDate } : {}),\n      };\n    }\n    default:\n      return { ...base, contentType: 'TEXT' };\n  }\n}\n\nexport function extractOtherOptionConfig(\n  answerDetail: ApiAnswerOption,\n  fallbackLabel: string\n): McqOtherOptionConfig | undefined {\n  const otherConfig = answerDetail.answerDetailConfigs?.find(c => c.key === 'OTHER_OPTION');\n  if (firstValue(otherConfig)?.toLowerCase() !== 'true') {\n    return undefined;\n  }\n\n  const childConfigs = otherConfig?.childConfigs ?? [];\n  const label = firstValue(findConfig(childConfigs, 'LABEL')) ?? fallbackLabel;\n  const helpText = firstValue(findConfig(childConfigs, 'HELP_TEXT')) ?? '';\n  const markRequired = firstValue(findConfig(childConfigs, 'MARK_REQUIRED'))?.toLowerCase() === 'true';\n  const placeholder = answerDetail.inputPlaceholder;\n\n  const contentConfig = extractContentTypeConfig(otherConfig!);\n  if (!contentConfig) {\n    return undefined;\n  }\n\n  return {\n    ...contentConfig,\n    label,\n    helpText,\n    markRequired,\n    ...(placeholder ? { placeholder } : {}),\n  };\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport type { McqOption } from '../../../../types/mcq';\nimport { mapAnswerLogic } from '../shared/mapAnswerLogic';\nimport { extractOtherOptionConfig } from './extractOtherOptionConfig';\n\nexport function buildMcqOptions(question: ApiQuestion, language?: string): McqOption[] {\n  return (question.answerDetails ?? [])\n    .filter(a => !a.hidden && !a.additional?.isHintText)\n    .map((a, i) => {\n      const answerLogic = mapAnswerLogic(a.controlConfig?.displayLogic);\n      const optionLabel =\n        (language && a.translations?.[language]?.answerText) || a.answerText || '';\n      const otherOption = extractOtherOptionConfig(a, optionLabel);\n\n      return {\n        id: a.id ?? String(i),\n        optionLabel: otherOption?.label ?? optionLabel,\n        ...(answerLogic ? { answerLogic } : {}),\n        ...(otherOption ? { otherOption } : {}),\n      };\n    });\n}\n","import type { ApiQuestionSetting } from '../../../../internalTypes';\n\nexport type McqAnswerConditions = {\n  minSelections?: number;\n  maxSelections?: number;\n  answerConditionErrorMessage?: string;\n};\n\nexport function extractAnswerConditions(configs: ApiQuestionSetting[]): McqAnswerConditions {\n  const conditionConfig = configs.find(c => c.key === 'ANSWER_CONDITION');\n  if (conditionConfig?.value?.[0]?.toLowerCase() !== 'true') {\n    return {};\n  }\n\n  const minMaxConfig = conditionConfig.childConfigs?.find(c => c.key === 'MIN_MAX_ANSWER');\n  const minRaw = minMaxConfig?.childConfigs?.find(c => c.key === 'MIN_ANSWER')?.value?.[0];\n  const maxRaw = minMaxConfig?.childConfigs?.find(c => c.key === 'MAX_ANSWER')?.value?.[0];\n  const errorMessage = conditionConfig.childConfigs?.find(c => c.key === 'ERROR_MESSAGE')?.value?.[0];\n\n  const minSelections = minRaw !== undefined ? Number(minRaw) : undefined;\n  const maxSelections = maxRaw !== undefined ? Number(maxRaw) : undefined;\n\n  return {\n    ...(minSelections !== undefined && Number.isFinite(minSelections) ? { minSelections } : {}),\n    ...(maxSelections !== undefined && Number.isFinite(maxSelections) ? { maxSelections } : {}),\n    ...(errorMessage ? { answerConditionErrorMessage: errorMessage } : {}),\n  };\n}\n","import type { ApiQuestionSetting } from '../../../../internalTypes';\n\nexport function extractDefaultOptionIds(\n  configs: ApiQuestionSetting[],\n  validOptionIds?: string[]\n): string[] | undefined {\n  const defaultAnswerConfig = configs.find(c => c.key === 'DEFAULT_ANSWER');\n  if (defaultAnswerConfig?.value?.[0]?.toLowerCase() !== 'true') {\n    return undefined;\n  }\n\n  const defaultAnswersConfig = defaultAnswerConfig.childConfigs?.find(\n    c => c.key === 'DEFAULT_ANSWERS'\n  );\n  const ids = defaultAnswersConfig?.value?.filter(Boolean) ?? [];\n  if (ids.length === 0) {\n    return undefined;\n  }\n\n  if (validOptionIds && validOptionIds.length > 0) {\n    const validSet = new Set(validOptionIds);\n    const filtered = ids.filter(id => validSet.has(id));\n    return filtered.length > 0 ? filtered : undefined;\n  }\n\n  return ids;\n}\n","import type { McqQuestion } from '../../../../types/index';\nimport { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { parseChoiceRandomization } from '../shared/choiceRandomization';\nimport { applyMcqChoiceRandomization } from './applyMcqChoiceRandomization';\nimport { buildMcqOptions } from './buildMcqOptions';\nimport { extractAnswerConditions } from './extractAnswerConditions';\nimport { extractDefaultOptionIds } from './extractDefaultOptionIds';\n\nexport function mapMcqQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  language?: string\n): McqQuestion {\n  const configs = raw.questionConfigs ?? [];\n  const mcqVariant = configs.find(c => c.key === 'MCQ_VARIANT')?.value?.[0]?.toUpperCase() ?? 'SINGLESELECT';\n  const selectionMode = mcqVariant.includes('MULTI') ? 'multiple' : 'single';\n\n  const formatType = configs.find(c => c.key === 'MCQ_FORMAT_TYPE')?.value?.[0]?.toUpperCase() ?? 'LIST';\n  const displayFormat = formatType.includes('GRID') ? 'grid' : 'list';\n\n  const columnsConfig = configs.find(c => c.key === 'COLUMNS')?.value?.[0];\n  const columnCount = columnsConfig ? Number(columnsConfig) : undefined;\n\n  const builtOptions = buildMcqOptions(raw, language);\n  const defaultOptionIdsBeforeRandomization = extractDefaultOptionIds(\n    configs,\n    builtOptions.map(o => o.id)\n  );\n  const randomization = parseChoiceRandomization(configs);\n  const { options, shuffleOptions } = applyMcqChoiceRandomization(\n    builtOptions,\n    randomization,\n    defaultOptionIdsBeforeRandomization\n  );\n  const defaultOptionIds = extractDefaultOptionIds(\n    configs,\n    options.map(o => o.id)\n  );\n  const answerConditions = extractAnswerConditions(configs);\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.MCQ,\n    options,\n    selectionMode,\n    displayFormat,\n    shuffleOptions,\n    ...(columnCount !== undefined && Number.isFinite(columnCount) ? { columnCount } : {}),\n    ...(defaultOptionIds ? { defaultOptionIds } : {}),\n    ...answerConditions,\n    ...(raw.additionalInfo?.hasOptionLevelAnswers ? { hasOptionLevelAnswers: true } : {}),\n  };\n}\n","import type { SdkLogMetadata } from '../types/shared';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'success' | 'perf' | 'analytics';\n\nlet loggingEnabled = false;\n\n// CSS styles for console log level badges\nconst BADGE_STYLES: Record<LogLevel, string> = {\n  debug: 'background: #7f8c8d; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n  info: 'background: #2980b9; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n  warn: 'background: #f1c40f; color: #000; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n  error: 'background: #e74c3c; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n  success: 'background: #2ecc71; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n  perf: 'background: #9b59b6; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n  analytics: 'background: #e20074; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n};\n\n/**\n * Writes formatted badges and log details into the console if logging is enabled.\n * Note: analytics level logs are always printed regardless of debug settings.\n *\n * @param level Logging categorization level (debug, info, warn, error, success, analytics).\n * @param message Description message text.\n * @param meta Optional auxiliary metadata/payload.\n */\nfunction writeLog(level: LogLevel, message: string, meta?: SdkLogMetadata) {\n  if (!loggingEnabled && level !== 'analytics') return;\n\n  const timestamp = new Date().toLocaleTimeString();\n  const badge = `%c[SDK:${level.toUpperCase()}]`;\n  const style = BADGE_STYLES[level];\n\n  if (meta !== undefined) {\n    console.log(`[${timestamp}] ${badge}`, style, message, meta);\n  } else {\n    console.log(`[${timestamp}] ${badge}`, style, message);\n  }\n}\n\n/**\n * A central namespace containing logging helpers for debugging, warnings, success,\n * and API monitoring. Output logs are formatted with custom browser styles.\n */\nexport const sdkLogger = {\n  setEnabled: (val: boolean) => {\n    loggingEnabled = val;\n  },\n  isEnabled: () => {\n    return loggingEnabled;\n  },\n  debug: (msg: string, meta?: SdkLogMetadata) => writeLog('debug', msg, meta),\n  info: (msg: string, meta?: SdkLogMetadata) => writeLog('info', msg, meta),\n  warn: (msg: string, meta?: SdkLogMetadata) => writeLog('warn', msg, meta),\n  error: (msg: string, meta?: SdkLogMetadata) => writeLog('error', msg, meta),\n  success: (msg: string, meta?: SdkLogMetadata) => writeLog('success', msg, meta),\n  analytics: (msg: string, meta?: SdkLogMetadata) => writeLog('analytics', msg, meta),\n  perf: (metric: {\n    apiName: string;\n    durationMs: number;\n    status: number | string;\n    url: string;\n    requestSize?: string;\n    responseSize?: string;\n    payloadSize?: string;\n    success: boolean;\n  }) => {\n    writeLog(\n      'perf',\n      `${metric.apiName} completed in ${metric.durationMs.toFixed(2)}ms | Status: ${metric.status}`,\n      metric\n    );\n  },\n};\n","import { sdkLogger } from '../../logger/logger';\nimport type { Survey } from '../types';\nimport type { SdkLoggableError } from '../../types/shared';\n\nexport function logMapWarning(): void {\n  sdkLogger.warn('Cannot map survey: apiResponse is null or undefined');\n}\n\nexport function logMapSuccess(mappedSurvey: Survey): void {\n  sdkLogger.success('Mapped survey layout successfully', { mappedSurvey });\n}\n\nexport function logMapError(err: SdkLoggableError): void {\n  sdkLogger.error('Failed to map survey layout', { err });\n}\n\nexport function logUnknownAnswerType(answerType: string | undefined, questionId: string): void {\n  sdkLogger.warn('Unknown question answerType — falling back to MCQ mapper', {\n    answerType: answerType ?? '(missing)',\n    questionId,\n  });\n}\n","export const DISPLAY_STYLE = {\n  EMOJI: 'emoji',\n  STAR: 'star',\n  STANDARD: 'standard',\n  NUMBERED: 'numbered',\n  DROPDOWN: 'dropdown',\n  SELECTBOX: 'selectbox',\n  GRAPHICS: 'graphics',\n} as const;\n\nexport type DisplayStyle = (typeof DISPLAY_STYLE)[keyof typeof DISPLAY_STYLE];\n\nexport const API_STYLE_VALUE = {\n  EMOJI: 'EMOJI',\n  STAR: 'STAR',\n  RADIO: 'RADIO',\n  GRAPHIC: 'GRAPHIC',\n  SLIDER: 'SLIDER',\n  CSAT: 'CSAT',\n  SMILEY: 'SMILEY',\n  FACE: 'FACE',\n  DROP: 'DROP',\n  SELECT: 'SELECT',\n  NUMBER: 'NUMBER',\n} as const;\n\nexport const NPS_BUTTON_STYLE = {\n  EMOJI: 'emoji',\n  RADIO: 'radio',\n  NUMBERED: 'numbered',\n  STANDARD: 'standard',\n} as const;\n","import type { ApiAnswerDetail } from '../../../../internalTypes';\n\nexport function extractHintLabels(\n  answerDetails: ApiAnswerDetail[] = [],\n  language?: string\n): { minLabel?: string; midLabel?: string; maxLabel?: string } {\n  const hints = answerDetails\n    .filter(a => a.additional?.isHintText && !a.hidden)\n    .map(a => (language && a.translations?.[language]?.answerText) || a.answerText || '')\n    .filter(Boolean);\n\n  if (hints.length >= 3) {\n    return { minLabel: hints[0], midLabel: hints[1], maxLabel: hints[2] };\n  }\n  return { minLabel: hints[0], maxLabel: hints[1] };\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\n\ntype SelectableScalePoint = { id: string; optionLabel: string };\n\nexport function buildSelectableScalePoints(\n  question: ApiQuestion,\n  language?: string,\n  options?: { defaultCount?: number }\n): SelectableScalePoint[] {\n  const selectable = (question.answerDetails ?? []).filter(\n    a => !a.hidden && !a.additional?.isHintText\n  );\n\n  if (selectable.length > 0) {\n    return selectable.map((a, i) => ({\n      id: a.id ?? String(i),\n      optionLabel:\n        (language && a.translations?.[language]?.answerText) || a.answerText || String(i),\n    }));\n  }\n\n  if (options?.defaultCount !== undefined) {\n    return Array.from({ length: options.defaultCount }, (_, i) => ({\n      id: String(i),\n      optionLabel: String(i),\n    }));\n  }\n\n  return [];\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport { buildSelectableScalePoints } from '../matrix/buildSelectableScalePoints';\n\nexport function buildNpsScalePoints(\n  question: ApiQuestion,\n  language?: string\n): { id: string; optionLabel: string }[] {\n  return buildSelectableScalePoints(question, language, { defaultCount: 11 });\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport { QUESTION_CONFIG_KEY } from '../../../../constants/questionConfigKeys';\nimport { NPS_BUTTON_STYLE } from '../../../../constants/displayStyles';\nimport type { NpsQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { extractHintLabels } from '../labels/extractHintLabels';\nimport { buildNpsScalePoints } from './buildNpsScalePoints';\nimport { getConfigValue, hasReverseScaleOrder } from '../shared/configUtils';\n\nexport function mapNpsQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  configs: { key: string; value?: string[] }[],\n  language?: string\n): NpsQuestion {\n  const hintLabels = extractHintLabels(raw.answerDetails, language);\n  let { minLabel, maxLabel } = hintLabels;\n  const { midLabel } = hintLabels;\n  let options = buildNpsScalePoints(raw, language);\n\n  const reverseScaleOrder = hasReverseScaleOrder(configs, raw);\n  if (reverseScaleOrder) {\n    options = [...options].reverse();\n    if (minLabel !== undefined && maxLabel !== undefined) {\n      [minLabel, maxLabel] = [maxLabel, minLabel];\n    }\n  }\n\n  let midLabelIndex: number | undefined;\n  if (midLabel) {\n    midLabelIndex =\n      options.length === 11\n        ? reverseScaleOrder\n          ? 2.5\n          : 7.5\n        : (options.length - 1) / 2;\n  }\n\n  let buttonStyle: NpsQuestion['buttonStyle'] = NPS_BUTTON_STYLE.NUMBERED;\n  const variant = getConfigValue(configs, QUESTION_CONFIG_KEY.NPS_BUTTON_VARIANT)?.toLowerCase();\n  if (variant === NPS_BUTTON_STYLE.EMOJI) buttonStyle = NPS_BUTTON_STYLE.EMOJI;\n  else if (variant === NPS_BUTTON_STYLE.RADIO) buttonStyle = NPS_BUTTON_STYLE.STANDARD;\n\n  const showScaleNumbersRaw = getConfigValue(configs, QUESTION_CONFIG_KEY.SHOW_SCALE_NUMBERS);\n  const showScaleNumbers = showScaleNumbersRaw?.toLowerCase() !== 'false';\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.NPS_SCALE,\n    options,\n    ...(minLabel ? { minLabel } : {}),\n    ...(midLabel ? { midLabel } : {}),\n    ...(midLabelIndex !== undefined ? { midLabelIndex } : {}),\n    ...(maxLabel ? { maxLabel } : {}),\n    reverseScaleOrder: !!reverseScaleOrder,\n    buttonStyle,\n    showScaleNumbers,\n  };\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { TextInputQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\n\nexport function mapTextInputQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  configs: { key: string; value?: string[]; childConfigs?: { key: string; value?: string[] }[] }[],\n  language?: string\n): TextInputQuestion {\n  const contentTypeConfig = configs.find(c => c.key === 'CONTENT_TYPE');\n  const maxCharConfig = contentTypeConfig?.childConfigs?.find(\n    cc => cc.key === 'MAX_CHARACTER_COUNT'\n  );\n  const maxCharacterCount = maxCharConfig?.value?.[0] ? Number(maxCharConfig.value[0]) : undefined;\n\n  const contentType = contentTypeConfig?.value?.[0]?.toUpperCase() ?? 'LONG';\n  const inputVariant: 'short' | 'long' = contentType.includes('SHORT') ? 'short' : 'long';\n\n  const textDetail = raw.answerDetails?.[0];\n  const placeholder = textDetail\n    ? (language && textDetail.translations?.[language]?.answerText) || textDetail.answerText\n    : undefined;\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.TEXTFIELD,\n    inputVariant,\n    ...(maxCharacterCount !== undefined ? { maxCharacterCount } : {}),\n    ...(placeholder ? { placeholder } : {}),\n  };\n}\n","import type { ApiQuestionSetting } from '../../../../internalTypes/apiQuestionSetting';\n\nexport function detectMatrixFormat(configs: ApiQuestionSetting[]): 'standard' | 'carousel' | 'dropdown' {\n  const configsString = JSON.stringify(configs).toUpperCase();\n  if (configsString.includes('CAROUSEL')) return 'carousel';\n  if (configsString.includes('DROPDOWN')) return 'dropdown';\n  return 'standard';\n}\n","import type { ApiMatrixSubQuestion, ApiQuestion } from '../../../../internalTypes';\n\nexport function resolveSubQuestionText(\n  sub: ApiMatrixSubQuestion | ApiQuestion,\n  language?: string,\n  isBipolar?: boolean\n): string {\n  const subQ = sub as ApiQuestion;\n  if (isBipolar && subQ.answerDetails && subQ.answerDetails.length >= 2) {\n    const leftText =\n      (language && subQ.answerDetails[0].translations?.[language]?.answerText) ||\n      subQ.answerDetails[0].answerText ||\n      '';\n    if (leftText) return leftText;\n  }\n\n  const rawText =\n    (language && sub.translations?.[language]?.questionText) ||\n    sub.questionText ||\n    (sub as ApiMatrixSubQuestion).answerText ||\n    '';\n\n  if (isBipolar && rawText.includes(':')) {\n    return rawText.split(':')[0].trim();\n  }\n  return rawText;\n}\n","import type { ApiMatrixSubQuestion, ApiQuestion } from '../../../../internalTypes';\nimport type { CfmMatrixStatementRow } from '../../../../types/cfmMatrix';\nimport { resolveSubQuestionText } from '../matrix/resolveStatementText';\nimport { mapAnswerLogic } from '../shared/mapAnswerLogic';\n\nfunction resolveOppositeStatementText(\n  sub: ApiMatrixSubQuestion | ApiQuestion,\n  language?: string,\n  isBipolar?: boolean\n): string | undefined {\n  const subQ = sub as ApiQuestion;\n  if (isBipolar && subQ.answerDetails && subQ.answerDetails.length >= 2) {\n    const rightText =\n      (language && subQ.answerDetails[1].translations?.[language]?.answerText) ||\n      subQ.answerDetails[1].answerText ||\n      '';\n    if (rightText) return rightText;\n  }\n\n  const matrixAdditional = (sub as ApiMatrixSubQuestion).additional;\n  const text =\n    (language && (sub.translations?.[language] as { description?: string })?.description) ||\n    (sub as ApiQuestion).description ||\n    matrixAdditional?.rightLabel ||\n    matrixAdditional?.rightStatement ||\n    matrixAdditional?.rightText;\n\n  if (typeof text === 'string' && text.trim() !== '') {\n    return text;\n  }\n\n  const rawText =\n    (language && sub.translations?.[language]?.questionText) ||\n    sub.questionText ||\n    (sub as ApiMatrixSubQuestion).answerText ||\n    '';\n\n  if (isBipolar && rawText.includes(':')) {\n    return rawText.split(':').slice(1).join(':').trim();\n  }\n\n  return undefined;\n}\n\nexport function buildCfmStatementRows(\n  question: ApiQuestion,\n  language?: string,\n  isBipolar?: boolean\n): CfmMatrixStatementRow[] {\n  const rowSrc =\n    (question.matrixRowQuestions?.length ?? 0) > 0\n      ? question.matrixRowQuestions\n      : question.childSurveyQuestions;\n\n  if (rowSrc && rowSrc.length > 0) {\n    return rowSrc\n      .filter(sub => sub.id)\n      .map(sub => {\n        const answerLogic = mapAnswerLogic(sub.controlConfig?.displayLogic);\n        const oppositeStatementText = resolveOppositeStatementText(sub, language, isBipolar);\n        return {\n          id: sub.id!,\n          statementText: resolveSubQuestionText(sub, language, isBipolar),\n          ...(oppositeStatementText ? { oppositeStatementText } : {}),\n          ...(answerLogic ? { answerLogic } : {}),\n        };\n      });\n  }\n\n  return (question.answerDetails ?? [])\n    .filter(a => !a.hidden && !a.additional?.isHintText)\n    .map((a, i) => ({\n      id: `row_${i}`,\n      statementText: (language && a.translations?.[language]?.answerText) || a.answerText || '',\n    }));\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport type { ScaleColumn } from '../../../../types/shared';\nimport { mapAnswerLogic } from '../shared/mapAnswerLogic';\nimport { resolveSubQuestionText } from './resolveStatementText';\n\nexport function buildScaleColumns(question: ApiQuestion, language?: string): ScaleColumn[] {\n  if (question.matrixColumnQuestions && question.matrixColumnQuestions.length > 0) {\n    return question.matrixColumnQuestions\n      .filter(sub => sub.id)\n      .map(sub => {\n        const label =\n          (language && sub.translations?.[language]?.answerText) ||\n          sub.answerText ||\n          resolveSubQuestionText(sub, language);\n        const answerLogic = mapAnswerLogic(sub.controlConfig?.displayLogic);\n        return {\n          id: sub.id!,\n          label,\n          ...(answerLogic ? { answerLogic } : {}),\n        };\n      });\n  }\n\n  return (question.answerDetails ?? [])\n    .filter(a => !a.hidden && !a.additional?.isHintText)\n    .map((a, i) => {\n      const label = (language && a.translations?.[language]?.answerText) || a.answerText || '';\n      const answerLogic = mapAnswerLogic(a.controlConfig?.displayLogic);\n      return {\n        id: a.id ?? `col_${i}`,\n        label,\n        ...(answerLogic ? { answerLogic } : {}),\n      };\n    });\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { CfmMatrixQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { QUESTION_CONFIG_KEY } from '../../../../constants/questionConfigKeys';\nimport { detectMatrixFormat } from '../shared/detectMatrixFormat';\nimport { buildCfmStatementRows } from './buildCfmStatementRows';\nimport { buildScaleColumns } from '../matrix/buildScaleColumns';\nimport { getConfigFlag, getConfigValue, hasNotApplicableOption } from '../shared/configUtils';\n\nexport function mapCfmMatrixQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  language?: string\n): CfmMatrixQuestion {\n  const configs = raw.questionConfigs ?? [];\n  const matrixTypeValue = getConfigValue(configs, QUESTION_CONFIG_KEY.MATRIX_TYPE)?.toLowerCase();\n  const statementLayout = matrixTypeValue === 'bipolar' ? 'bipolar' : 'likert';\n  const isBipolar = statementLayout === 'bipolar';\n\n  const statementRows = buildCfmStatementRows(raw, language, isBipolar);\n  const scaleColumns = buildScaleColumns(raw, language);\n\n  const gridLayout = detectMatrixFormat(configs);\n\n  const hasMultiConfig = configs.some(\n    c =>\n      c.key.includes('MULTI') ||\n      c.value?.[0]?.toUpperCase().includes('MULTI') ||\n      (c.key.includes('ANSWER') && c.value?.[0]?.toUpperCase().includes('MULTI')) ||\n      (c.key.includes('SELECT') && c.value?.[0]?.toUpperCase().includes('MULTI'))\n  );\n  const selectionMode = hasMultiConfig ? 'multiple' : 'single';\n\n  const transposeTable = getConfigFlag(configs, QUESTION_CONFIG_KEY.TRANSPOSE_TABLE);\n  const repeatColumnHeaders = getConfigFlag(configs, QUESTION_CONFIG_KEY.REPEAT_SCALE);\n\n  const notApplicable = hasNotApplicableOption(configs);\n\n  const effectiveTranspose = notApplicable ? false : transposeTable;\n\n  if (notApplicable) {\n    scaleColumns.push({ id: 'na', label: 'N/A' });\n  }\n\n  const showColumnHeaders =\n    getConfigValue(configs, QUESTION_CONFIG_KEY.ENABLE_SCALE)?.toLowerCase() !== 'false';\n\n  let scaleAnchorLabels: string[] | undefined;\n  if (statementLayout === 'bipolar') {\n    scaleAnchorLabels = (raw.answerDetails ?? [])\n      .filter(a => a.additional?.isHintText && !a.hidden)\n      .map(a => (language && a.translations?.[language]?.answerText) || a.answerText || '')\n      .filter(Boolean);\n    if (scaleAnchorLabels.length === 0) scaleAnchorLabels = undefined;\n  }\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.CFM_MATRIX,\n    statementRows,\n    scaleColumns,\n    statementLayout,\n    selectionMode,\n    gridLayout,\n    transposeTable: effectiveTranspose,\n    repeatColumnHeaders: !!repeatColumnHeaders,\n    hasNotApplicableOption: notApplicable,\n    showColumnHeaders,\n    ...(scaleAnchorLabels ? { scaleAnchorLabels } : {}),\n  };\n}\n","import { QUESTION_CONFIG_KEY } from '../../../../constants/questionConfigKeys';\nimport { API_STYLE_VALUE, DISPLAY_STYLE, type DisplayStyle } from '../../../../constants/displayStyles';\nimport { getConfigValue } from './configUtils';\n\nexport function detectDisplayStyle(\n  configs: { key: string; value?: string[] }[],\n  dataSubType?: string\n): DisplayStyle {\n  const allConfigValues = configs.map(c => c.value?.[0] || '').join(' ').toUpperCase();\n  const searchString = `${allConfigValues} ${(dataSubType || '').toUpperCase()}`;\n\n  let buttonType = getConfigValue(configs, QUESTION_CONFIG_KEY.BUTTON_TYPE)?.toLowerCase();\n  if (buttonType === API_STYLE_VALUE.RADIO.toLowerCase()) {\n    buttonType = DISPLAY_STYLE.STANDARD;\n  }\n\n  const knownStyles: DisplayStyle[] = [\n    DISPLAY_STYLE.EMOJI,\n    DISPLAY_STYLE.STAR,\n    DISPLAY_STYLE.STANDARD,\n    DISPLAY_STYLE.NUMBERED,\n    DISPLAY_STYLE.DROPDOWN,\n    DISPLAY_STYLE.SELECTBOX,\n    DISPLAY_STYLE.GRAPHICS,\n  ];\n  if (buttonType && knownStyles.includes(buttonType as DisplayStyle)) {\n    return buttonType as DisplayStyle;\n  }\n\n  if (\n    searchString.includes(API_STYLE_VALUE.EMOJI) ||\n    searchString.includes(API_STYLE_VALUE.CSAT) ||\n    searchString.includes(API_STYLE_VALUE.SMILEY) ||\n    searchString.includes(API_STYLE_VALUE.FACE)\n  ) {\n    return DISPLAY_STYLE.EMOJI;\n  }\n  if (searchString.includes(API_STYLE_VALUE.STAR)) return DISPLAY_STYLE.STAR;\n  if (searchString.includes(API_STYLE_VALUE.GRAPHIC) || searchString.includes(API_STYLE_VALUE.SLIDER)) {\n    return DISPLAY_STYLE.GRAPHICS;\n  }\n  if (searchString.includes(API_STYLE_VALUE.DROP)) return DISPLAY_STYLE.DROPDOWN;\n  if (searchString.includes(API_STYLE_VALUE.SELECT)) return DISPLAY_STYLE.SELECTBOX;\n  if (searchString.includes(API_STYLE_VALUE.RADIO)) return DISPLAY_STYLE.STANDARD;\n  if (searchString.includes(API_STYLE_VALUE.NUMBER)) return DISPLAY_STYLE.NUMBERED;\n\n  return DISPLAY_STYLE.STANDARD;\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport type { StatementRow } from '../../../../types/shared';\nimport { resolveSubQuestionText } from './resolveStatementText';\nimport { mapAnswerLogic } from '../shared/mapAnswerLogic';\n\nexport function buildSimpleStatementRows(\n  question: ApiQuestion,\n  language?: string\n): StatementRow[] {\n  const rowSrc =\n    (question.matrixRowQuestions?.length ?? 0) > 0\n      ? question.matrixRowQuestions\n      : question.childSurveyQuestions;\n\n  if (rowSrc && rowSrc.length > 0) {\n    return rowSrc\n      .filter(sub => sub.id)\n      .map(sub => {\n        const answerLogic = mapAnswerLogic(sub.controlConfig?.displayLogic);\n        return {\n          id: sub.id!,\n          statementText: resolveSubQuestionText(sub, language),\n          ...(answerLogic ? { answerLogic } : {}),\n        };\n      });\n  }\n\n  return (question.answerDetails ?? [])\n    .filter(a => !a.hidden && !a.additional?.isHintText)\n    .map((a, i) => ({\n      id: `row_${i}`,\n      statementText: (language && a.translations?.[language]?.answerText) || a.answerText || '',\n    }));\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport type { ScaleColumn } from '../../../../types/shared';\nimport { hasNotApplicableOption, hasReverseScaleOrder } from '../shared/configUtils';\n\nexport type ResolvedMatrixScaleOptions = {\n  scaleColumns: ScaleColumn[];\n  scaleAnchorLabels: string[];\n  hasNotApplicableOption: boolean;\n  reverseScaleOrder: boolean;\n};\n\nexport function resolveMatrixScaleOptions(\n  raw: ApiQuestion,\n  configs: { key: string; value?: string[] }[],\n  language: string | undefined,\n  scaleColumns: ScaleColumn[]\n): ResolvedMatrixScaleOptions {\n  const notApplicable = hasNotApplicableOption(configs);\n  const reverseScaleOrder = hasReverseScaleOrder(configs, raw);\n\n  let scaleAnchorLabels = (raw.answerDetails ?? [])\n    .filter(a => a.additional?.isHintText && !a.hidden)\n    .map(a => (language && a.translations?.[language]?.answerText) || a.answerText || '')\n    .filter(Boolean);\n\n  let resolvedColumns = scaleColumns;\n  if (reverseScaleOrder) {\n    resolvedColumns = [...scaleColumns].reverse();\n    scaleAnchorLabels = [...scaleAnchorLabels].reverse();\n  }\n\n  if (notApplicable) {\n    resolvedColumns = [...resolvedColumns, { id: 'na', label: 'N/A' }];\n  }\n\n  return {\n    scaleColumns: resolvedColumns,\n    scaleAnchorLabels,\n    hasNotApplicableOption: notApplicable,\n    reverseScaleOrder,\n  };\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { CsatQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { detectDisplayStyle } from '../shared/detectDisplayStyle';\nimport { detectMatrixFormat } from '../shared/detectMatrixFormat';\nimport { buildScaleColumns } from '../matrix/buildScaleColumns';\nimport { buildSimpleStatementRows } from '../matrix/buildSimpleStatementRows';\nimport { resolveMatrixScaleOptions } from '../matrix/resolveMatrixScaleOptions';\n\nexport function mapCsatQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  language?: string\n): CsatQuestion {\n  const configs = raw.questionConfigs ?? [];\n  const { scaleColumns, scaleAnchorLabels, hasNotApplicableOption, reverseScaleOrder } =\n    resolveMatrixScaleOptions(raw, configs, language, buildScaleColumns(raw, language));\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.CSAT_MATRIX,\n    statementRows: buildSimpleStatementRows(raw, language),\n    scaleColumns,\n    displayStyle: detectDisplayStyle(configs, raw.dataSubType),\n    hasNotApplicableOption,\n    reverseScaleOrder,\n    gridLayout: detectMatrixFormat(configs),\n    ...(scaleAnchorLabels.length > 0 ? { scaleAnchorLabels } : {}),\n  };\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { RatingMatrixQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { detectDisplayStyle } from '../shared/detectDisplayStyle';\nimport { detectMatrixFormat } from '../shared/detectMatrixFormat';\nimport { extractHintLabels } from '../labels/extractHintLabels';\nimport { buildScaleColumns } from '../matrix/buildScaleColumns';\nimport { buildSimpleStatementRows } from '../matrix/buildSimpleStatementRows';\nimport { resolveMatrixScaleOptions } from '../matrix/resolveMatrixScaleOptions';\n\nexport function mapRatingMatrixQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  language?: string\n): RatingMatrixQuestion {\n  const configs = raw.questionConfigs ?? [];\n  const { scaleColumns, scaleAnchorLabels, hasNotApplicableOption, reverseScaleOrder } =\n    resolveMatrixScaleOptions(raw, configs, language, buildScaleColumns(raw, language));\n\n  const { minLabel, maxLabel } = extractHintLabels(raw.answerDetails, language);\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.RATING_MATRIX,\n    statementRows: buildSimpleStatementRows(raw, language),\n    scaleColumns,\n    ...(minLabel ? { minLabel } : {}),\n    ...(maxLabel ? { maxLabel } : {}),\n    displayStyle: detectDisplayStyle(configs, raw.dataSubType),\n    hasNotApplicableOption,\n    reverseScaleOrder,\n    gridLayout: detectMatrixFormat(configs),\n    ...(scaleAnchorLabels.length > 0 ? { scaleAnchorLabels } : {}),\n  };\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport type { SliderMatrixStatementRow } from '../../../../types/sliderMatrix';\nimport { buildSimpleStatementRows } from '../matrix/buildSimpleStatementRows';\n\nexport function buildSliderMatrixRows(\n  question: ApiQuestion,\n  language?: string\n): SliderMatrixStatementRow[] {\n  const baseMin = Number(question.additional?.sliderMin ?? 0);\n  const baseMax = Number(question.additional?.sliderMax ?? 10);\n  const baseStep = Number(question.additional?.sliderStep ?? 1);\n\n  const rows = buildSimpleStatementRows(question, language);\n\n  return rows.map(row => ({\n    ...row,\n    min: Number.isFinite(baseMin) ? baseMin : 0,\n    max: Number.isFinite(baseMax) ? baseMax : 10,\n    step: Number.isFinite(baseStep) && baseStep > 0 ? baseStep : 1,\n  }));\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { SliderMatrixQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { buildSliderMatrixRows } from './buildSliderMatrixRows';\n\nexport function mapSliderMatrixQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  language?: string\n): SliderMatrixQuestion {\n  const configs = raw.questionConfigs || [];\n  const sliderConfig = configs.find(c => c.key === 'SLIDER_TICKS_AND_VALUES');\n  const childConfigs = sliderConfig?.childConfigs || [];\n\n  const rawMin = childConfigs.find(c => c.key === 'TICK_START')?.value?.[0];\n  const rawMax = childConfigs.find(c => c.key === 'TICK_END')?.value?.[0];\n  const rawStep = childConfigs.find(c => c.key === 'STEP_SIZE')?.value?.[0];\n  const rawTicks = sliderConfig?.value?.[0];\n\n  const min = rawMin !== undefined ? Number(rawMin) : 0;\n  const max = rawMax !== undefined ? Number(rawMax) : 10;\n  const step = rawStep !== undefined ? Number(rawStep) : 1;\n  const tickCount = rawTicks !== undefined ? Number(rawTicks) : 10;\n\n  const enrichedRaw = {\n    ...raw,\n    additional: {\n      ...raw.additional,\n      sliderMin: min,\n      sliderMax: max,\n      sliderStep: step,\n    },\n  };\n\n  const statementRows = buildSliderMatrixRows(enrichedRaw, language);\n\n  const scaleAnchorLabels = (raw.answerDetails || [])\n    .filter(a => a.additional?.isHintText)\n    .map(a => (language && a.translations?.[language]?.answerText) || a.answerText || '')\n    .filter(Boolean);\n\n  const getFlag = (keys: string[]) => {\n    for (const key of keys) {\n      const c = configs.find(x => x.key === key) || childConfigs.find(x => x.key === key);\n      if (c?.value?.length) {\n        return c.value[0]?.toString().toLowerCase() === 'true';\n      }\n    }\n    return false;\n  };\n\n  const isGraphics = configs\n    .find(c => c.key === 'SCALE_TYPE' || c.key === 'VIEW_VARIANT')\n    ?.value?.[0]\n    ?.toUpperCase()\n    .includes('GRAPHIC');\n\n  const enableInputBox = getFlag(['ENABLE_INPUT_BOX', 'SHOW_INPUT_BOX', 'INPUT_BOX', 'ENABLE_INPUT']);\n  const displayValues = getFlag(['SHOW_VALUE', 'DISPLAY_VALUES']);\n  const hasNotApplicableOption = getFlag(['NOT_APPLICABLE', 'NOT_APPLICABLE_OPTIONS']);\n\n  const answerOptions = (raw.answerDetails || [])\n    .filter(a => !a.additional?.isHintText && !a.hidden)\n    .map(a => a.translations?.[language || '']?.answerText || a.answerText || '');\n\n  const marks: SliderMatrixQuestion['ticks']['marks'] = [];\n  if (tickCount > 1) {\n    const markStep = (max - min) / (tickCount - 1);\n    for (let i = 0; i < tickCount; i++) {\n      const tickPosition = Number((min + i * markStep).toFixed(2));\n      const tickLabel = answerOptions[i] || tickPosition.toString();\n      marks.push({ tickPosition, tickLabel });\n    }\n  }\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.SLIDER_MATRIX,\n    statementRows,\n    ticks: {\n      count: tickCount,\n      marks,\n    },\n    enableInputBox,\n    displayValues,\n    hasNotApplicableOption,\n    sliderStyle: isGraphics ? 'graphics' : 'standard',\n    ...(scaleAnchorLabels.length > 0 ? { scaleAnchorLabels } : {}),\n  };\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport type { QuestionMedia } from '../../../../types/shared';\n\nexport function buildMediaConfig(question: ApiQuestion): QuestionMedia {\n  const add = question.additional ?? {};\n\n  let url = (add['mediaUrl'] as string | undefined) ?? (add['previewUrl'] as string | undefined);\n  let mimeType = add['mediaMimeType'] as string | undefined;\n  const title = add['title'] as string | undefined;\n\n  const assets = question.questionContainerAssets;\n  if (Array.isArray(assets) && assets.length > 0) {\n    const asset = assets[0];\n    if (asset.source || asset.previewImageUrl) {\n      url = asset.source || asset.previewImageUrl;\n    }\n    if (asset.type) {\n      if (asset.type === 'PHOTO' || asset.type === 'IMAGE') mimeType = 'image/*';\n      else if (asset.type === 'VIDEO') mimeType = 'video/*';\n      else mimeType = asset.type;\n    }\n  }\n\n  const configs = question.questionConfigs || [];\n  const alignConfig = configs.find(c => c.key === 'TEXT_AND_MEDIA_ALIGNMENT');\n  const sizeConfig = configs.find(c => c.key === 'TEXT_AND_MEDIA_SIZE');\n  const alignment = alignConfig?.value?.[0];\n  const size = sizeConfig?.value?.[0] ? Number(sizeConfig.value[0]) : undefined;\n\n  return {\n    ...(url ? { url } : {}),\n    ...(mimeType ? { mimeType } : {}),\n    ...(title ? { title } : {}),\n    ...(alignment ? { alignment } : {}),\n    ...(size !== undefined ? { size } : {}),\n  };\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { TextAndMediaQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { buildMediaConfig } from './buildMediaConfig';\n\nexport function mapTextAndMediaQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell\n): TextAndMediaQuestion {\n  const media = buildMediaConfig(raw);\n  const { containerMedia: _containerMedia, ...shellFields } = shell;\n\n  let questionText = shell.questionText;\n  if (Array.isArray(raw.answerDetails)) {\n    const headerDetail = raw.answerDetails.find(\n      d => d.additional?.textAndMediaFieldType === 'HEADER'\n    );\n    if (headerDetail?.answerText) {\n      questionText = headerDetail.answerText;\n    }\n  }\n\n  const hasMedia = Object.keys(media).length > 0;\n\n  return {\n    ...shellFields,\n    questionText,\n    type: QUESTION_TYPE.TEXT_AND_MEDIA,\n    ...(hasMedia ? { media } : {}),\n  };\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { FileUploadQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\n\nexport function mapFileUploadQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  language?: string\n): FileUploadQuestion {\n  const configs = raw.questionConfigs || [];\n\n  const uploadMessageDetail = raw.answerDetails?.find(\n    a => a.additional?.fieldType === 'UPLOAD_MESSAGE'\n  );\n  const uploadMessage =\n    (language && uploadMessageDetail?.translations?.[language]?.answerText) ||\n    uploadMessageDetail?.answerText ||\n    '';\n\n  const supportedConfig = configs.find(c => c.key === 'SUPPORTED_FILE_FORMAT');\n  const supportedFileFormats =\n    supportedConfig?.value?.map(ext => ext.toUpperCase().replace(/^\\./, '')) || [];\n\n  const maxFileCountConfig = configs.find(c => c.key === 'MAX_FILE_COUNT');\n  const maxFileCount = maxFileCountConfig?.value?.[0]\n    ? Number(maxFileCountConfig.value[0])\n    : undefined;\n\n  const fileSizeLimitConfig = configs.find(c => c.key === 'FILE_SIZE_LIMIT');\n  const sizeLimitId = fileSizeLimitConfig?.childConfigs?.find(\n    cc => cc.key === 'SIZE_LIMIT_ID'\n  )?.value?.[0];\n  const sizeFormatId = fileSizeLimitConfig?.childConfigs?.find(\n    cc => cc.key === 'SIZE_FORMAT_ID'\n  )?.value?.[0];\n\n  const fileSizeLimit = sizeLimitId ? Number(sizeLimitId) : undefined;\n  const fileSizeLimitType: 'PER_FILE' | 'IN_TOTAL' =\n    sizeFormatId === 'IN_TOTAL' ? 'IN_TOTAL' : 'PER_FILE';\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.FILE_UPLOAD,\n    supportedFileFormats,\n    fileSizeLimitType,\n    ...(uploadMessage ? { uploadMessage } : {}),\n    ...(maxFileCount !== undefined ? { maxFileCount } : {}),\n    ...(fileSizeLimit !== undefined ? { fileSizeLimit } : {}),\n  };\n}\n","import type { HeatmapRegion } from '../../../../types/heatmap';\n\nexport type ApiHeatmapRegion = {\n  id: string;\n  label?: string;\n  coordinateX: number;\n  coordinateY: number;\n  width: number;\n  height: number;\n  color?: string;\n};\n\nexport function buildHeatmapRegions(\n  apiRegions: ApiHeatmapRegion[],\n  imageWidth: number,\n  imageHeight: number\n): { regions: HeatmapRegion[]; referenceWidth: number; referenceHeight: number } {\n  const referenceWidth =\n    imageWidth > 0\n      ? imageWidth\n      : Math.max(...apiRegions.map(region => region.coordinateX + region.width), 1);\n\n  const referenceHeight =\n    imageHeight > 0\n      ? imageHeight\n      : Math.max(...apiRegions.map(region => region.coordinateY + region.height), 1);\n\n  const regions: HeatmapRegion[] = apiRegions.map(region => ({\n    id: region.id,\n    label: region.label ?? region.id,\n    x: region.coordinateX / referenceWidth,\n    y: region.coordinateY / referenceHeight,\n    width: region.width / referenceWidth,\n    height: region.height / referenceHeight,\n    ...(region.color ? { color: region.color } : {}),\n  }));\n\n  return { regions, referenceWidth, referenceHeight };\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { HeatmapQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { buildHeatmapRegions } from './buildHeatmapRegions';\n\nexport function mapHeatmapQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell\n): HeatmapQuestion {\n  const metadata = raw.surveyHeatmapMetadata;\n  const asset = raw.questionAssets?.[0];\n  const imageUrl = asset?.source || asset?.previewImageUrl || '';\n\n  const rawMax = metadata?.totalClickAllowed ?? 20;\n  const maxClicksAllowed = Math.min(20, Math.max(1, rawMax));\n\n  const { regions, referenceWidth, referenceHeight } = buildHeatmapRegions(\n    metadata?.heatmapRegions ?? [],\n    metadata?.imageWidth ?? 0,\n    metadata?.imageHeight ?? 0\n  );\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.HEATMAP,\n    imageUrl,\n    regions,\n    maxClicksAllowed,\n    referenceWidth,\n    referenceHeight,\n  };\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport { mapAnswerLogic } from '../shared/mapAnswerLogic';\n\nexport function buildRankOrderOptions(\n  question: ApiQuestion,\n  language?: string\n): {\n  id: string;\n  optionLabel: string;\n  imageUrl?: string;\n  previewImageUrl?: string;\n  answerLogic?: ReturnType<typeof mapAnswerLogic>;\n}[] {\n  return (question.answerDetails ?? [])\n    .filter(answer => !answer.hidden && !answer.additional?.isHintText)\n    .map((answer, index) => {\n      const answerLogic = mapAnswerLogic(answer.controlConfig?.displayLogic);\n      const asset = answer.answerAsset;\n      const imageUrl = asset?.source || asset?.previewImageUrl;\n      const previewImageUrl = asset?.previewImageUrl || asset?.source;\n\n      return {\n        id: answer.id ?? String(index),\n        optionLabel:\n          (language && answer.translations?.[language]?.answerText) || answer.answerText || '',\n        ...(imageUrl ? { imageUrl } : {}),\n        ...(previewImageUrl ? { previewImageUrl } : {}),\n        ...(answerLogic ? { answerLogic } : {}),\n      };\n    });\n}\n","import type {\n  RankOrderInteractionMode,\n  RankOrderOptionDisplay,\n  RankOrderQuestion,\n} from '../../../../types/index';\nimport { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { ApiQuestion, ApiQuestionSetting } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport {\n  applyChoiceRandomization,\n  parseChoiceRandomization,\n} from '../shared/choiceRandomization';\nimport { buildRankOrderOptions } from './buildRankOrderOptions';\n\nfunction parseBooleanConfig(configs: ApiQuestionSetting[], key: string): boolean {\n  return configs.find(config => config.key === key)?.value?.[0]?.toLowerCase() === 'true';\n}\n\nfunction mapInteractionMode(rawValue: string | undefined): RankOrderInteractionMode {\n  if (rawValue?.toUpperCase() === 'DRAG_AND_DROP') {\n    return 'dragAndDrop';\n  }\n  return 'dropdown';\n}\n\nfunction mapOptionDisplay(rawValue: string | undefined): RankOrderOptionDisplay {\n  switch (rawValue?.toUpperCase()) {\n    case 'TEXT_ONLY':\n      return 'textOnly';\n    case 'IMAGE_ONLY':\n      return 'imageOnly';\n    case 'TEXT_AND_IMAGE':\n    default:\n      return 'textAndImage';\n  }\n}\n\nexport function mapRankOrderQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  configs: ApiQuestionSetting[],\n  language?: string\n): RankOrderQuestion {\n  const answerTypeConfig = configs.find(config => config.key === 'RANK_ORDER_ANSWER_TYPE');\n  const optionTypeConfig = configs.find(config => config.key === 'OPTION_TYPE');\n\n  const builtOptions = buildRankOrderOptions(raw, language);\n  const randomization = parseChoiceRandomization(configs);\n  const { options, shuffleOptions } = applyChoiceRandomization(builtOptions, randomization);\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.RANK_ORDER,\n    options,\n    interactionMode: mapInteractionMode(answerTypeConfig?.value?.[0]),\n    optionDisplay: mapOptionDisplay(optionTypeConfig?.value?.[0]),\n    requireRankAll: parseBooleanConfig(configs, 'REQUIRE_RANK_ALL'),\n    shuffleOptions,\n  };\n}\n","import type { ApiQuestion } from '../../../internalTypes';\nimport type { QuestionBeforeLogics } from './shared/questionMapperTypes';\nimport { QUESTION_TYPE } from '../../../constants/questionTypes';\nimport { mapMcqQuestion } from './mcq/mapMcqQuestion';\nimport { mapNpsQuestion } from './nps/mapNpsQuestion';\nimport { mapTextInputQuestion } from './textInput/mapTextInputQuestion';\nimport { mapCfmMatrixQuestion } from './cfmMatrix/mapCfmMatrixQuestion';\nimport { mapCsatQuestion } from './csat/mapCsatQuestion';\nimport { mapRatingMatrixQuestion } from './ratingMatrix/mapRatingMatrixQuestion';\nimport { mapSliderMatrixQuestion } from './sliderMatrix/mapSliderMatrixQuestion';\nimport { mapTextAndMediaQuestion } from './textAndMedia/mapTextAndMediaQuestion';\nimport { mapFileUploadQuestion } from './fileUpload/mapFileUploadQuestion';\nimport { mapHeatmapQuestion } from './heatmap/mapHeatmapQuestion';\nimport { mapRankOrderQuestion } from './rankOrder/mapRankOrderQuestion';\nimport type { ResolvedQuestionShell } from './shared/resolveQuestionShell';\n\ntype QuestionMapperContext = {\n  raw: ApiQuestion;\n  shell: ResolvedQuestionShell;\n  configs: { key: string; value?: string[] }[];\n  language?: string;\n};\n\ntype QuestionMapperFn = (ctx: QuestionMapperContext) => QuestionBeforeLogics;\n\nconst mapMcq: QuestionMapperFn = ({ raw, shell, language }) =>\n  mapMcqQuestion(raw, shell, language);\n\nconst mapNps: QuestionMapperFn = ({ raw, shell, configs, language }) =>\n  mapNpsQuestion(raw, shell, configs, language);\n\nconst mapTextInput: QuestionMapperFn = ({ raw, shell, configs, language }) =>\n  mapTextInputQuestion(raw, shell, configs, language);\n\nconst mapCfmMatrix: QuestionMapperFn = ({ raw, shell, language }) =>\n  mapCfmMatrixQuestion(raw, shell, language);\n\nconst mapCsatMatrix: QuestionMapperFn = ({ raw, shell, language }) =>\n  mapCsatQuestion(raw, shell, language);\n\nconst mapRatingMatrix: QuestionMapperFn = ({ raw, shell, language }) =>\n  mapRatingMatrixQuestion(raw, shell, language);\n\nconst mapSliderMatrix: QuestionMapperFn = ({ raw, shell, language }) =>\n  mapSliderMatrixQuestion(raw, shell, language);\n\nconst mapTextAndMedia: QuestionMapperFn = ({ raw, shell }) =>\n  mapTextAndMediaQuestion(raw, shell);\n\nconst mapFileUpload: QuestionMapperFn = ({ raw, shell, language }) =>\n  mapFileUploadQuestion(raw, shell, language);\n\nconst mapHeatmap: QuestionMapperFn = ({ raw, shell }) => mapHeatmapQuestion(raw, shell);\n\nconst mapRankOrder: QuestionMapperFn = ({ raw, shell, configs, language }) =>\n  mapRankOrderQuestion(raw, shell, configs, language);\n\nexport const QUESTION_MAPPERS: Record<string, QuestionMapperFn> = {\n  [QUESTION_TYPE.MCQ]: mapMcq,\n  [QUESTION_TYPE.NPS_SCALE]: mapNps,\n  SCALE: mapNps,\n  [QUESTION_TYPE.TEXTFIELD]: mapTextInput,\n  [QUESTION_TYPE.CFM_MATRIX]: mapCfmMatrix,\n  [QUESTION_TYPE.CSAT_MATRIX]: mapCsatMatrix,\n  [QUESTION_TYPE.RATING_MATRIX]: mapRatingMatrix,\n  [QUESTION_TYPE.SLIDER_MATRIX]: mapSliderMatrix,\n  [QUESTION_TYPE.TEXT_AND_MEDIA]: mapTextAndMedia,\n  [QUESTION_TYPE.FILE_UPLOAD]: mapFileUpload,\n  [QUESTION_TYPE.HEATMAP]: mapHeatmap,\n  [QUESTION_TYPE.RANK_ORDER]: mapRankOrder,\n};\n\nexport function resolveQuestionMapper(answerType: string | undefined): QuestionMapperFn | undefined {\n  if (!answerType) return undefined;\n  return QUESTION_MAPPERS[answerType];\n}\n","import type { SurveyQuestion } from '../../../types/index';\nimport type { ApiQuestion } from '../../../internalTypes';\nimport { resolveQuestionShell } from './shared/resolveQuestionShell';\nimport { mapSkipLogics } from './shared/mapSkipLogics';\nimport { mapDisplayLogic } from './shared/mapDisplayLogic';\nimport { mapQuestionDisplayVariants } from './shared/mapQuestionDisplayVariants';\nimport { attachQuestionLogics } from './shared/attachQuestionLogics';\nimport type { QuestionBeforeLogics } from './shared/questionMapperTypes';\nimport { mapMcqQuestion } from './mcq/mapMcqQuestion';\nimport { logUnknownAnswerType } from '../../../logger/mapperLogger';\nimport { resolveQuestionMapper } from './registry';\n\nexport function mapQuestion(\n  raw: ApiQuestion,\n  language?: string,\n  placeholders?: Record<string, string>\n): SurveyQuestion {\n  const configs = raw.questionConfigs ?? [];\n  const shell = resolveQuestionShell(raw, configs, language, placeholders);\n  const skipLogics = mapSkipLogics(raw.controlConfig?.skipLogics);\n  const displayLogic = mapDisplayLogic(raw.controlConfig?.displayLogic);\n  const displayVariants = mapQuestionDisplayVariants(raw, language, placeholders);\n\n  const withLogics = (question: QuestionBeforeLogics): SurveyQuestion =>\n    attachQuestionLogics(question, skipLogics, displayLogic, displayVariants);\n\n  const mapper = resolveQuestionMapper(raw.answerType);\n  if (mapper) {\n    return withLogics(mapper({ raw, shell, configs, language }));\n  }\n\n  logUnknownAnswerType(raw.answerType, raw.id ?? shell.id);\n  return withLogics(mapMcqQuestion(raw, shell, language));\n}\n","import type { ApiCtaButton, ApiCtaConfig } from '../../../internalTypes';\nimport type { SpecialPageCtas, SurveyCtaButton, SurveyPageCtaConfig } from '../../../types/survey';\n\nexport type MapCtaButtonOptions = {\n  defaultLabel?: string;\n  defaultEnabled?: boolean;\n};\n\nexport function mapCtaButton(\n  api: ApiCtaButton | undefined,\n  language: string | undefined,\n  options: MapCtaButtonOptions = {}\n): SurveyCtaButton | undefined {\n  if (!api) return undefined;\n\n  const translation = language ? api.translations?.[language] : undefined;\n\n  const label =\n    translation?.buttonText?.trim() ||\n    api.buttonText?.trim() ||\n    options.defaultLabel?.trim() ||\n    '';\n\n  if (!label) return undefined;\n\n  const enabled = translation?.enabled ?? api.enabled ?? options.defaultEnabled ?? true;\n\n  const inputPlaceholder =\n    translation?.inputPlaceholder?.trim() || api.inputPlaceholder?.trim();\n\n  const ctaDescription =\n    translation?.ctaDescription?.trim() || api.ctaDescription?.trim();\n\n  return {\n    label,\n    enabled,\n    ...(api.url?.trim() ? { url: api.url.trim() } : {}),\n    ...(inputPlaceholder ? { inputPlaceholder } : {}),\n    ...(ctaDescription ? { ctaDescription } : {}),\n  };\n}\n\nexport function mapPageCtaConfig(\n  api: ApiCtaConfig | undefined,\n  language: string\n): SurveyPageCtaConfig | undefined {\n  if (!api) return undefined;\n\n  const next = mapCtaButton(api.next, language, { defaultLabel: 'Next' });\n  const previous = mapCtaButton(api.previous, language, { defaultLabel: 'Back' });\n\n  if (!next && !previous) return undefined;\n\n  return {\n    ...(next ? { next } : {}),\n    ...(previous ? { previous } : {}),\n  };\n}\n\nconst SPECIAL_PAGE_CTA_KEYS = [\n  'start',\n  'redirect',\n  'sendEmailResponse',\n  'resumptionNotification',\n  'reopenNotification',\n] as const satisfies ReadonlyArray<keyof SpecialPageCtas>;\n\nexport function mapSpecialPageCtas(\n  api: ApiCtaConfig | undefined,\n  language: string\n): SpecialPageCtas | undefined {\n  if (!api) return undefined;\n\n  const ctas: SpecialPageCtas = {};\n\n  const start =\n    mapCtaButton(api.others?.start, language) ??\n    mapCtaButton(api.start, language);\n  if (start) ctas.start = start;\n\n  for (const key of SPECIAL_PAGE_CTA_KEYS) {\n    if (key === 'start') continue;\n    const mapped = mapCtaButton(api.others?.[key], language);\n    if (mapped) ctas[key] = mapped;\n  }\n\n  return Object.keys(ctas).length > 0 ? ctas : undefined;\n}\n","import type { SurveyPage } from '../types/survey';\nimport type { ApiQuestion, ApiResponse } from '../internalTypes';\nimport { mapQuestion } from './mappers/question';\nimport { mapPageCtaConfig } from './mappers/survey/mapCtaButton';\n\n/**\n * Maps the raw DTO survey pages and their questions into UI-friendly structure.\n *\n * @param api The raw API response envelope containing survey DTO pages.\n * @param surveyLanguage The resolved target language.\n * @param placeholders Optional dictionary mapping placeholder keys to replacement values.\n * @returns Array of mapped SurveyPage objects.\n */\nexport function mapSurveyPages(\n  api: ApiResponse,\n  surveyLanguage: string,\n  placeholders?: Record<string, string>\n): SurveyPage[] {\n  const dto = api.cfmSurveyDTO;\n  if (!dto || !Array.isArray(dto.surveyPages)) {\n    return [];\n  }\n\n  return dto.surveyPages.map((page, index) => {\n    const questions = (page.questionHolders ?? [])\n      .map(holder => holder.question)\n      .filter((q): q is ApiQuestion => Boolean(q))\n      .map(q => mapQuestion(q, surveyLanguage, placeholders));\n\n    const cta = mapPageCtaConfig(page.ctaConfig, surveyLanguage);\n\n    return {\n      id: page.id ?? `page_${index}`,\n      title: page.title ?? `Page ${index + 1}`,\n      questions,\n      ...(cta ? { cta } : {}),\n    };\n  });\n}\n","import type { ApiResponse, ApiSpecialPage } from '../../../internalTypes';\nimport type { SpecialPage, SurveyPhaseFlags } from '../../../types/survey';\nimport { mapDisplayLogic } from '../question/shared/mapDisplayLogic';\nimport { mapSpecialPageCtas } from './mapCtaButton';\n\nfunction resolveSpecialPageText(\n  page: ApiSpecialPage | undefined,\n  language?: string\n): SpecialPage | undefined {\n  if (!page?.id || page.disabled) return undefined;\n\n  const translations = page.translations?.[language ?? ''];\n  const header =\n    translations?.headerRichText ||\n    translations?.header ||\n    page.headerRichText ||\n    page.header ||\n    page.title ||\n    '';\n\n  const description =\n    translations?.descriptionRichText ||\n    translations?.description ||\n    page.descriptionRichText ||\n    page.description;\n\n  const ctas = mapSpecialPageCtas(page.ctaConfig, language ?? '');\n  const ctaLabel = ctas?.start?.label;\n\n  if (!header.trim()) return undefined;\n\n  const displayLogic = mapDisplayLogic(page.controlConfig?.displayLogic);\n  const title = translations?.title || page.title;\n\n  return {\n    id: page.id,\n    header,\n    ...(title ? { title } : {}),\n    ...(description ? { description } : {}),\n    ...(ctaLabel ? { ctaLabel } : {}),\n    ...(ctas ? { ctas } : {}),\n    ...(page.disabled !== undefined ? { disabled: page.disabled } : {}),\n    ...(displayLogic ? { displayLogic } : {}),\n  };\n}\n\nexport function mapSpecialPages(api: ApiResponse, language?: string): {\n  introPage?: SpecialPage;\n  endPages: SpecialPage[];\n  pausedPage?: SpecialPage;\n  submittedPage?: SpecialPage;\n  expiredPage?: SpecialPage;\n  quotaFulfilledPage?: SpecialPage;\n} {\n  const dto = api.cfmSurveyDTO;\n  if (!dto) {\n    return { endPages: [] };\n  }\n\n  const endPages = (dto.endPages ?? [])\n    .map(page => resolveSpecialPageText(page, language))\n    .filter((page): page is SpecialPage => Boolean(page));\n\n  return {\n    introPage: resolveSpecialPageText(dto.introPage, language),\n    endPages,\n    pausedPage: resolveSpecialPageText(dto.pausedPage, language),\n    submittedPage: resolveSpecialPageText(dto.submittedPage, language),\n    expiredPage: resolveSpecialPageText(dto.expiredPage, language),\n    quotaFulfilledPage: resolveSpecialPageText(dto.quotaFulfilledPage, language),\n  };\n}\n\nexport function mapPhaseFlags(api: ApiResponse): SurveyPhaseFlags {\n  const dto = api.cfmSurveyDTO;\n  const statusPaused = dto?.status === 'PAUSED';\n\n  return {\n    expired: Boolean(api.expired),\n    alreadyFilled: Boolean(api.alreadyFilled || api.surveySubmitted),\n    quotaFulfilled: Boolean(api.quotaFulfilled),\n    paused: statusPaused,\n  };\n}\n\nexport function resolveInitialPhase(\n  survey: {\n    introPage?: SpecialPage;\n    phaseFlags: SurveyPhaseFlags;\n  }\n): import('../../../types/survey').SurveyPhase {\n  const { phaseFlags } = survey;\n\n  if (phaseFlags.expired) return { kind: 'expired' };\n  if (phaseFlags.quotaFulfilled) return { kind: 'quota_fulfilled' };\n  if (phaseFlags.alreadyFilled) return { kind: 'submitted' };\n  if (phaseFlags.paused) return { kind: 'paused' };\n  if (survey.introPage) return { kind: 'intro' };\n  return { kind: 'content', pageIndex: 0 };\n}\n","import type { Survey, SurveySession } from '../../../types';\nimport type { ApiQuestion, ApiResponse } from '../../../internalTypes';\nimport { decodeInstanceJwt } from '../../../../utils/decodeInstanceJwt';\nimport { extractSurveyLanguages } from '../../extractSurveyLanguages';\nimport { mapSurveyPages } from '../../mapSurveyPages';\nimport { mapPhaseFlags, mapSpecialPages } from './mapSpecialPages';\nimport { mapCtaButton } from './mapCtaButton';\n\nexport function extractQuestions(api: ApiResponse): ApiQuestion[] {\n  const surveyPages = api.cfmSurveyDTO?.surveyPages ?? [];\n  return surveyPages.flatMap(\n    page => page.questionHolders?.map(holder => holder.question).filter((q): q is ApiQuestion => Boolean(q)) ?? []\n  );\n}\n\nexport function extractSession(api: ApiResponse): SurveySession | null {\n  if (!api.instanceId?.trim()) return null;\n\n  const instanceId = api.instanceId.trim();\n  const jwtPayload = decodeInstanceJwt(instanceId);\n\n  return {\n    instanceId,\n    language: api.surveyLanguage ?? api.cfmSurveyDTO?.baseLanguage ?? 'en',\n    responseId: jwtPayload?.surveyResponseId,\n    ...(api.instanceCreatedTime !== undefined\n      ? { instanceCreatedTime: api.instanceCreatedTime }\n      : {}),\n  };\n}\n\nexport function resolveSurveyLanguage(api: ApiResponse, language?: string): string {\n  return language ?? api.surveyLanguage ?? api.cfmSurveyDTO?.baseLanguage ?? 'en';\n}\n\nexport function mapSurvey(api: ApiResponse, language?: string, placeholders?: Record<string, string>): Survey {\n  const surveyLanguage = resolveSurveyLanguage(api, language);\n  const languages = extractSurveyLanguages(api);\n  const pages = mapSurveyPages(api, surveyLanguage, placeholders);\n  const {\n    introPage,\n    endPages,\n    pausedPage,\n    submittedPage,\n    expiredPage,\n    quotaFulfilledPage,\n  } = mapSpecialPages(api, surveyLanguage);\n  const phaseFlags = mapPhaseFlags(api);\n  const submitCta = mapCtaButton(api.cfmSurveyDTO?.ctaConfig?.submit, surveyLanguage, {\n    defaultLabel: 'Submit',\n  });\n\n  return {\n    id: api.cfmSurveyDTO?.id ?? '',\n    language: surveyLanguage,\n    languages,\n    pages,\n    ...(submitCta ? { cta: { submit: submitCta } } : {}),\n    ...(introPage ? { introPage } : {}),\n    endPages,\n    ...(pausedPage ? { pausedPage } : {}),\n    ...(submittedPage ? { submittedPage } : {}),\n    ...(expiredPage ? { expiredPage } : {}),\n    ...(quotaFulfilledPage ? { quotaFulfilledPage } : {}),\n    phaseFlags,\n  };\n}\n","/** Minimal survey-ui-config types for CLI seed resolution (mirrors survey-wizard schema). */\n\nexport const QUESTION_TYPE_LITERALS = [\n  'MCQ',\n  'TEXTFIELD',\n  'NPS_SCALE',\n  'CFM_MATRIX',\n  'CSAT_MATRIX',\n  'RATING_MATRIX',\n  'SLIDER_MATRIX',\n  'FILE_UPLOAD',\n  'TEXT_AND_MEDIA',\n  'HEATMAP',\n  'RANK_ORDER',\n] as const;\n\nexport type QuestionTypeLiteral = (typeof QUESTION_TYPE_LITERALS)[number];\n\nexport interface LogoConfig {\n  fileName: string | null;\n  url?: string | null;\n}\n\nexport interface SurveyUiConfig {\n  version: string;\n  configuredAt?: string;\n  instanceId?: string;\n  surveyTypes: QuestionTypeLiteral[];\n  global: Record<string, unknown> & { logo?: LogoConfig };\n  questionTypes: Record<string, Record<string, unknown>>;\n  placeholders: Record<string, string>;\n  customFields?: Record<string, string>;\n  debug?: { enabled: boolean; sampleAnswers?: Record<string, unknown> };\n  partialSave?: { enabled: boolean; debounceMs?: number };\n  deploy: { target: 'aws' | 'vercel'; autoDeploy: boolean };\n}\n\nexport type SurveyUiConfigPartial = Partial<SurveyUiConfig> & {\n  global?: Record<string, unknown>;\n  questionTypes?: Record<string, Record<string, unknown>>;\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { buildSurveyUrl } from '../fetchSurvey/utils/url';\nimport { mapSurvey } from '../fetchSurvey/utils/mappers/survey/mapSurvey';\nimport type { ApiResponse } from '../fetchSurvey/internalTypes';\nimport type { QuestionTypeLiteral } from './ui-config-types';\nimport { QUESTION_TYPE_LITERALS } from './ui-config-types';\n\nfunction parseEnvFile(content: string): Record<string, string> {\n  const out: Record<string, string> = {};\n  for (const line of content.split('\\n')) {\n    const trimmed = line.trim();\n    if (!trimmed || trimmed.startsWith('#')) continue;\n    const eq = trimmed.indexOf('=');\n    if (eq <= 0) continue;\n    const key = trimmed.slice(0, eq).trim();\n    let value = trimmed.slice(eq + 1).trim();\n    if (\n      (value.startsWith('\"') && value.endsWith('\"')) ||\n      (value.startsWith(\"'\") && value.endsWith(\"'\"))\n    ) {\n      value = value.slice(1, -1);\n    }\n    out[key] = value;\n  }\n  return out;\n}\n\nfunction loadEnvVars(projectRoot: string): Record<string, string> {\n  const merged: Record<string, string> = { ...process.env } as Record<string, string>;\n  for (const file of ['.env', '.env.local']) {\n    const abs = path.join(projectRoot, file);\n    if (!fs.existsSync(abs)) continue;\n    Object.assign(merged, parseEnvFile(fs.readFileSync(abs, 'utf8')));\n  }\n  return merged;\n}\n\nexport function resolveInstanceIdFromEnv(\n  projectRoot: string,\n  override?: string,\n): string | null {\n  if (override?.trim()) return override.trim();\n  const env = loadEnvVars(projectRoot);\n  const id =\n    env.VITE_CFM_INSTANCE_ID?.trim() ||\n    env.NEXT_PUBLIC_CFM_INSTANCE_ID?.trim() ||\n    env.CFM_INSTANCE_ID?.trim();\n  return id || null;\n}\n\nexport function extractSurveyDisplayName(api: ApiResponse): string | null {\n  const name = api.cfmSurveyDTO?.name?.trim();\n  return name || null;\n}\n\nexport function extractSurveyTypesFromSurvey(\n  survey: ReturnType<typeof mapSurvey>,\n): QuestionTypeLiteral[] {\n  const types = new Set<QuestionTypeLiteral>();\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      const t = question.type;\n      if ((QUESTION_TYPE_LITERALS as readonly string[]).includes(t)) {\n        types.add(t as QuestionTypeLiteral);\n      }\n    }\n  }\n  return [...types].sort();\n}\n\nexport interface FetchSurveyInventoryResult {\n  instanceId: string;\n  surveyTypes: QuestionTypeLiteral[];\n}\n\nexport async function fetchSurveyTypesFromEnv(\n  projectRoot: string,\n  instanceIdOverride?: string,\n): Promise<FetchSurveyInventoryResult> {\n  const { instanceId, survey } = await fetchSurveyFromEnv(projectRoot, instanceIdOverride);\n  const surveyTypes = extractSurveyTypesFromSurvey(survey);\n\n  if (!surveyTypes.length) {\n    throw new Error('Survey fetch returned no question types — check instance ID');\n  }\n\n  return { instanceId, surveyTypes };\n}\n\nexport interface FetchSurveyResult {\n  instanceId: string;\n  survey: ReturnType<typeof mapSurvey>;\n  apiResponse: ApiResponse;\n}\n\nexport async function fetchSurveyFromEnv(\n  projectRoot: string,\n  instanceIdOverride?: string,\n): Promise<FetchSurveyResult> {\n  const instanceId = resolveInstanceIdFromEnv(projectRoot, instanceIdOverride);\n  if (!instanceId) {\n    throw new Error(\n      'no instance ID in env — paste JWT into .env (VITE_CFM_INSTANCE_ID) or .env.local (NEXT_PUBLIC_CFM_INSTANCE_ID). Fix: instance-id-quick-wire.md',\n    );\n  }\n\n  const url = buildSurveyUrl(instanceId);\n  let response: Response;\n  try {\n    response = await fetch(url, {\n      method: 'GET',\n      headers: { Accept: 'application/json' },\n    });\n  } catch (err) {\n    const msg = err instanceof Error ? err.message : String(err);\n    throw new Error(`Survey fetch network error: ${msg}`);\n  }\n\n  if (!response.ok) {\n    throw new Error(\n      `Survey fetch failed (${response.status}) — check JWT is fresh. Fix: instance-id-quick-wire.md`,\n    );\n  }\n\n  const apiResponse = (await response.json()) as ApiResponse;\n  const survey = mapSurvey(apiResponse);\n  return { instanceId, survey, apiResponse };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Survey, SurveyQuestion } from '../fetchSurvey/types/survey';\nimport type {\n  LogicFilterGroup,\n  LogicFilterLeaf,\n  LogicFilterNode,\n} from '../fetchSurvey/types/logic';\nimport { QUESTION_TYPE } from '../fetchSurvey/constants/questionTypes';\nimport {\n  detectFramework,\n  resolveSdkPackageName,\n  type AgentFramework,\n} from './detect-framework';\nimport { extractSurveyTypesFromSurvey } from './fetch-survey-inventory';\n\nconst PLACEHOLDER_RE = /\\{\\{([^}]+)\\}\\}/g;\nconst CUSTOM_FIELD_ID_RE = /_c_[a-f0-9]+/gi;\n\nexport interface FrameworkSection {\n  framework: AgentFramework;\n  packageName: string | undefined;\n  frameworkLine: string;\n  packageLine: string;\n}\n\nexport interface ComponentInventoryRow {\n  componentFile: string;\n  requiredIf: string;\n  blocking?: boolean;\n}\n\nexport interface MatrixVariantRow {\n  questionId: string;\n  type: string;\n  displayStyle: string;\n  statementLayout: string;\n  transposeTable: string;\n  selectionMode: string;\n}\n\nexport interface CustomFieldRow {\n  id: string;\n  usedIn: string;\n}\n\nexport interface PlaceholderRow {\n  token: string;\n  key: string;\n  questionIds: string;\n}\n\nexport interface LogicInventoryRow {\n  questionId: string;\n  skipLogics: string;\n  displayLogic: string;\n  answerLogic: string;\n  customFieldRefs: string;\n}\n\nfunction isLogicGroup(node: LogicFilterNode): node is LogicFilterGroup {\n  return 'filters' in node && Array.isArray((node as LogicFilterGroup).filters);\n}\n\nfunction collectCustomFieldIdsFromLogic(nodes: LogicFilterNode[] | undefined, out: Set<string>): void {\n  if (!nodes) return;\n  for (const node of nodes) {\n    if (isLogicGroup(node)) {\n      collectCustomFieldIdsFromLogic(node.filters, out);\n      continue;\n    }\n    const leaf = node as LogicFilterLeaf;\n    const entity = leaf.details?.conditionEntity;\n    if (entity?.entityType === 'CUSTOM_FIELD') {\n      out.add(entity.id);\n    }\n  }\n}\n\nfunction collectCustomFieldIdsFromText(text: string | undefined, out: Set<string>): void {\n  if (!text) return;\n  const matches = text.match(CUSTOM_FIELD_ID_RE);\n  if (matches) {\n    for (const m of matches) out.add(m.toLowerCase() === m ? m : m);\n  }\n}\n\nfunction hasAnswerLogicOnQuestion(question: SurveyQuestion): boolean {\n  if (question.type === QUESTION_TYPE.MCQ || question.type === QUESTION_TYPE.RANK_ORDER) {\n    if (question.options?.some(o => o.answerLogic)) return true;\n  }\n  if ('statementRows' in question && question.statementRows?.some(r => r.answerLogic)) return true;\n  if ('scaleColumns' in question && question.scaleColumns?.some(c => c.answerLogic)) return true;\n  return false;\n}\n\nfunction matrixDisplayStyle(question: SurveyQuestion): string {\n  if ('displayStyle' in question && question.displayStyle) {\n    return String(question.displayStyle);\n  }\n  if ('gridLayout' in question) {\n    return question.gridLayout === 'dropdown' ? 'dropdown' : 'standard';\n  }\n  return '—';\n}\n\nconst COMPONENT_BY_TYPE: Record<string, { file: string; label: string; blocking?: boolean }[]> = {\n  [QUESTION_TYPE.CFM_MATRIX]: [{ file: 'LikertMatrixScale.tsx', label: 'CFM_MATRIX' }],\n  [QUESTION_TYPE.CSAT_MATRIX]: [{ file: 'CsatMatrixScale.tsx', label: 'CSAT_MATRIX or RATING_MATRIX' }],\n  [QUESTION_TYPE.RATING_MATRIX]: [{ file: 'CsatMatrixScale.tsx', label: 'CSAT_MATRIX or RATING_MATRIX' }],\n  [QUESTION_TYPE.SLIDER_MATRIX]: [\n    { file: 'SliderMatrixScale.tsx', label: 'SLIDER_MATRIX', blocking: true },\n    { file: 'CustomSliderTrack.tsx', label: 'SLIDER_MATRIX or matrix graphics' },\n  ],\n  [QUESTION_TYPE.FILE_UPLOAD]: [\n    { file: 'FileUploadScale.tsx', label: 'FILE_UPLOAD', blocking: true },\n  ],\n  [QUESTION_TYPE.NPS_SCALE]: [{ file: 'RatingScale.tsx', label: 'NPS_SCALE' }],\n  [QUESTION_TYPE.HEATMAP]: [\n    { file: 'HeatmapScale.tsx', label: 'HEATMAP' },\n    { file: 'lib/surveyUi/heatmapCoords.ts', label: 'HEATMAP' },\n  ],\n  [QUESTION_TYPE.RANK_ORDER]: [{ file: 'RankOrderScale.tsx', label: 'RANK_ORDER' }],\n};\n\nexport function surveyHasMcqOtherOption(survey: Survey): boolean {\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      if (question.type !== QUESTION_TYPE.MCQ || !('options' in question)) continue;\n      if (question.options?.some((o) => o.otherOption)) return true;\n    }\n  }\n  return false;\n}\n\nconst MCQ_OTHER_PICKER_CONTENT_TYPES = new Set(['PHONE_NUMBER', 'POSTAL_CODE', 'DATE']);\n\nexport function surveyHasMcqOtherPickerTypes(survey: Survey): boolean {\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      if (question.type !== QUESTION_TYPE.MCQ || !('options' in question)) continue;\n      for (const option of question.options ?? []) {\n        const contentType = option.otherOption?.contentType;\n        if (contentType && MCQ_OTHER_PICKER_CONTENT_TYPES.has(contentType)) return true;\n      }\n    }\n  }\n  return false;\n}\n\nexport function extractFrameworkSection(projectRoot: string): FrameworkSection {\n  const pkgPath = path.join(projectRoot, 'package.json');\n  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as {\n    dependencies?: Record<string, string>;\n    devDependencies?: Record<string, string>;\n  };\n  const framework = detectFramework(pkg);\n  const packageName = resolveSdkPackageName(pkg);\n\n  const checks: Record<AgentFramework, string> = {\n    nextjs: '[x] Next.js App Router  [ ] Vite  [ ] CRA  [ ] Existing app',\n    vite: '[ ] Next.js App Router  [x] Vite  [ ] CRA  [ ] Existing app',\n    cra: '[ ] Next.js App Router  [ ] Vite  [x] CRA  [ ] Existing app',\n    unknown: '[ ] Next.js App Router  [ ] Vite  [ ] CRA  [x] Existing app',\n  };\n\n  return {\n    framework,\n    packageName,\n    frameworkLine: `- **Framework:** ${checks[framework]}`,\n    packageLine: `- **Package import name:** ${packageName ?? '(add @explorer02/cfm-survey-sdk or @repo/sdk)'}`,\n  };\n}\n\nexport function extractComponentInventory(survey: Survey): ComponentInventoryRow[] {\n  const types = new Set(extractSurveyTypesFromSurvey(survey));\n  const rows: ComponentInventoryRow[] = [\n    { componentFile: 'IntroPage.tsx', requiredIf: 'intro page' },\n    { componentFile: 'EndPage.tsx', requiredIf: 'end pages' },\n    { componentFile: 'PausedPage.tsx', requiredIf: survey.pausedPage ? 'paused flag' : 'paused flag (if enabled)' },\n  ];\n\n  const seen = new Set<string>();\n  for (const type of types) {\n    const entries = COMPONENT_BY_TYPE[type];\n    if (!entries) continue;\n    for (const entry of entries) {\n      const key = `${entry.file}:${entry.label}`;\n      if (seen.has(key)) continue;\n      seen.add(key);\n      rows.push({\n        componentFile: entry.file,\n        requiredIf: entry.label,\n        blocking: entry.blocking,\n      });\n    }\n  }\n\n  if (types.has(QUESTION_TYPE.NPS_SCALE) || [...types].some((t) => t.includes('MATRIX'))) {\n    rows.push({\n      componentFile: 'lib/surveyUi/scaleValues.ts + getAccentColor.ts',\n      requiredIf: 'NPS/matrix colors',\n    });\n  }\n  if (types.has(QUESTION_TYPE.CSAT_MATRIX) || types.has(QUESTION_TYPE.RATING_MATRIX)) {\n    rows.push({ componentFile: 'lib/surveyUi/icons.tsx', requiredIf: 'CSAT emoji/star' });\n  }\n\n  const hasDropdownMatrix = survey.pages.some((p) =>\n    p.questions.some(\n      (q) => 'gridLayout' in q && q.gridLayout === 'dropdown',\n    ),\n  );\n  if (hasDropdownMatrix) {\n    rows.push({ componentFile: 'MatrixDropdown.tsx', requiredIf: 'matrix dropdown/selectbox' });\n  }\n\n  return rows;\n}\n\nexport function extractMatrixVariants(survey: Survey): MatrixVariantRow[] {\n  const rows: MatrixVariantRow[] = [];\n  const matrixTypes = [\n    QUESTION_TYPE.CFM_MATRIX,\n    QUESTION_TYPE.CSAT_MATRIX,\n    QUESTION_TYPE.RATING_MATRIX,\n    QUESTION_TYPE.SLIDER_MATRIX,\n  ] as const;\n\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      if (!matrixTypes.includes(question.type as (typeof matrixTypes)[number])) continue;\n      rows.push({\n        questionId: question.id,\n        type: question.type,\n        displayStyle: matrixDisplayStyle(question),\n        statementLayout: 'statementLayout' in question ? String(question.statementLayout) : '—',\n        transposeTable: 'transposeTable' in question ? String(question.transposeTable) : '—',\n        selectionMode: 'selectionMode' in question ? String(question.selectionMode) : '—',\n      });\n    }\n  }\n  return rows;\n}\n\nexport function extractCustomFieldInventory(survey: Survey): CustomFieldRow[] {\n  const idToUses = new Map<string, Set<string>>();\n\n  const add = (id: string, use: string) => {\n    const normalized = id.startsWith('_c_') ? id : `_c_${id.replace(/^_c_/, '')}`;\n    const set = idToUses.get(normalized) ?? new Set<string>();\n    set.add(use);\n    idToUses.set(normalized, set);\n  };\n\n  const scanLogic = (nodes: LogicFilterNode[] | undefined, use: string) => {\n    const ids = new Set<string>();\n    collectCustomFieldIdsFromLogic(nodes, ids);\n    for (const id of ids) add(id, use);\n  };\n\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      if (question.skipLogics?.length) {\n        for (const sl of question.skipLogics) scanLogic(sl.condition.filters, 'skip');\n      }\n      if (question.displayLogic) scanLogic(question.displayLogic.condition.filters, 'display');\n      if (question.displayVariants?.length) {\n        for (const v of question.displayVariants) {\n          if (v.displayLogic) scanLogic(v.displayLogic.condition.filters, 'display-variant');\n          collectCustomFieldIdsFromText(v.questionText, new Set());\n          const textIds = new Set<string>();\n          collectCustomFieldIdsFromText(v.questionText, textIds);\n          for (const id of textIds) add(id, 'copy');\n        }\n      }\n      collectCustomFieldIdsFromText(question.questionText, new Set());\n      const copyIds = new Set<string>();\n      collectCustomFieldIdsFromText(question.questionText, copyIds);\n      collectCustomFieldIdsFromText(question.questionDescription, copyIds);\n      for (const id of copyIds) add(id, 'copy');\n\n      if (question.type === QUESTION_TYPE.MCQ || question.type === QUESTION_TYPE.RANK_ORDER) {\n        for (const opt of question.options) {\n          if (opt.answerLogic) scanLogic(opt.answerLogic.condition.filters, 'answer');\n        }\n      }\n      if ('statementRows' in question) {\n        for (const row of question.statementRows) {\n          if (row.answerLogic) scanLogic(row.answerLogic.condition.filters, 'answer');\n        }\n      }\n      if ('scaleColumns' in question) {\n        for (const col of question.scaleColumns) {\n          if (col.answerLogic) scanLogic(col.answerLogic.condition.filters, 'answer');\n        }\n      }\n    }\n  }\n\n  for (const endPage of survey.endPages) {\n    if (endPage.displayLogic) scanLogic(endPage.displayLogic.condition.filters, 'end');\n    const copyIds = new Set<string>();\n    collectCustomFieldIdsFromText(endPage.header, copyIds);\n    collectCustomFieldIdsFromText(endPage.description, copyIds);\n    for (const id of copyIds) add(id, 'copy');\n  }\n\n  return [...idToUses.entries()]\n    .sort(([a], [b]) => a.localeCompare(b))\n    .map(([id, uses]) => ({ id, usedIn: [...uses].sort().join(', ') }));\n}\n\nexport function extractLogicInventory(survey: Survey): LogicInventoryRow[] {\n  const rows: LogicInventoryRow[] = [];\n\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      const cfIds = new Set<string>();\n      if (question.skipLogics) {\n        for (const sl of question.skipLogics) collectCustomFieldIdsFromLogic(sl.condition.filters, cfIds);\n      }\n      if (question.displayLogic) {\n        collectCustomFieldIdsFromLogic(question.displayLogic.condition.filters, cfIds);\n      }\n      if (question.type === QUESTION_TYPE.MCQ || question.type === QUESTION_TYPE.RANK_ORDER) {\n        for (const opt of question.options) {\n          if (opt.answerLogic) collectCustomFieldIdsFromLogic(opt.answerLogic.condition.filters, cfIds);\n        }\n      }\n      if ('statementRows' in question) {\n        for (const row of question.statementRows) {\n          if (row.answerLogic) collectCustomFieldIdsFromLogic(row.answerLogic.condition.filters, cfIds);\n        }\n      }\n      if ('scaleColumns' in question) {\n        for (const col of question.scaleColumns) {\n          if (col.answerLogic) collectCustomFieldIdsFromLogic(col.answerLogic.condition.filters, cfIds);\n        }\n      }\n\n      const hasSkip = Boolean(question.skipLogics?.length);\n      const hasDisplay = Boolean(question.displayLogic);\n      const hasAnswer = hasAnswerLogicOnQuestion(question);\n\n      if (!hasSkip && !hasDisplay && !hasAnswer && cfIds.size === 0) continue;\n\n      rows.push({\n        questionId: question.id,\n        skipLogics: hasSkip ? 'yes' : '—',\n        displayLogic: hasDisplay ? 'yes' : '—',\n        answerLogic: hasAnswer ? 'yes' : '—',\n        customFieldRefs: cfIds.size ? [...cfIds].sort().join(', ') : '—',\n      });\n    }\n  }\n\n  return rows;\n}\n\nexport function extractPlaceholderTokens(survey: Survey): PlaceholderRow[] {\n  const tokenToQuestions = new Map<string, Set<string>>();\n\n  const scanText = (text: string | undefined, questionId: string) => {\n    if (!text) return;\n    let match: RegExpExecArray | null;\n    PLACEHOLDER_RE.lastIndex = 0;\n    while ((match = PLACEHOLDER_RE.exec(text)) !== null) {\n      const raw = match[1]?.trim();\n      if (!raw) continue;\n      const token = `{{${raw}}}`;\n      const set = tokenToQuestions.get(token) ?? new Set<string>();\n      set.add(questionId);\n      tokenToQuestions.set(token, set);\n    }\n  };\n\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      scanText(question.questionText, question.id);\n      scanText(question.questionDescription, question.id);\n      if (question.displayVariants) {\n        for (const v of question.displayVariants) scanText(v.questionText, question.id);\n      }\n    }\n  }\n\n  return [...tokenToQuestions.entries()]\n    .sort(([a], [b]) => a.localeCompare(b))\n    .map(([token, qids]) => {\n      const key = token.startsWith('{{_c_')\n        ? `CUSTOM_FIELD_VALUES['${token.slice(2, -2)}']`\n        : token.startsWith('{{SURVEY_QUESTION')\n          ? '(resolved in hook — render question.questionText as-is)'\n          : `SURVEY_PLACEHOLDERS.${token.slice(2, -2)}`;\n      return {\n        token,\n        key,\n        questionIds: [...qids].sort().join(', '),\n      };\n    });\n}\n\nexport function formatComponentTableRows(rows: ComponentInventoryRow[]): string {\n  return rows\n    .map((r) => {\n      const block = r.blocking ? ' **blocking**' : '';\n      return `| \\`${r.componentFile}\\` | ${r.requiredIf}${block} | |`;\n    })\n    .join('\\n');\n}\n\nexport function formatMatrixTableRows(rows: MatrixVariantRow[]): string {\n  if (!rows.length) return '| (no matrix questions in fetch) | | | | | | | |';\n  return rows\n    .map(\n      (r) =>\n        `| ${r.questionId} | ${r.type} | ${r.displayStyle} | ${r.statementLayout} | ${r.transposeTable} | ${r.selectionMode} | |`,\n    )\n    .join('\\n');\n}\n\nexport function formatCustomFieldTableRows(rows: CustomFieldRow[]): string {\n  if (!rows.length) return '| (no _c_ ids in fetch) | | | | | |';\n  return rows\n    .map((r) => `| ${r.id} | | ${r.usedIn} | | | |`)\n    .join('\\n');\n}\n\nexport function formatPlaceholderTableRows(rows: PlaceholderRow[]): string {\n  if (!rows.length) return '| (no {{TOKEN}} in fetch) | | | |';\n  return rows.map((r) => `| ${r.token} | ${r.key} | | ${r.questionIds} |`).join('\\n');\n}\n\nexport function formatLogicTableRows(rows: LogicInventoryRow[]): string {\n  if (!rows.length) return '| (no logic flags in fetch) | | | | |';\n  return rows\n    .map(\n      (r) =>\n        `| ${r.questionId} | ${r.skipLogics} | ${r.displayLogic} | ${r.answerLogic} | ${r.customFieldRefs} |`,\n    )\n    .join('\\n');\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Survey } from '../fetchSurvey/types/survey';\nimport { colors } from './const';\nimport { fetchSurveyFromEnv, extractSurveyTypesFromSurvey } from './fetch-survey-inventory';\nimport {\n  extractComponentInventory,\n  extractCustomFieldInventory,\n  extractFrameworkSection,\n  extractLogicInventory,\n  extractMatrixVariants,\n  extractPlaceholderTokens,\n  formatComponentTableRows,\n  formatCustomFieldTableRows,\n  formatLogicTableRows,\n  formatMatrixTableRows,\n  formatPlaceholderTableRows,\n  surveyHasMcqOtherOption,\n  surveyHasMcqOtherPickerTypes,\n} from './survey-inventory-extract';\nimport { printSurveyTypeInstallBlock } from './install-manifest';\n\nconst c = colors;\n\nfunction replaceSectionTable(\n  content: string,\n  sectionHeading: string,\n  tableHeaderPattern: RegExp,\n  newRows: string,\n): string {\n  const headingIdx = content.indexOf(sectionHeading);\n  if (headingIdx < 0) return content;\n\n  const afterHeading = content.slice(headingIdx);\n  const headerMatch = afterHeading.match(tableHeaderPattern);\n  if (!headerMatch || headerMatch.index === undefined) return content;\n\n  const tableStart = headingIdx + headerMatch.index + headerMatch[0].length;\n  const rest = content.slice(tableStart);\n  const nextSection = rest.search(/\\n## |\\n##\\d/);\n  const tableBodyEnd = nextSection >= 0 ? tableStart + nextSection : content.length;\n\n  const before = content.slice(0, tableStart);\n  const after = content.slice(tableBodyEnd);\n  const rows = newRows.endsWith('\\n') ? newRows : `${newRows}\\n`;\n  return `${before}\\n${rows}${after}`;\n}\n\nfunction patchFrameworkSection(content: string, projectRoot: string): string {\n  const { frameworkLine, packageLine } = extractFrameworkSection(projectRoot);\n  let out = content.replace(\n    /- \\*\\*Framework:\\*\\* \\[ \\] Next\\.js App Router.*\\n/,\n    `${frameworkLine}\\n`,\n  );\n  out = out.replace(\n    /- \\*\\*Package import name:\\*\\*.*\\n/,\n    `${packageLine}\\n`,\n  );\n  return out;\n}\n\nexport function patchImplementationPlan(\n  content: string,\n  projectRoot: string,\n  survey: Survey,\n): string {\n  let out = patchFrameworkSection(content, projectRoot);\n\n  out = replaceSectionTable(\n    out,\n    '## 3b. Required Component Files (from fetched survey)',\n    /\\| Component file \\| Required if survey contains \\| Created\\? \\|\\n\\|[-| ]+\\|\\n/,\n    formatComponentTableRows(extractComponentInventory(survey)),\n  );\n\n  out = replaceSectionTable(\n    out,\n    '## 3c. Matrix variant inventory (from fetched survey)',\n    /\\| questionId \\| type \\| displayStyle \\| statementLayout \\| transposeTable \\| selectionMode \\| Labels visible\\? \\|\\n\\|[-| ]+\\|\\n/,\n    formatMatrixTableRows(extractMatrixVariants(survey)),\n  );\n\n  const mcqOtherLine = `- **MCQ Other option in fetch:** ${surveyHasMcqOtherOption(survey) ? 'yes' : 'no'}`;\n  const mcqOtherPickersLine = `- **MCQ Other phone/postal/date pickers:** ${surveyHasMcqOtherPickerTypes(survey) ? 'yes — include react-international-phone react-datepicker date-fns in Phase 1 install' : 'no'}`;\n  if (out.includes('**MCQ Other option in fetch:**')) {\n    out = out.replace(/- \\*\\*MCQ Other option in fetch:\\*\\*.*\\n/, `${mcqOtherLine}\\n`);\n  } else {\n    out = out.replace(/(- \\*\\*instanceId:\\*\\*.*\\n)/, `$1${mcqOtherLine}\\n`);\n  }\n  if (out.includes('**MCQ Other phone/postal/date pickers:**')) {\n    out = out.replace(\n      /- \\*\\*MCQ Other phone\\/postal\\/date pickers:\\*\\*.*\\n/,\n      `${mcqOtherPickersLine}\\n`,\n    );\n  } else {\n    out = out.replace(\n      /(- \\*\\*MCQ Other option in fetch:\\*\\*.*\\n)/,\n      `$1${mcqOtherPickersLine}\\n`,\n    );\n  }\n\n  out = replaceSectionTable(\n    out,\n    '## 3d. Custom field inventory (mandatory when `_c_…` ids found)',\n    /\\| `_c_` id \\| fieldType \\| used in \\(skip\\/display\\/answer\\/end\\/copy token\\) \\| logic field \\(e\\.g\\. CASE_SENSITIVE_TEXT\\) \\| CRM value \\| populated in `lib\\/customFieldValues\\.ts`\\? \\|\\n\\|[-| ]+\\|\\n/,\n    formatCustomFieldTableRows(extractCustomFieldInventory(survey)),\n  );\n\n  out = replaceSectionTable(\n    out,\n    '## 3d-b. Placeholder inventory (from fetched question text)',\n    /\\| Token in fetch \\| Key in map \\| Example value \\| Question ids \\|\\n\\|[-| ]+\\|\\n/,\n    formatPlaceholderTableRows(extractPlaceholderTokens(survey)),\n  );\n\n  out = replaceSectionTable(\n    out,\n    '## 3e. Logic inventory (from fetched survey)',\n    /\\| questionId \\| skipLogics \\| displayLogic \\| answerLogic \\(options\\/rows\\/cols\\) \\| customField refs \\(`_c_…`\\) \\|\\n\\|[-| ]+\\|\\n/,\n    formatLogicTableRows(extractLogicInventory(survey)),\n  );\n\n  if (!out.includes('<!-- autofill:from-fetch -->')) {\n    out = out.replace(\n      '# Survey UI Implementation Plan\\n',\n      '# Survey UI Implementation Plan\\n\\n<!-- autofill:from-fetch -->\\n',\n    );\n  }\n\n  return out;\n}\n\nexport async function runFillImplementationPlan(options: {\n  projectRoot?: string;\n  instanceIdOverride?: string;\n  planPath?: string;\n}): Promise<{ planPath: string; surveyTypes: string[]; hasMcqOtherPickers: boolean }> {\n  const projectRoot = options.projectRoot ?? process.cwd();\n  const planPath = options.planPath ?? path.join(projectRoot, 'implementation_plan.md');\n\n  if (!fs.existsSync(planPath)) {\n    throw new Error(\n      `fill-implementation-plan: ${planPath} not found — copy survey-ui/implementation_plan.md to project root first`,\n    );\n  }\n\n  const { survey } = await fetchSurveyFromEnv(projectRoot, options.instanceIdOverride);\n  const surveyTypes = extractSurveyTypesFromSurvey(survey);\n  const original = fs.readFileSync(planPath, 'utf8');\n  const patched = patchImplementationPlan(original, projectRoot, survey);\n  fs.writeFileSync(planPath, patched, 'utf8');\n  return {\n    planPath,\n    surveyTypes,\n    hasMcqOtherPickers: surveyHasMcqOtherPickerTypes(survey),\n  };\n}\n\nexport async function fillImplementationPlanFromFetch(options: {\n  instanceIdOverride?: string;\n  projectRoot?: string;\n}): Promise<void> {\n  const projectRoot = options.projectRoot ?? process.cwd();\n  const { planPath, surveyTypes, hasMcqOtherPickers } = await runFillImplementationPlan({\n    instanceIdOverride: options.instanceIdOverride,\n    projectRoot,\n  });\n  console.log(`${c.green}✅ Patched ${planPath} from live fetch (§0, §3b–§3e)${c.reset}`);\n  printSurveyTypeInstallBlock(projectRoot, surveyTypes, hasMcqOtherPickers);\n  console.log(`${c.dim}Per-type docs: on-demand (verify failure)${c.reset}`);\n}\n","import { colors } from './const';\nimport { resolveSurveyDevUrl } from './detect-framework';\nimport { runFillImplementationPlan } from './fill-implementation-plan';\nimport { printSurveyTypeInstallBlock } from './install-manifest';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport { formatInput2BHandoffBlocks } from './workflow-prompts';\nimport { getErrorMessage } from '../types/shared';\n\nconst c = colors;\n\nexport interface SyncFromFetchOptions {\n  projectRoot?: string;\n  instanceIdOverride?: string;\n}\n\n/** INPUT 2 post-smoke: fill the implementation plan from the live fetch (§0, §3b–§3e). */\nexport async function runSyncFromFetch(options: SyncFromFetchOptions = {}): Promise<number> {\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n\n  console.log(`${c.bold}=== CFM SDK — sync-from-fetch ===${c.reset}`);\n  console.log(`${c.dim}Project: ${projectRoot}${c.reset}\\n`);\n\n  try {\n    const { planPath, surveyTypes, hasMcqOtherPickers } = await runFillImplementationPlan({\n      projectRoot,\n      instanceIdOverride: options.instanceIdOverride,\n    });\n    console.log(`${c.green}✅ Patched ${planPath} from live fetch (§0, §3b–§3e)${c.reset}`);\n\n    printSurveyTypeInstallBlock(projectRoot, surveyTypes, hasMcqOtherPickers);\n    console.log(\n      `${c.dim}Author a component for each fetched type — read its ui-spec first${c.reset}`,\n    );\n    const devUrl = resolveSurveyDevUrl(projectRoot);\n    console.log(`\\n${formatInput2BHandoffBlocks(devUrl)}\\n`);\n    console.log(`${c.dim}Next: npx cfm-sdk verify-build${c.reset}`);\n    return 0;\n  } catch (err: unknown) {\n    console.error(`\\n${c.red}❌ ${getErrorMessage(err)}${c.reset}`);\n    console.error(\n      `${c.dim}Fallback: npx cfm-sdk fill-implementation-plan --from-fetch${c.reset}`,\n    );\n    return 1;\n  }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { colors } from './const';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport {\n  formatInput5HandoffBlocks,\n  formatDeployTargetLabel,\n} from './workflow-prompts';\nimport type { DeployTargetLabel } from './workflow-prompts';\nimport {\n  readWorkflowState,\n  recordDeployConfirmed,\n} from './workflow-state';\nimport { fetchSurveyFromEnv } from './fetch-survey-inventory';\nimport { getErrorMessage } from '../types/shared';\n\nconst c = colors;\n\nexport const SURVEY_DEPLOY_CONFIG_FILE = 'survey-deploy-config.json';\nconst LEGACY_SURVEY_UI_CONFIG_FILE = 'survey-ui-config.json';\n\nexport type DeployTarget = DeployTargetLabel;\n\nfunction deployConfigPath(projectRoot: string): string {\n  return path.join(projectRoot, SURVEY_DEPLOY_CONFIG_FILE);\n}\n\nfunction legacyConfigPath(projectRoot: string): string {\n  return path.join(projectRoot, LEGACY_SURVEY_UI_CONFIG_FILE);\n}\n\n/** Resolve deploy config file — prefers survey-deploy-config.json, falls back to legacy name. */\nfunction resolveConfigFile(projectRoot: string): string {\n  const deployPath = deployConfigPath(projectRoot);\n  if (fs.existsSync(deployPath)) {\n    return deployPath;\n  }\n  const legacyPath = legacyConfigPath(projectRoot);\n  if (fs.existsSync(legacyPath)) {\n    return legacyPath;\n  }\n  return deployPath;\n}\n\n/** Read deploy.target from project-root survey-deploy-config.json (fixed path, no search). */\nexport function readDeployTarget(projectRoot: string): DeployTarget {\n  const abs = resolveConfigFile(projectRoot);\n  if (!fs.existsSync(abs)) {\n    throw new Error(\n      `${SURVEY_DEPLOY_CONFIG_FILE} not found — run npx cfm-sdk seed-phase5 first`,\n    );\n  }\n\n  const raw = JSON.parse(fs.readFileSync(abs, 'utf8')) as {\n    deploy?: { target?: string };\n  };\n  return raw.deploy?.target === 'vercel' ? 'vercel' : 'aws';\n}\n\n/** Patch deploy.target only — writes survey-deploy-config.json; migrates from legacy file if needed. */\nexport function writeDeployTarget(projectRoot: string, target: DeployTarget): string {\n  const outPath = deployConfigPath(projectRoot);\n  const legacyPath = legacyConfigPath(projectRoot);\n\n  let raw: Record<string, unknown> = { deploy: { target: 'aws', autoDeploy: false } };\n  if (fs.existsSync(outPath)) {\n    raw = JSON.parse(fs.readFileSync(outPath, 'utf8')) as Record<string, unknown>;\n  } else if (fs.existsSync(legacyPath)) {\n    raw = JSON.parse(fs.readFileSync(legacyPath, 'utf8')) as Record<string, unknown>;\n  }\n\n  const deploy = (raw.deploy as Record<string, unknown> | undefined) ?? {};\n  deploy.target = target;\n  if (deploy.autoDeploy === undefined) {\n    deploy.autoDeploy = false;\n  }\n\n  const next = {\n    deploy: {\n      target: deploy.target,\n      autoDeploy: deploy.autoDeploy,\n    },\n  };\n\n  fs.writeFileSync(outPath, `${JSON.stringify(next, null, 2)}\\n`, 'utf8');\n  return outPath;\n}\n\nexport interface GetDeployTargetOptions {\n  projectRoot?: string;\n}\n\nexport function runGetDeployTarget(options: GetDeployTargetOptions = {}): number {\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n  const target = readDeployTarget(projectRoot);\n  const label = formatDeployTargetLabel(target);\n\n  console.log(`${c.green}deploy.target:${c.reset} ${target}`);\n  console.log(`${c.dim}Platform: ${label} (from ${SURVEY_DEPLOY_CONFIG_FILE})${c.reset}`);\n  return 0;\n}\n\nexport interface SetDeployTargetOptions {\n  projectRoot?: string;\n  target?: string;\n  surveyId?: string;\n}\n\nexport async function runSetDeployTarget(options: SetDeployTargetOptions = {}): Promise<number> {\n  const raw = options.target?.toLowerCase().trim();\n  if (raw !== 'aws' && raw !== 'vercel') {\n    console.error(`${c.red}FAIL:${c.reset} Usage: npx cfm-sdk set-deploy-target aws|vercel`);\n    return 1;\n  }\n\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n\n  const state = readWorkflowState(projectRoot);\n  if (!state?.coreVerifyPassedAt) {\n    console.error(\n      `\\n${c.red}Core verify not recorded. Run npx cfm-sdk verify-build successfully before set-deploy-target.${c.reset}`,\n    );\n    return 1;\n  }\n\n  const configFile = writeDeployTarget(projectRoot, raw);\n  const label = formatDeployTargetLabel(raw);\n\n  try {\n    recordDeployConfirmed(projectRoot);\n  } catch (err: unknown) {\n    console.error(`\\n${c.red}${getErrorMessage(err)}${c.reset}`);\n    return 1;\n  }\n\n  console.log(\n    `${c.green}OK:${c.reset} Wrote deploy.target=${raw} (${label}) → ${configFile}`,\n  );\n\n  if (raw === 'aws') {\n    let surveyId = options.surveyId?.trim() || '<survey-id>';\n    const instanceId = process.env.CFM_INSTANCE_ID?.trim();\n    if (instanceId && surveyId === '<survey-id>') {\n      try {\n        const { survey } = await fetchSurveyFromEnv(projectRoot, instanceId);\n        surveyId = survey.id;\n      } catch {\n        // keep placeholder — create-distribution will show real ID if key missing\n      }\n    }\n    console.log(`\\n${formatInput5HandoffBlocks(surveyId)}\\n`);\n    console.log(\n      `${c.dim}After client pastes key: npx cfm-sdk create-distribution --s3-key=<key>${c.reset}`,\n    );\n  } else {\n    console.log(`${c.dim}After client confirms deploy yes: npx cfm-sdk deploy${c.reset}`);\n  }\n\n  return 0;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { fetchSurveyFromEnv } from './fetch-survey-inventory';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport { colors, DEFAULT_DISTRIBUTION_DASHBOARD_URL } from './const';\nimport { getErrorMessage } from '../types/shared';\nimport {\n  formatDistributionDoneHandoffBlocks,\n  formatInput5HandoffBlocks,\n} from './workflow-prompts';\nimport {\n  assertDistributionDeployAllowed,\n  recordDistributionS3Key,\n} from './workflow-state';\n\nconst c = colors;\nconst MAX_FILES = 500;\nconst MAX_FILE_BYTES = 52_428_800;\nconst REPORT_MAX_ATTEMPTS = 3;\nconst REPORT_RETRY_DELAY_MS = 2000;\n\nfunction requireEnv(name: string): string {\n  const value = process.env[name]?.trim();\n  if (!value) {\n    throw new Error(`Missing ${name}`);\n  }\n  return value.replace(/\\/+$/, '');\n}\n\nfunction resolveDashboardApi(): string {\n  return (\n    process.env.CFM_DASHBOARD_API?.trim() || DEFAULT_DISTRIBUTION_DASHBOARD_URL\n  ).replace(/\\/+$/, '');\n}\n\nfunction guessContentType(filePath: string): string {\n  const ext = path.extname(filePath).toLowerCase();\n  const map: Record<string, string> = {\n    '.html': 'text/html',\n    '.htm': 'text/html',\n    '.css': 'text/css',\n    '.js': 'application/javascript',\n    '.mjs': 'application/javascript',\n    '.json': 'application/json',\n    '.png': 'image/png',\n    '.jpg': 'image/jpeg',\n    '.jpeg': 'image/jpeg',\n    '.gif': 'image/gif',\n    '.svg': 'image/svg+xml',\n    '.webp': 'image/webp',\n    '.ico': 'image/x-icon',\n    '.woff': 'font/woff',\n    '.woff2': 'font/woff2',\n    '.ttf': 'font/ttf',\n    '.txt': 'text/plain',\n    '.xml': 'application/xml',\n    '.map': 'application/json',\n  };\n  return map[ext] || 'application/octet-stream';\n}\n\ntype DeployFile = { path: string; contentType: string; sizeBytes: number };\n\nfunction buildFileManifest(outDir: string): DeployFile[] {\n  const files: DeployFile[] = [];\n\n  function walk(dir: string) {\n    for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n      const full = path.join(dir, entry.name);\n      if (entry.isDirectory()) {\n        walk(full);\n        continue;\n      }\n      const rel = path.relative(outDir, full).split(path.sep).join('/');\n      const sizeBytes = fs.statSync(full).size;\n      if (sizeBytes <= 0 || sizeBytes > MAX_FILE_BYTES) {\n        throw new Error(`File size out of range: ${rel} (${sizeBytes} bytes)`);\n      }\n      files.push({\n        path: rel,\n        contentType: guessContentType(rel),\n        sizeBytes,\n      });\n    }\n  }\n\n  walk(outDir);\n  files.sort((a, b) => a.path.localeCompare(b.path));\n\n  if (files.length === 0) {\n    throw new Error(`No files found in ${outDir}`);\n  }\n  if (files.length > MAX_FILES) {\n    throw new Error(`${files.length} files exceeds API limit of ${MAX_FILES}`);\n  }\n  return files;\n}\n\ntype StartResponse = {\n  deployId: string;\n  s3Prefix: string;\n  uploads: Array<{ path: string; uploadUrl: string }>;\n};\n\ntype CompleteResponse = {\n  url: string;\n  deployId: string;\n  surveyId: string;\n  s3Prefix: string;\n  distributionS3Key?: string;\n};\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nasync function startDistributionUpload(\n  deployApiBase: string,\n  parentJwt: string,\n  s3Key: string,\n  files: DeployFile[],\n): Promise<StartResponse> {\n  const response = await fetch(`${deployApiBase}/deploy/start`, {\n    method: 'POST',\n    headers: {\n      Authorization: `Bearer ${parentJwt}`,\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ files, distributionS3Key: s3Key }),\n  });\n  const body = await response.json().catch(() => ({}));\n  if (!response.ok) {\n    throw new Error(\n      typeof body?.message === 'string' ? body.message : `Deploy API error (${response.status})`,\n    );\n  }\n  return body as StartResponse;\n}\n\nasync function uploadFiles(\n  outDir: string,\n  uploads: Array<{ path: string; uploadUrl: string }>,\n  manifest: DeployFile[],\n): Promise<void> {\n  const mimeByPath = new Map(manifest.map((f) => [f.path, f.contentType]));\n  const failed: string[] = [];\n\n  for (const item of uploads) {\n    const filePath = path.join(outDir, item.path);\n    const contentType = mimeByPath.get(item.path) || 'application/octet-stream';\n    const body = fs.readFileSync(filePath);\n\n    const response = await fetch(item.uploadUrl, {\n      method: 'PUT',\n      headers: { 'Content-Type': contentType },\n      body,\n    });\n\n    if (!response.ok) {\n      failed.push(item.path);\n    }\n  }\n\n  if (failed.length > 0) {\n    throw new Error(\n      `${failed.length} upload(s) failed (${failed.slice(0, 3).join(', ')}${failed.length > 3 ? '…' : ''}) — rerun create-distribution (presigned URLs expire)`,\n    );\n  }\n}\n\nasync function completeDistributionUpload(\n  deployApiBase: string,\n  parentJwt: string,\n  deployId: string,\n): Promise<CompleteResponse> {\n  const response = await fetch(`${deployApiBase}/deploy/complete`, {\n    method: 'POST',\n    headers: {\n      Authorization: `Bearer ${parentJwt}`,\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ deployId }),\n  });\n  const body = await response.json().catch(() => ({}));\n  if (!response.ok) {\n    throw new Error(\n      typeof body?.message === 'string' ? body.message : `Deploy API error (${response.status})`,\n    );\n  }\n  return body as CompleteResponse;\n}\n\nasync function reportToDashboardOnce(\n  dashboardApi: string,\n  payload: Record<string, unknown>,\n): Promise<{ ok: boolean; error?: string }> {\n  try {\n    const response = await fetch(`${dashboardApi}/api/distributions/report`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(payload),\n    });\n    if (!response.ok) {\n      const body = await response.json().catch(() => ({}));\n      return {\n        ok: false,\n        error: typeof body?.message === 'string' ? body.message : `HTTP ${response.status}`,\n      };\n    }\n    return { ok: true };\n  } catch (err) {\n    return { ok: false, error: getErrorMessage(err) };\n  }\n}\n\nasync function reportToDashboardWithRetries(\n  dashboardApi: string,\n  payload: Record<string, unknown>,\n): Promise<void> {\n  let lastError = 'unknown error';\n\n  for (let attempt = 1; attempt <= REPORT_MAX_ATTEMPTS; attempt += 1) {\n    const result = await reportToDashboardOnce(dashboardApi, payload);\n    if (result.ok) {\n      return;\n    }\n    lastError = result.error || lastError;\n    if (attempt < REPORT_MAX_ATTEMPTS) {\n      console.log(`  dashboard report attempt ${attempt} failed — retrying…`);\n      await sleep(REPORT_RETRY_DELAY_MS);\n    }\n  }\n\n  throw new Error(\n    `Dashboard sync failed after ${REPORT_MAX_ATTEMPTS} attempts (${lastError}). Re-run: cfm-sdk create-distribution --s3-key=${payload.s3Key}`,\n  );\n}\n\n/**\n * Upload the built static UI to a distribution path and sync status to the dashboard.\n *\n * The client generates the S3 key in the distribution dashboard; the agent uploads\n * OUT_DIR directly to sites/{surveyId}/distributions/{s3Key}/ and reports back.\n */\nexport async function runCreateDistribution(options: {\n  projectRoot?: string;\n  instanceIdOverride?: string;\n  s3Key?: string;\n}): Promise<number> {\n  try {\n    const projectRoot = options.projectRoot || resolveProjectRoot(process.cwd());\n    const deployApiBase = requireEnv('CFM_DEPLOY_API_BASE');\n    const outDir = process.env.OUT_DIR?.trim();\n\n    const instanceId =\n      options.instanceIdOverride?.trim() ||\n      process.env.CFM_INSTANCE_ID?.trim() ||\n      (() => {\n        throw new Error('Set CFM_INSTANCE_ID or pass --instance-id=');\n      })();\n\n    const s3Key = options.s3Key?.trim();\n    if (!s3Key) {\n      let surveyId = '<survey-id>';\n      try {\n        const instanceId =\n          options.instanceIdOverride?.trim() ||\n          process.env.CFM_INSTANCE_ID?.trim();\n        if (instanceId) {\n          const { survey } = await fetchSurveyFromEnv(projectRoot, instanceId);\n          surveyId = survey.id;\n        }\n      } catch {\n        // fall through with placeholder\n      }\n      console.error(\n        `\\n${formatInput5HandoffBlocks(surveyId)}\\n`,\n      );\n      return 1;\n    }\n\n    try {\n      assertDistributionDeployAllowed(projectRoot, s3Key);\n    } catch (err) {\n      console.error(`${c.red}${getErrorMessage(err)}${c.reset}`);\n      return 1;\n    }\n\n    if (!outDir) {\n      throw new Error('Missing OUT_DIR — set OUT_DIR to the absolute path of out/ or dist/');\n    }\n    if (!fs.existsSync(path.join(outDir, 'index.html'))) {\n      throw new Error(`Missing ${path.join(outDir, 'index.html')} — run build first`);\n    }\n\n    const { survey, apiResponse } = await fetchSurveyFromEnv(projectRoot, instanceId);\n    const surveyId = survey.id;\n    const surveyName = apiResponse.cfmSurveyDTO?.name?.trim() || surveyId;\n    const dashboardApi = resolveDashboardApi();\n\n    const manifest = buildFileManifest(outDir);\n\n    console.log(\n      `${c.cyan}→ Creating distribution${c.reset} for ${surveyName} (${surveyId}, s3Key: ${s3Key})`,\n    );\n    console.log(`  uploading ${manifest.length} files from ${outDir}…`);\n\n    const started = await startDistributionUpload(deployApiBase, instanceId, s3Key, manifest);\n    await uploadFiles(outDir, started.uploads, manifest);\n    console.log(`  uploads complete — finalizing deploy…`);\n\n    const completed = await completeDistributionUpload(\n      deployApiBase,\n      instanceId,\n      started.deployId,\n    );\n    const liveUrl = completed.url;\n\n    await reportToDashboardWithRetries(dashboardApi, {\n      surveyId,\n      surveyName,\n      s3Key,\n      status: 'deployed',\n      liveUrl,\n      jobId: started.deployId,\n    });\n\n    console.log(\n      `${c.green}✓ Dashboard updated${c.reset} (status: deployed, live URL set): ${dashboardApi}`,\n    );\n    console.log(`${c.green}✓ Distribution deployed${c.reset}: ${s3Key}`);\n    console.log(`\\n${formatDistributionDoneHandoffBlocks(liveUrl)}\\n`);\n    recordDistributionS3Key(projectRoot, s3Key);\n    return 0;\n  } catch (err) {\n    console.error(`${c.red}❌ create-distribution failed: ${getErrorMessage(err)}${c.reset}`);\n    return 1;\n  }\n}\n","import { colors } from './const';\nimport { checkNodeVersion } from './utils/nodeCheck';\nimport { checkVercelCli } from './utils/vercelCliCheck';\nimport { checkVercelLogin } from './utils/vercelLoginCheck';\nimport { runVercelDeploy } from './utils/vercelDeploy';\nimport { assertDeployAllowed } from './workflow-state';\nimport { resolveProjectRoot } from './resolve-project-root';\n\nexport async function runDeployment() {\n  assertDeployAllowed(resolveProjectRoot());\n\n  console.log(`\\n${colors.bold}${colors.cyan}🚀 Starting CFM Vercel Deployment...${colors.reset}\\n`);\n\n  await checkNodeVersion();\n  const { useNpx } = await checkVercelCli();\n  const hasToken = await checkVercelLogin(useNpx);\n  await runVercelDeploy(useNpx, hasToken);\n}\n","import { colors } from '../const';\nimport { hasCommand, runCommandSync } from './exec';\nimport { askQuestion } from './prompts';\n\nexport async function checkNodeVersion(): Promise<void> {\n  const majorVersion = parseInt(process.version.slice(1).split('.')[0], 10);\n  console.log(`${colors.dim}Step 1/4: Checking Node.js version (current: ${process.version})...${colors.reset}`);\n\n  if (majorVersion < 18) {\n    console.log(`⚠️  ${colors.yellow}Outdated Node.js version detected. v18.0.0 or higher is required.${colors.reset}`);\n    console.log(`${colors.dim}Note: If you already have a higher version installed via nvm, please run 'nvm use <version>' first.${colors.reset}\\n`);\n\n    const answer = await askQuestion(`Would you like to install/upgrade Node.js v18+ automatically? (y/N): `);\n    const installAutomatically = answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';\n\n    if (!installAutomatically) {\n      console.log(`\\n❌ ${colors.red}Aborted. Please manually upgrade Node.js to v18+ and try again.${colors.reset}\\n`);\n      process.exit(1);\n    }\n    \n    const isWin = process.platform === 'win32';\n    const isMac = process.platform === 'darwin';\n\n    if (isWin) {\n      if (hasCommand('winget')) {\n        console.log(`\\n📦 ${colors.green}winget package manager found! Installing Node.js v18+ in background...${colors.reset}`);\n        const success = runCommandSync('winget', ['upgrade', 'OpenJS.NodeJS', '--silent', '--accept-package-agreements', '--accept-source-agreements']);\n        if (success) {\n          console.log(`\\n✔ ${colors.green}Node.js installation triggered successfully. Please restart your terminal/command-prompt for changes to take effect.${colors.reset}\\n`);\n          process.exit(0);\n        } else {\n          console.log(`\\n❌ ${colors.red}winget update failed. Please update Node.js manually at https://nodejs.org/${colors.reset}\\n`);\n          process.exit(1);\n        }\n      } else {\n        console.log(`\\n❌ ${colors.red}winget package manager is not installed on this system.${colors.reset}`);\n        console.log(`${colors.bold}👉 To proceed, please either:${colors.reset}`);\n        console.log(`   1. Install winget (App Installer) from the Microsoft Store.`);\n        console.log(`   2. Or manually download and install Node.js (v18+) from: https://nodejs.org/\\n`);\n        process.exit(1);\n      }\n    } else if (isMac) {\n      if (hasCommand('brew')) {\n        console.log(`\\n📦 ${colors.green}Homebrew package manager found! Installing Node.js v18+ in background...${colors.reset}`);\n        const success = runCommandSync('brew', ['install', 'node']);\n        if (success) {\n          console.log(`\\n✔ ${colors.green}Node.js installed successfully via Homebrew.${colors.reset}\\n`);\n        } else {\n          console.log(`\\n❌ ${colors.red}Homebrew installation failed. Please install Node.js manually at https://nodejs.org/${colors.reset}\\n`);\n          process.exit(1);\n        }\n      } else {\n        console.log(`\\n❌ ${colors.red}Homebrew package manager (brew) is not installed on this system.${colors.reset}`);\n        console.log(`${colors.bold}👉 To proceed, please either:${colors.reset}`);\n        console.log(`   1. Install Homebrew by running the following command in your terminal:`);\n        console.log(`      ${colors.cyan}/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"${colors.reset}`);\n        console.log(`   2. Or manually download and install Node.js (v18+) from: https://nodejs.org/\\n`);\n        process.exit(1);\n      }\n    } else {\n      console.log(`\\n❌ ${colors.red}Please install or update Node.js to v18+ using your system's package manager.${colors.reset}\\n`);\n      process.exit(1);\n    }\n  } else {\n    console.log(`✔ ${colors.green}Node.js version (v${majorVersion}) is sufficient.${colors.reset}`);\n  }\n}\n","import readline from 'readline/promises';\nimport { stdin as input, stdout as output } from 'process';\n\nexport async function askQuestion(query: string): Promise<string> {\n  const rl = readline.createInterface({ input, output });\n  try {\n    return (await rl.question(query)).trim();\n  } finally {\n    rl.close();\n  }\n}\n// rl.question(query): Prints the question (query) to the screen and waits.\n// await: Pauses the program right here. \n// The execution is frozen until the user types their answer and hits the [Enter] key.\n// .trim(): Removes any accidental whitespace (spaces or tabs) \n// from the beginning or end of the user's input (e.g., \"  yes  \" becomes \"yes\").\n// rl.close() (Crucial Step):\n// Closes the keyboard read stream and frees up system resources.\n// Why it's in finally: If you do not close readline,\n//  Node.js will think you still want to listen to the keyboard,\n// and the terminal process will freeze/hang forever even after your script finishes. \n// Placing it in finally guarantees it closes even if an error occurs.","import { colors } from '../const';\nimport { askQuestion } from './prompts';\nimport { hasCommand, runCommandSync } from './exec';\n\nexport type VercelCliContext = {\n  vercelCmd: string;\n  useNpx: boolean;\n}\n\nexport async function checkVercelCli(): Promise<VercelCliContext> {\n  console.log(`\\n${colors.dim}Step 2/4: Checking Vercel CLI...${colors.reset}`);\n  let vercelCmd = 'vercel';\n  let useNpx = false;\n\n  if (!hasCommand('vercel')) {\n    console.log(`❓ ${colors.yellow}Vercel CLI was not found on your system.${colors.reset}`);\n    const answer = await askQuestion(`👉 Would you like to install Vercel CLI globally? (Y/n): `);\n\n    if (answer.toLowerCase() === 'y' || answer === '') {\n      console.log(`\\n📥 ${colors.cyan}Installing Vercel CLI globally... (npm install -g vercel)${colors.reset}`);\n      const success = runCommandSync('npm', ['install', '-g', 'vercel']);\n      if (success && hasCommand('vercel')) {\n        console.log(`✔ ${colors.green}Vercel CLI installed successfully!${colors.reset}`);\n      }\n      else {\n        console.log(`\\n⚠️  ${colors.yellow}Global installation failed or permissions restricted.${colors.reset}`);\n        console.log(`ℹ ${colors.dim}Falling back: Running Vercel dynamically via npx.${colors.reset}`);\n        vercelCmd = 'npx --yes vercel';\n        useNpx = true;\n      }\n    }\n    else {\n      console.log(`ℹ ${colors.dim}Skipping global installation. Running Vercel dynamically via npx.${colors.reset}`);\n      vercelCmd = 'npx --yes vercel';\n      useNpx = true;\n    }\n  } else {\n    console.log(`✔ ${colors.green}Vercel CLI is installed!${colors.reset}`);\n  }\n\n  return { vercelCmd, useNpx };\n}\n","import { execSync } from 'child_process';\nimport type { ExecSyncOptions } from 'child_process';\nimport { colors } from '../const';\nimport { askQuestion } from './prompts';\nimport { runCommandInteractive } from './exec';\n\nconst ignoreShellOptions: ExecSyncOptions = {\n  stdio: 'ignore',\n  shell: process.platform === 'win32' ? 'cmd.exe' : '/bin/sh',\n};\n\nexport async function checkVercelLogin(useNpx: boolean): Promise<boolean> {\n  console.log(`\\n${colors.dim}Step 3/4: Checking Vercel Login...${colors.reset}`);\n  \n  const hasToken = !!process.env.VERCEL_TOKEN;\n  let loggedIn = false;\n\n  if (hasToken) {\n    console.log(`✔ ${colors.green}VERCEL_TOKEN environment variable detected. Skipping login check.${colors.reset}`);\n    loggedIn = true;\n  } else {\n    try {\n      // Execute vercel whoami to check active session\n      const checkCmd = useNpx ? 'npx --yes vercel whoami' : 'vercel whoami';\n      execSync(checkCmd, ignoreShellOptions);\n      loggedIn = true;\n      console.log(`✔ ${colors.green}Logged in!${colors.reset}`);\n    } catch {\n      loggedIn = false;\n    }\n  }\n\n  if (!loggedIn) {\n    console.log(`🔑 ${colors.yellow}Not logged in to Vercel.${colors.reset}`);\n    await askQuestion(`👉 Press [Enter] to login to Vercel... `);\n\n    const loginArgs = ['login'];\n    const loginCmd = useNpx ? 'npx' : 'vercel';\n    const finalArgs = useNpx ? ['--yes', 'vercel', ...loginArgs] : loginArgs;\n\n    const exitCode = await runCommandInteractive(loginCmd, finalArgs);\n    if (exitCode !== 0) {\n      throw new Error('Vercel login failed or was aborted.');\n    }\n    console.log(`\\n✔ ${colors.green}Logged in successfully!${colors.reset}`);\n  }\n\n  return hasToken;\n}\n","import { colors } from '../const';\nimport { runCommandInteractive } from './exec';\n\nexport async function runVercelDeploy(useNpx: boolean, hasToken: boolean): Promise<void> {\n  console.log(`\\n${colors.dim}Step 4/4: Deploying project to production...${colors.reset}`);\n  \n  const deployArgs = ['--prod', '--yes'];\n  if (hasToken) {\n    deployArgs.push('--token', process.env.VERCEL_TOKEN!);\n  }\n\n  const deployCmd = useNpx ? 'npx' : 'vercel';\n  const finalDeployArgs = useNpx ? ['--yes', 'vercel', ...deployArgs] : deployArgs;\n\n  console.log(`${colors.cyan}⚡ Running deployment in: ${process.cwd()}${colors.reset}\\n`);\n\n  const deployExitCode = await runCommandInteractive(deployCmd, finalDeployArgs);\n  if (deployExitCode !== 0) {\n    throw new Error('Vercel deployment failed.');\n  }\n\n  console.log(`\\n${colors.bold}${colors.green}🎉 Deployment completed successfully!${colors.reset}\\n`);\n}\n","import { colors } from './const';\nimport { formatDocBudgetHint } from './doc-read-audit';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport { runScaffoldValidation } from './scaffold-validation';\n\nconst c = colors;\n\nexport interface RunScaffoldCheckOptions {\n  projectRoot?: string;\n}\n\nexport function runScaffoldCheck(options: RunScaffoldCheckOptions = {}): number {\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n  console.log(`${c.bold}=== CFM SDK — scaffold-check (Phase 1 gate) ===${c.reset}`);\n  console.log(`${c.dim}Project: ${projectRoot}${c.reset}\\n`);\n\n  const result = runScaffoldValidation(projectRoot);\n\n  for (const warn of result.warnings) {\n    console.log(`${c.yellow}WARN:${c.reset} ${warn}`);\n  }\n\n  if (result.errors.length > 0) {\n    console.log(\n      `${c.red}FAIL:${c.reset} Framework scaffold incomplete (${result.framework}) — fix all items before authoring components:`,\n    );\n    for (const err of result.errors) {\n      console.log(`  - ${err}`);\n    }\n    console.log(`\\n${c.dim}Fix: setup/index.md · Next: npx cfm-sdk scaffold-check${c.reset}`);\n    return 1;\n  }\n\n  if (result.framework !== 'unknown') {\n    console.log(`${c.green}OK:${c.reset} Framework scaffold verified (${result.framework})`);\n  }\n\n  console.log(\n    `${c.dim}Core deps OK. Survey-type deps print after fill-implementation-plan --from-fetch.${c.reset}`,\n  );\n  console.log(\n    `${c.dim}Scaffold complete — run npx cfm-sdk seed-phase5 next.${c.reset}`,\n  );\n  console.log(`\\n${c.dim}${formatDocBudgetHint()}${c.reset}`);\n  console.log(`\\n${c.dim}Next: Phase 3–4 copy bundle + implementation_plan${c.reset}`);\n  return 0;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport {\n  detectFramework,\n  isAwsDeployTarget,\n  nextConfigHasStaticExport,\n  nextConfigIncludesTranspilePackages,\n  resolveSdkPackageName,\n  sourceHasUseClientDirective,\n  viteConfigHasRelativeBase,\n  type AgentFramework,\n} from './detect-framework';\n\nexport interface ScaffoldCheckResult {\n  ok: boolean;\n  framework: AgentFramework;\n  errors: string[];\n  warnings: string[];\n}\n\nfunction readPackageJson(projectRoot: string): Record<string, unknown> | null {\n  const pkgPath = path.join(projectRoot, 'package.json');\n  if (!fs.existsSync(pkgPath)) return null;\n  try {\n    return JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as Record<string, unknown>;\n  } catch {\n    return null;\n  }\n}\n\nfunction findFirstExisting(projectRoot: string, candidates: string[]): string | null {\n  for (const rel of candidates) {\n    const abs = path.join(projectRoot, rel);\n    if (fs.existsSync(abs)) return rel;\n  }\n  return null;\n}\n\nfunction readTextFile(projectRoot: string, rel: string): string {\n  return fs.readFileSync(path.join(projectRoot, rel), 'utf8');\n}\n\nfunction isAwsDeploy(projectRoot: string): boolean {\n  if (process.env.CFM_DEPLOY_TARGET === 'aws') return true;\n  const candidates = ['survey-deploy-config.json', 'survey-ui-config.json'];\n  for (const name of candidates) {\n    const configPath = path.join(projectRoot, name);\n    if (!fs.existsSync(configPath)) continue;\n    try {\n      const raw = JSON.parse(fs.readFileSync(configPath, 'utf8')) as { deploy?: { target?: string } };\n      return isAwsDeployTarget(raw);\n    } catch {\n      return false;\n    }\n  }\n  return false;\n}\n\nfunction globalsHasTailwindImport(projectRoot: string): boolean {\n  const globalsCandidates = [\n    'src/app/globals.css',\n    'src/styles/globals.css',\n    'src/index.css',\n    'app/globals.css',\n  ];\n  for (const rel of globalsCandidates) {\n    const abs = path.join(projectRoot, rel);\n    if (!fs.existsSync(abs)) continue;\n    const content = fs.readFileSync(abs, 'utf8');\n    if (/@import\\s+[\"']tailwindcss[\"']/.test(content)) return true;\n  }\n  return false;\n}\n\nexport function runScaffoldValidation(projectRoot: string): ScaffoldCheckResult {\n  const errors: string[] = [];\n  const warnings: string[] = [];\n\n  const pkg = readPackageJson(projectRoot);\n  if (!pkg) {\n    return {\n      ok: false,\n      framework: 'unknown',\n      errors: ['package.json missing or invalid — cannot verify framework scaffold'],\n      warnings: [],\n    };\n  }\n\n  const deps = {\n    ...(pkg.dependencies as Record<string, string> | undefined),\n    ...(pkg.devDependencies as Record<string, string> | undefined),\n  };\n\n  const framework = detectFramework({\n    dependencies: pkg.dependencies as Record<string, string> | undefined,\n    devDependencies: pkg.devDependencies as Record<string, string> | undefined,\n  });\n\n  const sdkPkg = resolveSdkPackageName({\n    dependencies: pkg.dependencies as Record<string, string> | undefined,\n    devDependencies: pkg.devDependencies as Record<string, string> | undefined,\n  });\n\n  if (!sdkPkg) {\n    errors.push(\n      'Install @explorer02/cfm-survey-sdk (or @repo/sdk) — see setup/install.md',\n    );\n  }\n  if (!deps.react) {\n    errors.push('Install react — see setup/install.md');\n  }\n  if (!deps['@tanstack/react-query']) {\n    errors.push('Install @tanstack/react-query — see setup/install.md');\n  }\n  if (!deps['react-icons']) {\n    errors.push('Install react-icons — see setup/install.md');\n  }\n\n  if (framework === 'unknown') {\n    warnings.push('Framework not detected from package.json — add next, vite, or react-scripts');\n  }\n\n  const awsDeploy = isAwsDeploy(projectRoot);\n  const sdkPkgName = sdkPkg ?? '@explorer02/cfm-survey-sdk';\n\n  if (framework === 'nextjs') {\n    const nextConfig = findFirstExisting(projectRoot, [\n      'next.config.js',\n      'next.config.mjs',\n      'next.config.ts',\n    ]);\n    if (!nextConfig) {\n      errors.push(\n        `Create next.config.js with transpilePackages: ['${sdkPkgName}'] — see setup/nextjs.md`,\n      );\n    } else {\n      const source = readTextFile(projectRoot, nextConfig);\n      if (!nextConfigIncludesTranspilePackages(source, sdkPkgName)) {\n        errors.push(`Add transpilePackages: ['${sdkPkgName}'] to ${nextConfig}`);\n      }\n      if (awsDeploy) {\n        if (!nextConfigHasStaticExport(source)) {\n          errors.push(\n            `Add output: 'export' and assetPrefix: './' to ${nextConfig} for AWS deploy — see setup/nextjs-aws-export.md`,\n          );\n        }\n      }\n    }\n\n    const surveyPage = findFirstExisting(projectRoot, [\n      'src/components/SurveyPage.tsx',\n      'components/SurveyPage.tsx',\n      'app/components/SurveyPage.tsx',\n    ]);\n    if (surveyPage) {\n      const source = readTextFile(projectRoot, surveyPage);\n      if (!sourceHasUseClientDirective(source)) {\n        warnings.push(\n          `Add 'use client' to ${surveyPage} — required for Next.js App Router`,\n        );\n      }\n    }\n  }\n\n  if (framework === 'vite') {\n    const viteConfig = findFirstExisting(projectRoot, [\n      'vite.config.ts',\n      'vite.config.js',\n      'vite.config.mjs',\n    ]);\n    if (awsDeploy) {\n      if (!viteConfig) {\n        errors.push('Create vite.config.ts with base: \\'./\\' for AWS deploy — see setup/vite.md');\n      } else {\n        const source = readTextFile(projectRoot, viteConfig);\n        if (!viteConfigHasRelativeBase(source)) {\n          errors.push(`Add base: './' to ${viteConfig} for AWS deploy — see setup/vite.md`);\n        }\n      }\n    }\n  }\n\n  if (!fs.existsSync(path.join(projectRoot, 'survey-deploy-config.json'))\n    && !fs.existsSync(path.join(projectRoot, 'survey-ui-config.json'))) {\n    warnings.push('survey-deploy-config.json not found — expected after Phase 5 seed or before Step 7');\n  }\n\n  if (!globalsHasTailwindImport(projectRoot)) {\n    warnings.push(\n      'globals.css missing @import \"tailwindcss\" — required for Tailwind utility classes in survey UI',\n    );\n  }\n\n  const introPage = findFirstExisting(projectRoot, [\n    'src/components/IntroPage.tsx',\n    'components/IntroPage.tsx',\n    'app/components/IntroPage.tsx',\n  ]);\n  if (!introPage) {\n    warnings.push(\n      'IntroPage not found — author an intro page with a Start button that dispatches onAction START; see build-gate/intro-start-gate.md',\n    );\n  }\n\n  return {\n    ok: errors.length === 0,\n    framework,\n    errors,\n    warnings,\n  };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { colors } from './const';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport { runScaffoldValidation } from './scaffold-validation';\nimport { scanProjectSource, scanMatrixInventoryGap } from './project-source-scan';\nimport { runCommandSync } from './utils/exec';\nimport {\n  CFM_NEXT_STEP_ASK_DEPLOY,\n  formatInput2HandoffBlocks,\n  formatInput4DeployHandoffBlocks,\n} from './workflow-prompts';\nimport { writeCoreVerifyPassed } from './workflow-state';\nimport { formatNpmInstallCommand, getMissingPackages } from './install-manifest';\n\nconst c = colors;\n\nconst FAST_REQUIRED_DEPS = ['@tanstack/react-query', '@dnd-kit/core'] as const;\n\nexport interface RunVerifyBuildOptions {\n  projectRoot?: string;\n  fast?: boolean;\n}\n\nfunction resolveVerifyScriptPath(projectRoot: string): string | null {\n  const copied = path.join(projectRoot, 'survey-ui', 'verify-agent-build.sh');\n  if (fs.existsSync(copied)) return copied;\n\n  const sdkScript = path.join(\n    __dirname,\n    '..',\n    '..',\n    'templates',\n    'docs',\n    'survey-ui',\n    'verify-agent-build.sh',\n  );\n  if (fs.existsSync(sdkScript)) return sdkScript;\n\n  return null;\n}\n\nexport function runVerifyBuildFast(projectRoot: string): number {\n  console.log(`${c.bold}=== CFM SDK — verify-build --fast (speed tool) ===${c.reset}`);\n  console.log(`${c.dim}Project: ${projectRoot}${c.reset}\\n`);\n\n  const scaffold = runScaffoldValidation(projectRoot);\n  for (const warn of scaffold.warnings) {\n    console.log(`${c.yellow}WARN:${c.reset} ${warn}`);\n  }\n  if (!scaffold.ok) {\n    console.log(`${c.red}FAIL:${c.reset} Scaffold incomplete:`);\n    for (const err of scaffold.errors) {\n      console.log(`  - ${err}`);\n    }\n    console.log(`\\n${c.dim}Fix: setup/index.md · Next: npx cfm-sdk verify-build --fast${c.reset}`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Scaffold checks passed (${scaffold.framework})`);\n\n  const scan = scanProjectSource(projectRoot);\n  if (scan.stubMatches.length) {\n    console.log(`${c.red}FAIL:${c.reset} Stub placeholder text found:`);\n    for (const m of scan.stubMatches) console.log(`  ${m}`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} No stub placeholder text`);\n\n  if (scan.internalSdkImports.length) {\n    console.log(`${c.red}FAIL:${c.reset} Internal SDK imports found:`);\n    for (const m of scan.internalSdkImports) console.log(`  ${m}`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} No internal SDK imports`);\n\n  if (scan.nextImports.length) {\n    console.log(`${c.red}FAIL:${c.reset} Stale next/* imports found:`);\n    for (const m of scan.nextImports) console.log(`  ${m}`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} No next/* imports in project source`);\n\n  if (scan.introStartIssues.length) {\n    console.log(`${c.red}FAIL:${c.reset} Intro Start gate issues:`);\n    for (const m of scan.introStartIssues) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: phase-5-6-build-gate.md#intro-start-gate · Next: npx cfm-sdk verify-build --fast${c.reset}`,\n    );\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Intro Start gate passed`);\n\n  if (scan.endPageCtaIssues.length) {\n    console.log(`${c.red}FAIL:${c.reset} End-page CTA filter issues:`);\n    for (const m of scan.endPageCtaIssues) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: 15-end-page.md · import endPageCtas from SDK · Next: npx cfm-sdk verify-build --fast${c.reset}`,\n    );\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} End-page CTA filter passed`);\n\n  if (scan.matrixStatementIssues.length) {\n    console.log(`${c.red}FAIL:${c.reset} Matrix statement label issues:`);\n    for (const m of scan.matrixStatementIssues) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: 04-csat.md / 09-slider-matrix.md · shouldShowMatrixStatementLabels · Next: npx cfm-sdk verify-build --fast${c.reset}`,\n    );\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Matrix statement labels passed`);\n\n  if (scan.matrixLayoutIssues.length) {\n    console.log(`${c.red}FAIL:${c.reset} Matrix layout structure issues:`);\n    for (const m of scan.matrixLayoutIssues) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: layout-cookbook.md · agent-per-type-verification.md Format rows · Next: npx cfm-sdk verify-build --fast${c.reset}`,\n    );\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Matrix layout structure passed`);\n\n  if (scan.mcqOtherIssues.length) {\n    console.log(`${c.red}FAIL:${c.reset} MCQ Other option issues:`);\n    for (const m of scan.mcqOtherIssues) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: 02-radio.md#other-option-typed-input · Next: npx cfm-sdk verify-build --fast${c.reset}`,\n    );\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} MCQ Other option gate passed`);\n\n  // Styling is authored freely in the docs-only model — hardcoded colors are expected.\n  // The verify gate checks integration correctness (stubs, imports, intro gate), not styling.\n\n  const missingDeps = getMissingPackages(projectRoot, [...FAST_REQUIRED_DEPS]);\n  if (missingDeps.length) {\n    console.log(`${c.red}FAIL:${c.reset} Missing bundle dependencies in package.json:`);\n    for (const pkg of missingDeps) console.log(`  - ${pkg}`);\n    const cmd = formatNpmInstallCommand(missingDeps);\n    console.log(\n      `\\n${c.dim}Fix: npm install @explorer02/cfm-survey-sdk @tanstack/react-query react-icons @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities — or re-run npx cfm-sdk seed-phase5${c.reset}`,\n    );\n    if (cmd) console.log(`${c.dim}Quick: ${cmd}${c.reset}`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Bundle deps present in package.json`);\n\n  const tsconfigPath = path.join(projectRoot, 'tsconfig.json');\n  if (!fs.existsSync(tsconfigPath)) {\n    console.log(`${c.yellow}WARN:${c.reset} tsconfig.json missing — skipping tsc --noEmit`);\n  } else {\n    console.log(`${c.dim}Running tsc --noEmit...${c.reset}`);\n    const ok = runCommandSync('npx', ['tsc', '--noEmit'], { cwd: projectRoot });\n    if (!ok) {\n      console.log(`\\n${c.red}FAIL:${c.reset} TypeScript check failed — fix errors above`);\n      console.log(`${c.dim}Next: npx cfm-sdk verify-build --fast${c.reset}`);\n      return 1;\n    }\n    console.log(`${c.green}OK:${c.reset} TypeScript check passed`);\n  }\n\n  console.log(\n    `\\n${c.green}Speed check passed${c.reset} — Phase 6 still requires ${c.bold}npx cfm-sdk verify-build${c.reset}`,\n  );\n  console.log(`\\n${formatInput2HandoffBlocks()}\\n`);\n  return 0;\n}\n\nexport function runVerifyBuildFull(projectRoot: string): number {\n  console.log(`${c.bold}=== CFM SDK — verify-build (core) ===${c.reset}`);\n  console.log(`${c.dim}Project: ${projectRoot}${c.reset}\\n`);\n\n  const scriptPath = resolveVerifyScriptPath(projectRoot);\n  if (!scriptPath) {\n    console.log(\n      `${c.red}FAIL:${c.reset} verify-agent-build.sh not found — install the SDK package`,\n    );\n    return 1;\n  }\n\n  const ok = runCommandSync('bash', [scriptPath], { cwd: projectRoot });\n  if (!ok) {\n    console.log(`\\n${c.dim}Fix: phase-5-6-build-gate.md §8${c.reset}`);\n    return 1;\n  }\n\n  // Post-sync structural layout gate. This runs AFTER sync-from-fetch, so §3c must be\n  // populated — enforce the per-type matrix layout structure here (the --fast run happens\n  // before sync-from-fetch, where §3c is legitimately empty and these checks no-op).\n  const inventoryGap = scanMatrixInventoryGap(projectRoot);\n  if (inventoryGap.length) {\n    console.log(`${c.red}FAIL:${c.reset} Matrix inventory not populated:`);\n    for (const m of inventoryGap) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: npx cfm-sdk sync-from-fetch → fill implementation_plan.md §3c → npx cfm-sdk verify-build${c.reset}`,\n    );\n    return 1;\n  }\n\n  const scan = scanProjectSource(projectRoot);\n  const structural = [...scan.matrixStatementIssues, ...scan.matrixLayoutIssues];\n  if (structural.length) {\n    console.log(`${c.red}FAIL:${c.reset} Matrix layout structure issues:`);\n    for (const m of structural) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: layout-cookbook.md · agent-per-type-verification.md · §3c variant per matrix question${c.reset}`,\n    );\n    return 1;\n  }\n\n  writeCoreVerifyPassed(projectRoot);\n  console.log(`\\n${CFM_NEXT_STEP_ASK_DEPLOY}`);\n  console.log(`\\n${formatInput4DeployHandoffBlocks()}\\n`);\n  return 0;\n}\n\nexport function runVerifyBuild(options: RunVerifyBuildOptions = {}): number {\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n  if (options.fast) {\n    return runVerifyBuildFast(projectRoot);\n  }\n  return runVerifyBuildFull(projectRoot);\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nconst SOURCE_DIRS = ['src', 'components', 'app', 'lib'] as const;\n\nconst INTRO_PAGE_CANDIDATES = [\n  'src/components/IntroPage.tsx',\n  'components/IntroPage.tsx',\n  'app/components/IntroPage.tsx',\n] as const;\n\nconst SURVEY_PAGE_CANDIDATES = [\n  'src/components/SurveyPage.tsx',\n  'components/SurveyPage.tsx',\n  'app/components/SurveyPage.tsx',\n] as const;\n\nconst END_PAGE_CANDIDATES = [\n  'src/components/EndPage.tsx',\n  'components/EndPage.tsx',\n  'app/components/EndPage.tsx',\n] as const;\n\nconst QUESTION_CANDIDATES = [\n  'src/components/Question.tsx',\n  'components/Question.tsx',\n  'app/components/Question.tsx',\n] as const;\n\nconst MATRIX_SCALE_FILES = [\n  'CsatMatrixScale.tsx',\n  'SliderMatrixScale.tsx',\n  'LikertMatrixScale.tsx',\n] as const;\n\nconst MATRIX_RELATED_FILES = [\n  ...MATRIX_SCALE_FILES,\n  'MatrixDropdown.tsx',\n] as const;\n\nconst AGENT_AUTHORED_STYLE_FILES = [\n  'src/components/SurveyPage.tsx',\n  'components/SurveyPage.tsx',\n  'app/components/SurveyPage.tsx',\n  'src/globals.css',\n  'src/index.css',\n  'src/app/globals.css',\n  'app/globals.css',\n  'src/app/layout.tsx',\n  'app/layout.tsx',\n] as const;\n\nconst HARDCODED_HEX = /#[0-9A-Fa-f]{3,8}\\b/;\nconst HARDCODED_RGB = /\\brgba?\\s*\\(/;\n\nfunction collectSourceFiles(projectRoot: string): string[] {\n  const files: string[] = [];\n  for (const dir of SOURCE_DIRS) {\n    const abs = path.join(projectRoot, dir);\n    if (!fs.existsSync(abs)) continue;\n    walk(abs, files);\n  }\n  return files;\n}\n\nfunction walk(dir: string, out: string[]): void {\n  for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n    const abs = path.join(dir, entry.name);\n    if (entry.isDirectory()) {\n      if (entry.name === 'node_modules' || entry.name === '.next' || entry.name === 'dist') {\n        continue;\n      }\n      walk(abs, out);\n    } else if (/\\.(tsx?|jsx?|mjs|cjs)$/.test(entry.name)) {\n      out.push(abs);\n    }\n  }\n}\n\nfunction findFirstExisting(projectRoot: string, candidates: readonly string[]): string | null {\n  for (const rel of candidates) {\n    const abs = path.join(projectRoot, rel);\n    if (fs.existsSync(abs)) return rel;\n  }\n  return null;\n}\n\nfunction isAllowedStyleLine(line: string): boolean {\n  const trimmed = line.trim();\n  if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*')) return true;\n  if (trimmed.includes('var(--cfm-')) return true;\n  if (/url\\s*\\(#/.test(trimmed)) return true;\n  return false;\n}\n\nexport function scanHardcodedStyleIssues(projectRoot: string): string[] {\n  const issues: string[] = [];\n\n  for (const rel of AGENT_AUTHORED_STYLE_FILES) {\n    const abs = path.join(projectRoot, rel);\n    if (!fs.existsSync(abs)) continue;\n\n    const content = fs.readFileSync(abs, 'utf8');\n    const lines = content.split('\\n');\n\n    for (let i = 0; i < lines.length; i++) {\n      const line = lines[i];\n      if (isAllowedStyleLine(line)) continue;\n      if (HARDCODED_HEX.test(line) || HARDCODED_RGB.test(line)) {\n        issues.push(`${rel}:${i + 1}: hardcoded color — use survey-ui-config.json + var(--cfm-*)`);\n      }\n    }\n  }\n\n  return issues;\n}\n\nexport function scanIntroStartIssues(projectRoot: string): string[] {\n  const issues: string[] = [];\n  const introRel = findFirstExisting(projectRoot, INTRO_PAGE_CANDIDATES);\n\n  if (!introRel) {\n    issues.push(\n      'IntroPage.tsx missing — author an intro page with a Start button that dispatches onAction START',\n    );\n    return issues;\n  }\n\n  const introContent = fs.readFileSync(path.join(projectRoot, introRel), 'utf8');\n\n  if (!/data-cfm-btn-start/.test(introContent)) {\n    issues.push(`${introRel}: Start button missing data-cfm-btn-start`);\n  }\n  if (!/onClick=\\{onStart\\}|onClick=\\{\\s*onStart\\s*\\}/.test(introContent)) {\n    issues.push(`${introRel}: Start button must use onClick={onStart}`);\n  }\n  if (/\\{showStart &&|showStart &&/.test(introContent)) {\n    issues.push(`${introRel}: conditional Start (showStart) — always render Start button`);\n  }\n\n  const surveyRel = findFirstExisting(projectRoot, SURVEY_PAGE_CANDIDATES);\n  if (!surveyRel) return issues;\n\n  const surveyContent = fs.readFileSync(path.join(projectRoot, surveyRel), 'utf8');\n  const hasIntroPhase = /phase\\.kind\\s*===\\s*['\"]intro['\"]|kind\\s*===\\s*['\"]intro['\"]/.test(\n    surveyContent,\n  );\n\n  if (hasIntroPhase && !/<IntroPage/.test(surveyContent)) {\n    issues.push(\n      `${surveyRel}: intro phase must render <IntroPage /> — do not inline header/description only`,\n    );\n  }\n  if (/<IntroPage/.test(surveyContent) && !/type:\\s*['\"]START['\"]/.test(surveyContent)) {\n    issues.push(`${surveyRel}: IntroPage must wire onAction({ type: 'START' })`);\n  }\n\n  return issues;\n}\n\nfunction endPageFiltersEmailCtAs(content: string): boolean {\n  if (/endPageCtas\\s*\\(/.test(content)) return true;\n  if (/sendEmailResponse,\\s*resumptionNotification,\\s*reopenNotification/.test(content)) {\n    return true;\n  }\n  return false;\n}\n\nexport function scanEndPageCtaIssues(projectRoot: string): string[] {\n  const endRel = findFirstExisting(projectRoot, END_PAGE_CANDIDATES);\n  if (!endRel) return [];\n\n  const content = fs.readFileSync(path.join(projectRoot, endRel), 'utf8');\n  if (!/<SpecialPageCtaSection/.test(content)) return [];\n\n  if (endPageFiltersEmailCtAs(content)) return [];\n\n  if (/ctas=\\{[^}]*page\\.ctas[^}]*\\}/.test(content)) {\n    return [\n      `${endRel}: EndPage must filter email CTAs via endPageCtas(page.ctas) before SpecialPageCtaSection — see 15-end-page.md`,\n    ];\n  }\n\n  return [];\n}\n\nexport interface MatrixVariantPlanRow {\n  questionId: string;\n  type: string;\n  displayStyle: string;\n  statementLayout: string;\n  transposeTable: string;\n  selectionMode: string;\n}\n\nexport function readMatrixVariantsFromPlan(projectRoot: string): MatrixVariantPlanRow[] {\n  const planPath = path.join(projectRoot, 'implementation_plan.md');\n  if (!fs.existsSync(planPath)) return [];\n\n  const content = fs.readFileSync(planPath, 'utf8');\n  const section = content.split('## 3c. Matrix variant inventory')[1];\n  if (!section) return [];\n\n  const tablePart = section.split('##')[0] ?? '';\n  const lines = tablePart.split('\\n').filter((l) => l.trim().startsWith('|'));\n  const rows: MatrixVariantPlanRow[] = [];\n\n  for (const line of lines) {\n    if (line.includes('questionId')) continue;\n    // Skip markdown separator rows (only pipes, dashes, colons, whitespace) — including\n    // multi-column separators like `|------|------|` that a single-dash regex misses.\n    if (/^[\\s|:-]+$/.test(line)) continue;\n    if (line.includes('(no matrix questions in fetch)')) continue;\n\n    const cells = line\n      .split('|')\n      .map((c) => c.trim())\n      .filter(Boolean);\n    if (cells.length < 6) continue;\n\n    rows.push({\n      questionId: cells[0],\n      type: cells[1],\n      displayStyle: cells[2],\n      statementLayout: cells[3],\n      transposeTable: cells[4],\n      selectionMode: cells[5],\n    });\n  }\n\n  return rows;\n}\n\nfunction readMatrixFileContents(projectRoot: string): Map<string, string> {\n  const out = new Map<string, string>();\n  for (const file of collectSourceFiles(projectRoot)) {\n    const basename = path.basename(file);\n    if (!(MATRIX_RELATED_FILES as readonly string[]).includes(basename)) continue;\n    out.set(basename, fs.readFileSync(file, 'utf8'));\n  }\n  return out;\n}\n\nfunction questionDispatcherContent(projectRoot: string): string {\n  const rel = findFirstExisting(projectRoot, QUESTION_CANDIDATES);\n  if (!rel) return '';\n  return fs.readFileSync(path.join(projectRoot, rel), 'utf8');\n}\n\nexport function scanMatrixLayoutIssues(projectRoot: string): string[] {\n  const issues: string[] = [];\n  const files = readMatrixFileContents(projectRoot);\n  if (files.size === 0) return issues;\n\n  const matrixBlob = [...files.entries()]\n    .map(([name, content]) => `// ${name}\\n${content}`)\n    .join('\\n');\n\n  for (const [name, content] of files) {\n    if ((MATRIX_SCALE_FILES as readonly string[]).includes(name)) {\n      if (!/<select[\\s>]/i.test(content) && !/<details[\\s>]/i.test(content)) continue;\n      issues.push(\n        `${name}: matrix dropdown must use custom MatrixDropdown — no native <select> or <details>`,\n      );\n    }\n  }\n\n  const variants = readMatrixVariantsFromPlan(projectRoot);\n  const hasBipolar = variants.some(\n    (r) => r.type === 'CFM_MATRIX' && /bipolar/i.test(r.statementLayout),\n  );\n  const hasTranspose = variants.some((r) => /true/i.test(r.transposeTable));\n  const hasRatingGraphics = variants.some(\n    (r) => r.type === 'RATING_MATRIX' && /graphics/i.test(r.displayStyle),\n  );\n  const hasDropdownStyle = variants.some((r) => /dropdown|selectbox/i.test(r.displayStyle));\n\n  if (hasBipolar) {\n    const likert = files.get('LikertMatrixScale.tsx');\n    if (likert && !/oppositeStatementText/.test(likert)) {\n      issues.push(\n        'LikertMatrixScale.tsx: §3c has bipolar CFM_MATRIX — render oppositeStatementText in right column (see layout-cookbook.md)',\n      );\n    }\n  }\n\n  if (hasTranspose) {\n    if (!/transposeTable/.test(matrixBlob)) {\n      issues.push(\n        'Matrix scale components: §3c has transposeTable — branch with swapped row/col iteration (see layout-cookbook.md)',\n      );\n    }\n  }\n\n  if (hasRatingGraphics) {\n    const csat = files.get('CsatMatrixScale.tsx') ?? '';\n    if (!/CustomSliderTrack/.test(csat)) {\n      issues.push(\n        'CsatMatrixScale.tsx: §3c has RATING_MATRIX graphics — use CustomSliderTrack per row, not cell button grid',\n      );\n    }\n    const question = questionDispatcherContent(projectRoot);\n    if (question && /RATING_MATRIX[\\s\\S]{0,400}SliderMatrixScale/.test(question)) {\n      issues.push(\n        'Question.tsx: RATING_MATRIX graphics must use CsatMatrixScale + CustomSliderTrack — not SliderMatrixScale',\n      );\n    }\n  }\n\n  if (hasDropdownStyle) {\n    if (!/MatrixDropdown/.test(matrixBlob)) {\n      issues.push(\n        'Matrix components: §3c has dropdown/selectbox displayStyle — use MatrixDropdown per row',\n      );\n    }\n  }\n\n  return issues;\n}\n\n/**\n * Fail-closed guard for the §3c enforcement chain.\n *\n * The structural matrix checks (bipolar / transpose / graphics / dropdown) are all derived\n * from `implementation_plan.md` §3c. If matrix component files exist but §3c is empty, those\n * checks silently no-op. At the Phase-6 gate (full `verify-build`, run AFTER `sync-from-fetch`)\n * an empty §3c means the agent skipped `sync-from-fetch` or never populated the inventory — so\n * the layout checks never ran. Surface that as a blocking issue instead of passing silently.\n *\n * Only meaningful post-sync: do NOT call this from `--fast` (which legitimately runs before\n * `sync-from-fetch`).\n */\nexport function scanMatrixInventoryGap(projectRoot: string): string[] {\n  const files = readMatrixFileContents(projectRoot);\n  if (files.size === 0) return [];\n\n  const variants = readMatrixVariantsFromPlan(projectRoot);\n  if (variants.length > 0) return [];\n\n  return [\n    'Matrix component files exist but implementation_plan.md §3c is empty — run `npx cfm-sdk sync-from-fetch` and fill §3c, then re-verify (matrix layout checks depend on §3c). See layout-cookbook.md.',\n  ];\n}\n\nexport function scanMatrixStatementIssues(projectRoot: string): string[] {\n  const issues: string[] = [];\n\n  for (const file of collectSourceFiles(projectRoot)) {\n    const basename = path.basename(file);\n    if (!(MATRIX_SCALE_FILES as readonly string[]).includes(basename)) continue;\n\n    const content = fs.readFileSync(file, 'utf8');\n    const rel = path.relative(projectRoot, file);\n    if (!/shouldShowMatrixStatementLabels/.test(content)) {\n      issues.push(\n        `${rel}: must call shouldShowMatrixStatementLabels(question) for single- vs multi-row statement labels`,\n      );\n    }\n  }\n\n  return issues;\n}\n\nexport function readMcqOtherFlagFromPlan(projectRoot: string): boolean | null {\n  const planPath = path.join(projectRoot, 'implementation_plan.md');\n  if (!fs.existsSync(planPath)) return null;\n\n  const content = fs.readFileSync(planPath, 'utf8');\n  const match = content.match(/\\*\\*MCQ Other option in fetch:\\*\\*\\s*(yes|no)/i);\n  if (!match) return null;\n  return match[1].toLowerCase() === 'yes';\n}\n\nexport function scanMcqOtherIssues(projectRoot: string): string[] {\n  if (readMcqOtherFlagFromPlan(projectRoot) !== true) return [];\n\n  const questionRel = findFirstExisting(projectRoot, QUESTION_CANDIDATES);\n  if (!questionRel) {\n    return [\n      'Question.tsx missing — survey has MCQ Other options; author MCQ handler with MCQ_OTHER_TEXT_CHANGE',\n    ];\n  }\n\n  const content = fs.readFileSync(path.join(projectRoot, questionRel), 'utf8');\n  if (/MCQ_OTHER_TEXT_CHANGE|buildMcqOptionLevelKey/.test(content)) return [];\n\n  return [\n    `${questionRel}: survey has MCQ Other options — wire MCQ_OTHER_TEXT_CHANGE + buildMcqOptionLevelKey — see 02-radio.md`,\n  ];\n}\n\nexport interface SourceScanResult {\n  stubMatches: string[];\n  internalSdkImports: string[];\n  nextImports: string[];\n  introStartIssues: string[];\n  hardcodedStyleIssues: string[];\n  endPageCtaIssues: string[];\n  matrixStatementIssues: string[];\n  matrixLayoutIssues: string[];\n  mcqOtherIssues: string[];\n}\n\nexport function scanProjectSource(projectRoot: string): SourceScanResult {\n  const stubMatches: string[] = [];\n  const internalSdkImports: string[] = [];\n  const nextImports: string[] = [];\n\n  for (const file of collectSourceFiles(projectRoot)) {\n    const content = fs.readFileSync(file, 'utf8');\n    const rel = path.relative(projectRoot, file);\n\n    if (content.includes('not yet implemented')) {\n      stubMatches.push(`${rel}: stub placeholder text`);\n    }\n    if (/@explorer02\\/cfm-survey-sdk\\/src|@repo\\/sdk\\/src/.test(content)) {\n      internalSdkImports.push(`${rel}: internal SDK import`);\n    }\n    if (/from\\s+['\"]next\\//.test(content)) {\n      nextImports.push(`${rel}: stale next/* import`);\n    }\n  }\n\n  const introStartIssues = scanIntroStartIssues(projectRoot);\n  const hardcodedStyleIssues = scanHardcodedStyleIssues(projectRoot);\n  const endPageCtaIssues = scanEndPageCtaIssues(projectRoot);\n  const matrixStatementIssues = scanMatrixStatementIssues(projectRoot);\n  const matrixLayoutIssues = scanMatrixLayoutIssues(projectRoot);\n  const mcqOtherIssues = scanMcqOtherIssues(projectRoot);\n\n  return {\n    stubMatches,\n    internalSdkImports,\n    nextImports,\n    introStartIssues,\n    hardcodedStyleIssues,\n    endPageCtaIssues,\n    matrixStatementIssues,\n    matrixLayoutIssues,\n    mcqOtherIssues,\n  };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { colors } from './const';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport { installBundleDepsIfMissing } from './install-manifest';\nimport { writeViteScaffoldFilesIfMissing } from './vite-scaffold';\n\nconst c = colors;\n\nexport interface SeedPhase5Options {\n  projectRoot?: string;\n  scenarioB?: boolean;\n  fromMockup?: boolean;\n}\n\nfunction getSdkDocsRoot(): string {\n  return path.join(__dirname, '..', '..', 'templates', 'docs');\n}\n\nfunction copyImplementationPlanTemplate(projectRoot: string, sdkDocsRoot: string): string {\n  const dest = path.join(projectRoot, 'implementation_plan.md');\n  if (fs.existsSync(dest)) {\n    console.log(`${c.dim}   implementation_plan.md already exists — keeping${c.reset}`);\n    return dest;\n  }\n  const template = path.join(sdkDocsRoot, 'survey-ui', 'implementation_plan.md');\n  if (!fs.existsSync(template)) {\n    throw new Error('seed-phase5: survey-ui/implementation_plan.md template not found in SDK');\n  }\n  fs.copyFileSync(template, dest);\n  console.log(`${c.green}OK:${c.reset} Copied implementation_plan.md → project root`);\n  return dest;\n}\n\nfunction writeDeployConfigDefault(projectRoot: string): void {\n  const dest = path.join(projectRoot, 'survey-deploy-config.json');\n  if (fs.existsSync(dest)) {\n    console.log(`${c.dim}   survey-deploy-config.json already exists — keeping${c.reset}`);\n    return;\n  }\n  const defaultConfig = {\n    deploy: {\n      target: 'aws',\n      autoDeploy: false,\n    },\n  };\n  fs.writeFileSync(dest, `${JSON.stringify(defaultConfig, null, 2)}\\n`, 'utf8');\n  console.log(`${c.green}OK:${c.reset} Wrote survey-deploy-config.json → project root`);\n}\n\n/**\n * Docs-only model: seed-phase5 no longer copies a component bundle or generates\n * survey-theme.css. It prepares the project scaffold (framework files), installs\n * bundle dependencies, drops the implementation_plan template, and seeds\n * survey-deploy-config.json for Step 7 deploy target.\n */\nexport function runSeedPhase5(options: SeedPhase5Options = {}): number {\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n  const sdkDocsRoot = getSdkDocsRoot();\n\n  console.log(`${c.bold}=== CFM SDK — seed-phase5 (scaffold) ===${c.reset}`);\n  console.log(`${c.dim}Project: ${projectRoot}${c.reset}\\n`);\n\n  copyImplementationPlanTemplate(projectRoot, sdkDocsRoot);\n  writeDeployConfigDefault(projectRoot);\n\n  const depsResult = installBundleDepsIfMissing(projectRoot);\n  if (!depsResult.ok) {\n    return 1;\n  }\n\n  writeViteScaffoldFilesIfMissing(projectRoot);\n\n  console.log(`\\n${c.green}Scaffold complete${c.reset} — no components copied (author from the docs)`);\n  console.log(`${c.dim}Agent tasks:${c.reset}`);\n  console.log(`${c.dim}  1. Author SurveyPage + one component per fetched question type (see 03-ui-specs/*)${c.reset}`);\n  console.log(`${c.dim}  2. Style to the client's design, or minimal-default-theme.md when none is given${c.reset}`);\n  console.log(`${c.dim}Next: npx cfm-sdk verify-build --fast${c.reset}`);\n  return 0;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { colors } from './const';\n\nconst c = colors;\n\nconst TSCONFIG_FILES = ['tsconfig.json', 'tsconfig.app.json', 'tsconfig.node.json'] as const;\n\nfunction getViteScaffoldRoot(): string {\n  return path.join(__dirname, '..', '..', 'templates', 'vite-scaffold');\n}\n\n/** Copy Vite tsconfig templates only when destination files are absent. */\nexport function writeViteScaffoldFilesIfMissing(projectRoot: string): string[] {\n  const scaffoldRoot = getViteScaffoldRoot();\n  const written: string[] = [];\n\n  for (const file of TSCONFIG_FILES) {\n    const src = path.join(scaffoldRoot, file);\n    const dest = path.join(projectRoot, file);\n    if (!fs.existsSync(src)) continue;\n    if (fs.existsSync(dest)) continue;\n    fs.copyFileSync(src, dest);\n    written.push(file);\n  }\n\n  if (written.length) {\n    console.log(\n      `${c.green}OK:${c.reset} Wrote Vite tsconfig scaffold (${written.join(', ')})`,\n    );\n  }\n\n  return written;\n}\n","#!/usr/bin/env node\n\nimport { runDeployment } from './deploy';\nimport { runScaffoldCheck } from './scaffold-check';\nimport { runVerifyBuild } from './verify-build';\nimport { runSeedPhase5 } from './seed-phase5';\nimport { colors } from './const';\nimport { getErrorMessage } from '../types/shared';\n\nconst c = colors;\nconst args = process.argv.slice(2);\nconst command = args[0];\n\nfunction printHelp(): void {\n  console.log(`\\n${c.bold}${c.cyan}CFM SDK CLI Tool${c.reset}`);\n  console.log(`\\nUsage:`);\n  console.log(`  npx cfm-sdk scaffold-check              – Phase 1 framework gate`);\n  console.log(`  npx cfm-sdk seed-phase5                 – Scaffold + install deps + implementation_plan (no bundle copy)`);\n  console.log(`  npx cfm-sdk verify-build                – Phase 6 core verify (includes npm run build)`);\n  console.log(`  npx cfm-sdk verify-build --fast         – Phase 5 speed check (required before INPUT 2)`);\n  console.log(`  npx cfm-sdk sync-from-fetch             – INPUT 2: plan from live fetch`);\n  console.log(`  npx cfm-sdk fill-implementation-plan --from-fetch – Auto-fill implementation_plan.md tables`);\n  console.log(`  npx cfm-sdk get-deploy-target             – Read deploy.target from survey-deploy-config.json`);\n  console.log(`  npx cfm-sdk set-deploy-target aws|vercel  – Write deploy.target after client confirms deploy`);\n  console.log(`  npx cfm-sdk deploy                      – Deploy to Vercel`);\n  console.log(`  npx cfm-sdk create-distribution --s3-key=<key>`);\n  console.log(`                                          – Upload OUT_DIR to distribution path; syncs https://distribution-dashboard-three.vercel.app`);\n  console.log(`  npx cfm-sdk doc-read-audit              – Audit fast-path doc read line budgets`);\n  console.log(`  npx cfm-sdk doc-read-audit --profile phase --phase-id 1`);\n}\n\nasync function main() {\n  if (!command || command === '--help' || command === '-h') {\n    printHelp();\n    process.exit(0);\n  }\n\n  if (command === 'scaffold-check') {\n    process.exit(runScaffoldCheck({}));\n  } else if (command === 'seed-phase5') {\n    process.exit(runSeedPhase5({}));\n  } else if (command === 'sync-from-fetch') {\n    const instanceArg = args.find((a) => a.startsWith('--instance-id='));\n    const instanceIdOverride = instanceArg?.split('=').slice(1).join('=');\n    const { runSyncFromFetch } = await import('./sync-from-fetch');\n    process.exit(await runSyncFromFetch({ instanceIdOverride }));\n  } else if (command === 'verify-build') {\n    const fast = args.includes('--fast');\n    process.exit(runVerifyBuild({ fast }));\n  } else if (command === 'fill-implementation-plan') {\n    const fromFetch = args.includes('--from-fetch');\n    const instanceArg = args.find((a) => a.startsWith('--instance-id='));\n    const instanceIdOverride = instanceArg?.split('=').slice(1).join('=');\n    if (!fromFetch) {\n      console.error(`${c.red}❌ Use: npx cfm-sdk fill-implementation-plan --from-fetch${c.reset}`);\n      process.exit(1);\n    }\n    try {\n      const { fillImplementationPlanFromFetch } = await import('./fill-implementation-plan');\n      await fillImplementationPlanFromFetch({ instanceIdOverride });\n    } catch (err: unknown) {\n      console.error(`\\n${c.red}❌ Error: ${getErrorMessage(err)}${c.reset}`);\n      console.error(`${c.dim}Fallback: fill §3b–§3e tables manually in implementation_plan.md${c.reset}`);\n      process.exit(1);\n    }\n  } else if (command === 'get-deploy-target') {\n    try {\n      const { runGetDeployTarget } = await import('./resolve-deploy-target');\n      process.exit(runGetDeployTarget({}));\n    } catch (err: unknown) {\n      console.error(`\\n${c.red}❌ Error: ${getErrorMessage(err)}${c.reset}`);\n      process.exit(1);\n    }\n  } else if (command === 'set-deploy-target') {\n    const target = args[1];\n    try {\n      const { runSetDeployTarget } = await import('./resolve-deploy-target');\n      process.exit(await runSetDeployTarget({ target }));\n    } catch (err: unknown) {\n      console.error(`\\n${c.red}❌ Error: ${getErrorMessage(err)}${c.reset}`);\n      process.exit(1);\n    }\n  } else if (command === 'deploy') {\n    try {\n      await runDeployment();\n    } catch (err: unknown) {\n      console.error(`\\n${c.red}❌ Error: ${getErrorMessage(err)}${c.reset}`);\n      process.exit(1);\n    }\n  } else if (command === 'create-distribution') {\n    const instanceArg = args.find((a) => a.startsWith('--instance-id='));\n    const s3KeyArg = args.find((a) => a.startsWith('--s3-key='));\n    const { runCreateDistribution } = await import('./create-distribution');\n    process.exit(\n      await runCreateDistribution({\n        instanceIdOverride: instanceArg?.split('=').slice(1).join('='),\n        s3Key: s3KeyArg?.split('=').slice(1).join('='),\n      }),\n    );\n  } else if (command === 'doc-read-audit') {\n    const { runDocReadAudit } = await import('./doc-read-audit');\n    const profileArg = args.find((a) => a.startsWith('--profile='));\n    const phaseIdArg = args.find((a) => a.startsWith('--phase-id='));\n    const profileFlag = args.indexOf('--profile');\n    const phaseIdFlag = args.indexOf('--phase-id');\n    let profile: 'fastPath' | 'phase' = 'fastPath';\n    let phaseId: string | undefined;\n    if (profileArg) {\n      const v = profileArg.split('=')[1];\n      if (v === 'phase' || v === 'fastPath') profile = v;\n    } else if (profileFlag >= 0) {\n      const v = args[profileFlag + 1];\n      if (v === 'phase' || v === 'fastPath') profile = v;\n    }\n    if (phaseIdArg) {\n      phaseId = phaseIdArg.split('=')[1];\n    } else if (phaseIdFlag >= 0) {\n      phaseId = args[phaseIdFlag + 1];\n    }\n    process.exit(\n      runDocReadAudit({\n        profile,\n        phaseId,\n        warnOnly: args.includes('--warn-only'),\n        ci: args.includes('--ci'),\n        writeInventory: args.includes('--write'),\n      }),\n    );\n  } else {\n    console.error(`${c.red}Unknown command: ${command}${c.reset}\\n`);\n    printHelp();\n    process.exit(1);\n  }\n}\n\nmain().catch((err: unknown) => {\n  console.error(`${c.red}❌ Fatal error: ${getErrorMessage(err)}${c.reset}`);\n  process.exit(1);\n});\n"],"mappings":"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","names":["colors","DEFAULT_DISTRIBUTION_DASHBOARD_URL","init_const","__esmMin","execSync","spawn","hasCommand","cmd","checkCmd","runCommandSync","args","options","fullCmd","inheritShellOptions","runCommandInteractive","resolve","code","init_exec","__esmMin","formatDeployTargetLabel","target","formatInput5ClientChat","surveyId","DEFAULT_DISTRIBUTION_DASHBOARD_URL","formatDistributionDoneClientChat","liveUrl","formatInput2BClientChat","devUrl","formatClientChatBlock","step","title","body","BORDER","CLIENT_CHAT_HEADER","formatAgentOnlyBlock","AGENT_ONLY_HEADER","formatInput2ClientChatBlock","INPUT_2_CLIENT_CHAT","formatInput2AgentBlock","formatInput2HandoffBlocks","formatInput2BHandoffBlocks","formatInput4AClientChatBlock","INPUT_4A_CLIENT_CHAT","formatInput4DeployAgentBlock","formatInput4DeployHandoffBlocks","formatInput5HandoffBlocks","formatDistributionDoneHandoffBlocks","formatDeployGateFailure","CFM_NEXT_STEP_ASK_DEPLOY","init_workflow_prompts","__esmMin","init_const","fs","path","statePath","projectRoot","WORKFLOW_STATE_FILE","isWorkflowGateSkipped","readWorkflowState","file","raw","writeWorkflowState","state","writeCoreVerifyPassed","recordDeployConfirmed","existing","next","recordDistributionS3Key","s3Key","formatDeployGateFailure","assertDeployAllowed","assertDistributionDeployAllowed","init_workflow_state","__esmMin","init_workflow_prompts","fs","path","hasSurveyProjectMarkers","root","pkgPath","pkg","deps","key","resolveProjectRoot","explicit","cwd","initCwd","init_resolve_project_root","__esmMin","doc_read_audit_exports","__export","auditDocPaths","formatDocBudgetHint","getSdkDocsRoot","loadManifest","runDocReadAudit","fs","path","normalizeRelPath","rel","tierForLines","lines","OK_MAX","WARN_MAX","resolveDocPath","docsRoot","normalized","candidates","abs","countLines","filePath","collectManifestPaths","manifest","profile","phaseId","paths","fp","p","phase","key","val","qt","entry","field","hintFor","relPath","SLOW_HINTS","relPaths","profileLabel","entries","tier","hint","b","slow","e","blockingSlow","MANDATORY_FAST_PATH_READS","totalLines","sum","manifestPath","options","label","result","c","tag","lineLabel","inventory","root","init_doc_read_audit","__esmMin","init_const","colors","fs","path","readPortFromEnv","raw","n","readViteDevPort","projectRoot","candidates","filePath","match","resolveSurveyDevUrl","pkgPath","framework","pkg","detectFramework","portFromEnv","packageJson","deps","resolveSdkPackageName","SDK_PACKAGE_NAMES","name","isAwsDeployTarget","surveyUiConfig","nextConfigIncludesTranspilePackages","nextConfigSource","sdkPackageName","nextConfigHasStaticExport","viteConfigHasRelativeBase","viteConfigSource","sourceHasUseClientDirective","source","init_detect_framework","__esmMin","fs","path","getSdkTemplatesRoot","loadBundleDepsManifest","manifestPath","raw","mergeDepsIntoPackageJson","projectRoot","pkgPath","manifest","pkg","deps","devDeps","addedDependencies","addedDevDependencies","name","version","getBundleAlwaysPackageNames","installBundleDepsIfMissing","mergeResult","packages","missingFromPkg","getMissingPackages","missingFromNodeModules","getUninstalledNodeModules","missing","c","cmd","formatNpmInstallCommand","runCommandSync","readPackageJson","readInstalledPackages","installed","section","getSurveyTypeDeps","surveyTypes","hasMcqOtherPickers","RANK_ORDER_PACKAGES","MCQ_OTHER_PICKER_PACKAGES","p","isPackageInNodeModules","packageName","parts","modPath","listed","dev","printInstallBlock","options","border","printSurveyTypeInstallBlock","CORE_PEER_PACKAGES","BUNDLE_ALWAYS_PACKAGES","init_install_manifest","__esmMin","init_const","init_detect_framework","init_exec","colors","getErrorMessage","err","init_shared","__esmMin","SURVEY_BASE_URL","init_constants","__esmMin","buildExternalSurveyUrl","instanceId","SURVEY_BASE_URL","buildSurveyUrl","targetId","init_url","__esmMin","init_constants","init_decodeInstanceJwt","__esmMin","getLanguageName","code","norm","LANGUAGE_DISPLAY_NAMES","extractSurveyLanguages","api","dto","languagesSet","defaultLanguage","page","holder","q","lang","init_extractSurveyLanguages","__esmMin","QUESTION_CONFIG_KEY","init_questionConfigKeys","__esmMin","shouldShowQuestionHint","hint","SPRINKLR_DEFAULT_QUESTION_HINT","init_questionHintUtils","__esmMin","getConfigValue","configs","key","c","getConfigFlag","hasReverseScaleOrder","raw","hasNotApplicableOption","init_configUtils","__esmMin","resolveQuestionShell","raw","configs","language","placeholders","required","getConfigFlag","QUESTION_CONFIG_KEY","reqErrConfig","c","requiredErrorMessage","questionText","match","key","questionDescription","descConfig","questionHint","hintConfig","primaryAsset","url","mimeType","alignment","sizeConfig","size","containerMedia","associatedIds","referencedQuestionIds","id","shouldShowQuestionHint","init_resolveQuestionShell","__esmMin","init_questionConfigKeys","init_questionHintUtils","init_configUtils","hasNestedFilters","filter","isAndOrOperator","value","isCustomFieldType","CUSTOM_FIELD_TYPES","mapQuestionConditionEntity","entity","mapCustomFieldConditionEntity","mapConditionEntity","mapSubConditionEntity","mapLogicFilterLeaf","raw","conditionEntity","subConditionEntity","leaf","timezone","mapLogicFilterGroupNode","childFilters","child","mapLogicFilterNode","node","isLogicFilterGroup","mapLogicFilterGroup","init_mapLogicFilters","__esmMin","mapSkipLogics","raw","mapped","item","id","skipToId","entityType","condition","mapLogicFilterGroup","init_mapSkipLogics","__esmMin","init_mapLogicFilters","mapDisplayLogic","raw","condition","mapLogicFilterGroup","init_mapDisplayLogic","__esmMin","init_mapLogicFilters","resolveVariantText","raw","language","placeholders","questionText","match","key","mapQuestionDisplayVariants","variants","mapped","variant","id","displayLogic","mapDisplayLogic","init_mapQuestionDisplayVariants","__esmMin","init_mapDisplayLogic","attachQuestionLogics","question","skipLogics","displayLogic","displayVariants","init_attachQuestionLogics","__esmMin","QUESTION_TYPE","init_questionTypes","__esmMin","shuffleArray","items","result","i","j","parseChoiceRandomization","configs","choiceConfig","config","rawType","type","numberRaw","numberOfChoices","applyChoiceRandomization","options","pinnedOptionIds","requestedCount","count","pinnedSet","id","option","pinned","remaining","slotsLeft","selectedRemaining","init_choiceRandomization","__esmMin","applyMcqChoiceRandomization","options","randomization","defaultOptionIds","otherOptions","option","regularOptions","regularDefaultIds","id","randomizedRegular","shuffleOptions","applyChoiceRandomization","init_applyMcqChoiceRandomization","__esmMin","init_choiceRandomization","mapAnswerLogic","raw","condition","mapLogicFilterGroup","init_mapAnswerLogic","__esmMin","init_mapLogicFilters","findConfig","configs","key","c","firstValue","config","parseNumber","raw","n","mapDateFormat","normalized","mapContentType","upper","extractContentTypeConfig","otherConfig","contentTypeConfig","contentType","contentChildren","errorMessage","base","minCharacters","maxCharacters","minNumber","maxNumber","decimalCount","countryCodes","dateFormat","dateRange","minDate","maxDate","extractOtherOptionConfig","answerDetail","fallbackLabel","childConfigs","label","helpText","markRequired","placeholder","contentConfig","init_extractOtherOptionConfig","__esmMin","buildMcqOptions","question","language","a","i","answerLogic","mapAnswerLogic","optionLabel","otherOption","extractOtherOptionConfig","init_buildMcqOptions","__esmMin","init_mapAnswerLogic","init_extractOtherOptionConfig","extractAnswerConditions","configs","conditionConfig","c","minMaxConfig","minRaw","maxRaw","errorMessage","minSelections","maxSelections","init_extractAnswerConditions","__esmMin","extractDefaultOptionIds","configs","validOptionIds","defaultAnswerConfig","c","ids","validSet","filtered","id","init_extractDefaultOptionIds","__esmMin","mapMcqQuestion","raw","shell","language","configs","selectionMode","c","displayFormat","columnsConfig","columnCount","builtOptions","buildMcqOptions","defaultOptionIdsBeforeRandomization","extractDefaultOptionIds","o","randomization","parseChoiceRandomization","options","shuffleOptions","applyMcqChoiceRandomization","defaultOptionIds","answerConditions","extractAnswerConditions","QUESTION_TYPE","init_mapMcqQuestion","__esmMin","init_questionTypes","init_choiceRandomization","init_applyMcqChoiceRandomization","init_buildMcqOptions","init_extractAnswerConditions","init_extractDefaultOptionIds","writeLog","level","message","meta","loggingEnabled","timestamp","badge","style","BADGE_STYLES","sdkLogger","init_logger","__esmMin","val","msg","metric","logUnknownAnswerType","answerType","questionId","sdkLogger","init_mapperLogger","__esmMin","init_logger","DISPLAY_STYLE","API_STYLE_VALUE","NPS_BUTTON_STYLE","init_displayStyles","__esmMin","extractHintLabels","answerDetails","language","hints","a","init_extractHintLabels","__esmMin","buildSelectableScalePoints","question","language","options","selectable","a","i","_","init_buildSelectableScalePoints","__esmMin","buildNpsScalePoints","question","language","buildSelectableScalePoints","init_buildNpsScalePoints","__esmMin","init_buildSelectableScalePoints","mapNpsQuestion","raw","shell","configs","language","hintLabels","extractHintLabels","minLabel","maxLabel","midLabel","options","buildNpsScalePoints","reverseScaleOrder","hasReverseScaleOrder","midLabelIndex","buttonStyle","NPS_BUTTON_STYLE","variant","getConfigValue","QUESTION_CONFIG_KEY","showScaleNumbers","QUESTION_TYPE","init_mapNpsQuestion","__esmMin","init_questionTypes","init_questionConfigKeys","init_displayStyles","init_extractHintLabels","init_buildNpsScalePoints","init_configUtils","mapTextInputQuestion","raw","shell","configs","language","contentTypeConfig","c","maxCharConfig","cc","maxCharacterCount","inputVariant","textDetail","placeholder","QUESTION_TYPE","init_mapTextInputQuestion","__esmMin","init_questionTypes","detectMatrixFormat","configs","configsString","init_detectMatrixFormat","__esmMin","resolveSubQuestionText","sub","language","isBipolar","subQ","leftText","rawText","init_resolveStatementText","__esmMin","resolveOppositeStatementText","sub","language","isBipolar","subQ","rightText","matrixAdditional","text","rawText","buildCfmStatementRows","question","rowSrc","answerLogic","mapAnswerLogic","oppositeStatementText","resolveSubQuestionText","a","i","init_buildCfmStatementRows","__esmMin","init_resolveStatementText","init_mapAnswerLogic","buildScaleColumns","question","language","sub","label","resolveSubQuestionText","answerLogic","mapAnswerLogic","a","i","init_buildScaleColumns","__esmMin","init_mapAnswerLogic","init_resolveStatementText","mapCfmMatrixQuestion","raw","shell","language","configs","statementLayout","getConfigValue","QUESTION_CONFIG_KEY","statementRows","buildCfmStatementRows","scaleColumns","buildScaleColumns","gridLayout","detectMatrixFormat","selectionMode","c","transposeTable","getConfigFlag","repeatColumnHeaders","notApplicable","hasNotApplicableOption","effectiveTranspose","showColumnHeaders","scaleAnchorLabels","a","QUESTION_TYPE","init_mapCfmMatrixQuestion","__esmMin","init_questionTypes","init_questionConfigKeys","init_detectMatrixFormat","init_buildCfmStatementRows","init_buildScaleColumns","init_configUtils","detectDisplayStyle","configs","dataSubType","searchString","c","buttonType","getConfigValue","QUESTION_CONFIG_KEY","API_STYLE_VALUE","DISPLAY_STYLE","knownStyles","init_detectDisplayStyle","__esmMin","init_questionConfigKeys","init_displayStyles","init_configUtils","buildSimpleStatementRows","question","language","rowSrc","sub","answerLogic","mapAnswerLogic","resolveSubQuestionText","a","i","init_buildSimpleStatementRows","__esmMin","init_resolveStatementText","init_mapAnswerLogic","resolveMatrixScaleOptions","raw","configs","language","scaleColumns","notApplicable","hasNotApplicableOption","reverseScaleOrder","hasReverseScaleOrder","scaleAnchorLabels","a","resolvedColumns","init_resolveMatrixScaleOptions","__esmMin","init_configUtils","mapCsatQuestion","raw","shell","language","configs","scaleColumns","scaleAnchorLabels","hasNotApplicableOption","reverseScaleOrder","resolveMatrixScaleOptions","buildScaleColumns","QUESTION_TYPE","buildSimpleStatementRows","detectDisplayStyle","detectMatrixFormat","init_mapCsatQuestion","__esmMin","init_questionTypes","init_detectDisplayStyle","init_detectMatrixFormat","init_buildScaleColumns","init_buildSimpleStatementRows","init_resolveMatrixScaleOptions","mapRatingMatrixQuestion","raw","shell","language","configs","scaleColumns","scaleAnchorLabels","hasNotApplicableOption","reverseScaleOrder","resolveMatrixScaleOptions","buildScaleColumns","minLabel","maxLabel","extractHintLabels","QUESTION_TYPE","buildSimpleStatementRows","detectDisplayStyle","detectMatrixFormat","init_mapRatingMatrixQuestion","__esmMin","init_questionTypes","init_detectDisplayStyle","init_detectMatrixFormat","init_extractHintLabels","init_buildScaleColumns","init_buildSimpleStatementRows","init_resolveMatrixScaleOptions","buildSliderMatrixRows","question","language","baseMin","baseMax","baseStep","buildSimpleStatementRows","row","init_buildSliderMatrixRows","__esmMin","init_buildSimpleStatementRows","mapSliderMatrixQuestion","raw","shell","language","configs","sliderConfig","c","childConfigs","rawMin","rawMax","rawStep","rawTicks","min","max","step","tickCount","enrichedRaw","statementRows","buildSliderMatrixRows","scaleAnchorLabels","a","getFlag","keys","key","x","isGraphics","enableInputBox","displayValues","hasNotApplicableOption","answerOptions","marks","markStep","i","tickPosition","tickLabel","QUESTION_TYPE","init_mapSliderMatrixQuestion","__esmMin","init_questionTypes","init_buildSliderMatrixRows","buildMediaConfig","question","add","url","mimeType","title","assets","asset","configs","alignConfig","c","sizeConfig","alignment","size","init_buildMediaConfig","__esmMin","mapTextAndMediaQuestion","raw","shell","media","buildMediaConfig","_containerMedia","shellFields","questionText","headerDetail","d","hasMedia","QUESTION_TYPE","init_mapTextAndMediaQuestion","__esmMin","init_questionTypes","init_buildMediaConfig","mapFileUploadQuestion","raw","shell","language","configs","uploadMessageDetail","a","uploadMessage","supportedFileFormats","c","ext","maxFileCountConfig","maxFileCount","fileSizeLimitConfig","sizeLimitId","cc","sizeFormatId","fileSizeLimit","fileSizeLimitType","QUESTION_TYPE","init_mapFileUploadQuestion","__esmMin","init_questionTypes","buildHeatmapRegions","apiRegions","imageWidth","imageHeight","referenceWidth","region","referenceHeight","init_buildHeatmapRegions","__esmMin","mapHeatmapQuestion","raw","shell","metadata","asset","imageUrl","rawMax","maxClicksAllowed","regions","referenceWidth","referenceHeight","buildHeatmapRegions","QUESTION_TYPE","init_mapHeatmapQuestion","__esmMin","init_questionTypes","init_buildHeatmapRegions","buildRankOrderOptions","question","language","answer","index","answerLogic","mapAnswerLogic","asset","imageUrl","previewImageUrl","init_buildRankOrderOptions","__esmMin","init_mapAnswerLogic","parseBooleanConfig","configs","key","config","mapInteractionMode","rawValue","mapOptionDisplay","mapRankOrderQuestion","raw","shell","language","answerTypeConfig","optionTypeConfig","builtOptions","buildRankOrderOptions","randomization","parseChoiceRandomization","options","shuffleOptions","applyChoiceRandomization","QUESTION_TYPE","init_mapRankOrderQuestion","__esmMin","init_questionTypes","init_choiceRandomization","init_buildRankOrderOptions","resolveQuestionMapper","answerType","QUESTION_MAPPERS","mapMcq","mapNps","mapTextInput","mapCfmMatrix","mapCsatMatrix","mapRatingMatrix","mapSliderMatrix","mapTextAndMedia","mapFileUpload","mapHeatmap","mapRankOrder","init_registry","__esmMin","init_questionTypes","init_mapMcqQuestion","init_mapNpsQuestion","init_mapTextInputQuestion","init_mapCfmMatrixQuestion","init_mapCsatQuestion","init_mapRatingMatrixQuestion","init_mapSliderMatrixQuestion","init_mapTextAndMediaQuestion","init_mapFileUploadQuestion","init_mapHeatmapQuestion","init_mapRankOrderQuestion","raw","shell","language","mapMcqQuestion","configs","mapNpsQuestion","mapTextInputQuestion","mapCfmMatrixQuestion","mapCsatQuestion","mapRatingMatrixQuestion","mapSliderMatrixQuestion","mapTextAndMediaQuestion","mapFileUploadQuestion","mapHeatmapQuestion","mapRankOrderQuestion","QUESTION_TYPE","mapQuestion","raw","language","placeholders","configs","shell","resolveQuestionShell","skipLogics","mapSkipLogics","displayLogic","mapDisplayLogic","displayVariants","mapQuestionDisplayVariants","withLogics","question","attachQuestionLogics","mapper","resolveQuestionMapper","logUnknownAnswerType","mapMcqQuestion","init_question","__esmMin","init_resolveQuestionShell","init_mapSkipLogics","init_mapDisplayLogic","init_mapQuestionDisplayVariants","init_attachQuestionLogics","init_mapMcqQuestion","init_mapperLogger","init_registry","mapCtaButton","api","language","options","translation","label","enabled","inputPlaceholder","ctaDescription","mapPageCtaConfig","next","previous","mapSpecialPageCtas","ctas","start","key","SPECIAL_PAGE_CTA_KEYS","mapped","init_mapCtaButton","__esmMin","mapSurveyPages","api","surveyLanguage","placeholders","dto","page","index","questions","holder","q","mapQuestion","cta","mapPageCtaConfig","init_mapSurveyPages","__esmMin","init_question","init_mapCtaButton","resolveSpecialPageText","page","language","translations","header","description","ctas","mapSpecialPageCtas","ctaLabel","displayLogic","mapDisplayLogic","title","mapSpecialPages","api","dto","endPages","mapPhaseFlags","statusPaused","init_mapSpecialPages","__esmMin","init_mapDisplayLogic","init_mapCtaButton","resolveSurveyLanguage","api","language","mapSurvey","placeholders","surveyLanguage","languages","extractSurveyLanguages","pages","mapSurveyPages","introPage","endPages","pausedPage","submittedPage","expiredPage","quotaFulfilledPage","mapSpecialPages","phaseFlags","mapPhaseFlags","submitCta","mapCtaButton","init_mapSurvey","__esmMin","init_decodeInstanceJwt","init_extractSurveyLanguages","init_mapSurveyPages","init_mapSpecialPages","init_mapCtaButton","QUESTION_TYPE_LITERALS","init_ui_config_types","__esmMin","fs","path","parseEnvFile","content","out","line","trimmed","eq","key","value","loadEnvVars","projectRoot","merged","file","abs","resolveInstanceIdFromEnv","override","env","extractSurveyTypesFromSurvey","survey","types","page","question","t","QUESTION_TYPE_LITERALS","fetchSurveyFromEnv","instanceIdOverride","instanceId","url","buildSurveyUrl","response","err","msg","apiResponse","mapSurvey","init_fetch_survey_inventory","__esmMin","init_url","init_mapSurvey","init_ui_config_types","fs","path","isLogicGroup","node","collectCustomFieldIdsFromLogic","nodes","out","entity","collectCustomFieldIdsFromText","text","matches","CUSTOM_FIELD_ID_RE","m","hasAnswerLogicOnQuestion","question","QUESTION_TYPE","o","r","c","matrixDisplayStyle","surveyHasMcqOtherOption","survey","page","surveyHasMcqOtherPickerTypes","option","contentType","MCQ_OTHER_PICKER_CONTENT_TYPES","extractFrameworkSection","projectRoot","pkgPath","pkg","framework","detectFramework","packageName","resolveSdkPackageName","extractComponentInventory","types","extractSurveyTypesFromSurvey","rows","seen","type","entries","COMPONENT_BY_TYPE","entry","key","t","p","q","extractMatrixVariants","matrixTypes","extractCustomFieldInventory","idToUses","add","id","use","normalized","set","scanLogic","ids","sl","v","textIds","copyIds","opt","row","col","endPage","a","b","uses","extractLogicInventory","cfIds","hasSkip","hasDisplay","hasAnswer","extractPlaceholderTokens","tokenToQuestions","scanText","questionId","match","PLACEHOLDER_RE","raw","token","qids","formatComponentTableRows","block","formatMatrixTableRows","formatCustomFieldTableRows","formatPlaceholderTableRows","formatLogicTableRows","init_survey_inventory_extract","__esmMin","init_questionTypes","init_detect_framework","init_fetch_survey_inventory","fill_implementation_plan_exports","__export","fillImplementationPlanFromFetch","patchImplementationPlan","runFillImplementationPlan","fs","path","replaceSectionTable","content","sectionHeading","tableHeaderPattern","newRows","headingIdx","headerMatch","tableStart","nextSection","tableBodyEnd","before","after","rows","patchFrameworkSection","projectRoot","frameworkLine","packageLine","extractFrameworkSection","out","survey","formatComponentTableRows","extractComponentInventory","formatMatrixTableRows","extractMatrixVariants","mcqOtherLine","surveyHasMcqOtherOption","mcqOtherPickersLine","surveyHasMcqOtherPickerTypes","formatCustomFieldTableRows","extractCustomFieldInventory","formatPlaceholderTableRows","extractPlaceholderTokens","formatLogicTableRows","extractLogicInventory","options","planPath","fetchSurveyFromEnv","surveyTypes","extractSurveyTypesFromSurvey","original","patched","hasMcqOtherPickers","c","printSurveyTypeInstallBlock","init_fill_implementation_plan","__esmMin","init_const","init_fetch_survey_inventory","init_survey_inventory_extract","init_install_manifest","colors","sync_from_fetch_exports","__export","runSyncFromFetch","options","projectRoot","resolveProjectRoot","c","planPath","surveyTypes","hasMcqOtherPickers","runFillImplementationPlan","printSurveyTypeInstallBlock","devUrl","resolveSurveyDevUrl","formatInput2BHandoffBlocks","err","getErrorMessage","init_sync_from_fetch","__esmMin","init_const","init_detect_framework","init_fill_implementation_plan","init_install_manifest","init_resolve_project_root","init_workflow_prompts","init_shared","colors","resolve_deploy_target_exports","__export","SURVEY_DEPLOY_CONFIG_FILE","readDeployTarget","runGetDeployTarget","runSetDeployTarget","writeDeployTarget","fs","path","deployConfigPath","projectRoot","legacyConfigPath","LEGACY_SURVEY_UI_CONFIG_FILE","resolveConfigFile","deployPath","legacyPath","abs","target","outPath","raw","deploy","next","options","resolveProjectRoot","label","formatDeployTargetLabel","c","readWorkflowState","configFile","recordDeployConfirmed","err","getErrorMessage","surveyId","instanceId","survey","fetchSurveyFromEnv","formatInput5HandoffBlocks","init_resolve_deploy_target","__esmMin","init_const","init_resolve_project_root","init_workflow_prompts","init_workflow_state","init_fetch_survey_inventory","init_shared","colors","create_distribution_exports","__export","runCreateDistribution","fs","path","requireEnv","name","value","resolveDashboardApi","DEFAULT_DISTRIBUTION_DASHBOARD_URL","guessContentType","filePath","ext","buildFileManifest","outDir","files","walk","dir","entry","full","rel","sizeBytes","MAX_FILE_BYTES","a","b","MAX_FILES","startDistributionUpload","deployApiBase","parentJwt","s3Key","response","body","uploadFiles","uploads","manifest","mimeByPath","f","failed","item","contentType","completeDistributionUpload","deployId","reportToDashboardOnce","dashboardApi","payload","err","getErrorMessage","reportToDashboardWithRetries","lastError","attempt","REPORT_MAX_ATTEMPTS","result","sleep","REPORT_RETRY_DELAY_MS","options","projectRoot","resolveProjectRoot","instanceId","surveyId","survey","fetchSurveyFromEnv","formatInput5HandoffBlocks","assertDistributionDeployAllowed","c","apiResponse","surveyName","started","liveUrl","formatDistributionDoneHandoffBlocks","recordDistributionS3Key","init_create_distribution","__esmMin","init_fetch_survey_inventory","init_resolve_project_root","init_const","init_shared","init_workflow_prompts","init_workflow_state","colors","ms","resolve","init_const","init_const","init_exec","readline","input","output","askQuestion","query","rl","checkNodeVersion","majorVersion","colors","answer","askQuestion","isWin","isMac","hasCommand","runCommandSync","init_const","init_exec","checkVercelCli","colors","vercelCmd","useNpx","hasCommand","answer","askQuestion","runCommandSync","init_const","execSync","init_exec","ignoreShellOptions","checkVercelLogin","useNpx","colors","hasToken","loggedIn","execSync","askQuestion","loginArgs","loginCmd","finalArgs","runCommandInteractive","init_const","init_exec","runVercelDeploy","useNpx","hasToken","colors","deployArgs","deployCmd","finalDeployArgs","runCommandInteractive","init_workflow_state","init_resolve_project_root","runDeployment","assertDeployAllowed","resolveProjectRoot","colors","checkNodeVersion","useNpx","checkVercelCli","hasToken","checkVercelLogin","runVercelDeploy","init_const","init_doc_read_audit","init_resolve_project_root","init_detect_framework","fs","path","readPackageJson","projectRoot","pkgPath","findFirstExisting","candidates","rel","abs","readTextFile","isAwsDeploy","name","configPath","raw","isAwsDeployTarget","globalsHasTailwindImport","globalsCandidates","content","runScaffoldValidation","errors","warnings","pkg","deps","framework","detectFramework","sdkPkg","resolveSdkPackageName","awsDeploy","sdkPkgName","nextConfig","source","nextConfigIncludesTranspilePackages","nextConfigHasStaticExport","surveyPage","sourceHasUseClientDirective","viteConfig","viteConfigHasRelativeBase","c","colors","runScaffoldCheck","options","projectRoot","resolveProjectRoot","result","runScaffoldValidation","warn","err","formatDocBudgetHint","init_const","init_resolve_project_root","fs","path","fs","path","SOURCE_DIRS","INTRO_PAGE_CANDIDATES","SURVEY_PAGE_CANDIDATES","END_PAGE_CANDIDATES","QUESTION_CANDIDATES","MATRIX_SCALE_FILES","MATRIX_RELATED_FILES","AGENT_AUTHORED_STYLE_FILES","HARDCODED_HEX","HARDCODED_RGB","collectSourceFiles","projectRoot","files","dir","abs","walk","out","entry","findFirstExisting","candidates","rel","isAllowedStyleLine","line","trimmed","scanHardcodedStyleIssues","issues","lines","scanIntroStartIssues","introRel","introContent","surveyRel","surveyContent","endPageFiltersEmailCtAs","content","scanEndPageCtaIssues","endRel","readMatrixVariantsFromPlan","planPath","section","l","rows","cells","c","readMatrixFileContents","file","basename","questionDispatcherContent","scanMatrixLayoutIssues","matrixBlob","name","variants","hasBipolar","r","hasTranspose","hasRatingGraphics","hasDropdownStyle","likert","csat","question","scanMatrixInventoryGap","scanMatrixStatementIssues","readMcqOtherFlagFromPlan","match","scanMcqOtherIssues","questionRel","scanProjectSource","stubMatches","internalSdkImports","nextImports","introStartIssues","hardcodedStyleIssues","endPageCtaIssues","matrixStatementIssues","matrixLayoutIssues","mcqOtherIssues","init_exec","init_workflow_prompts","init_workflow_state","init_install_manifest","c","colors","FAST_REQUIRED_DEPS","resolveVerifyScriptPath","projectRoot","copied","sdkScript","runVerifyBuildFast","scaffold","runScaffoldValidation","warn","err","scan","scanProjectSource","m","missingDeps","getMissingPackages","pkg","cmd","formatNpmInstallCommand","tsconfigPath","runCommandSync","formatInput2HandoffBlocks","runVerifyBuildFull","scriptPath","inventoryGap","scanMatrixInventoryGap","structural","writeCoreVerifyPassed","CFM_NEXT_STEP_ASK_DEPLOY","formatInput4DeployHandoffBlocks","runVerifyBuild","options","resolveProjectRoot","init_const","init_resolve_project_root","init_install_manifest","fs","path","init_const","fs","path","c","colors","TSCONFIG_FILES","getViteScaffoldRoot","writeViteScaffoldFilesIfMissing","projectRoot","scaffoldRoot","written","file","src","dest","c","colors","getSdkDocsRoot","copyImplementationPlanTemplate","projectRoot","sdkDocsRoot","dest","template","writeDeployConfigDefault","runSeedPhase5","options","resolveProjectRoot","installBundleDepsIfMissing","writeViteScaffoldFilesIfMissing","init_const","init_shared","c","colors","args","command","printHelp","main","runScaffoldCheck","runSeedPhase5","instanceIdOverride","a","runSyncFromFetch","fast","runVerifyBuild","fromFetch","fillImplementationPlanFromFetch","err","getErrorMessage","runGetDeployTarget","target","runSetDeployTarget","runDeployment","instanceArg","s3KeyArg","runCreateDistribution","runDocReadAudit","profileArg","phaseIdArg","profileFlag","phaseIdFlag","profile","phaseId","v"]}