@datalyr/wizard 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/detection/detector.ts","../src/utils/fs.ts","../src/utils/package-manager.ts","../src/generators/templates/nextjs.ts","../src/generators/templates/react.ts","../src/generators/templates/react-native.ts","../src/installers/env.ts","../src/cli/ui.ts","../src/generators/index.ts","../src/installers/npm.ts","../src/cli/prompts.ts","../src/utils/logger.ts","../src/agent/runner.ts","../src/agent/interface.ts","../src/agent/docs/index.ts","../src/agent/configs/types.ts","../src/agent/events/suggestions.ts","../src/agent/platform/config.ts","../src/generators/ai-context.ts"],"sourcesContent":["import path from 'path';\nimport type { WizardOptions, ProjectContext, InstallationPlan } from './types.js';\nimport { detectFramework, getFrameworkDisplayName } from './detection/detector.js';\nimport { detectPackageManager } from './utils/package-manager.js';\nimport { generateInstallationPlan } from './generators/index.js';\nimport { installPackages } from './installers/npm.js';\nimport { updateEnvFile } from './installers/env.js';\nimport { writeFile, fileExists, findFiles } from './utils/fs.js';\nimport {\n printWelcome,\n printDetection,\n printPlan,\n printSuccess,\n printError,\n printDryRun,\n startSpinner,\n succeedSpinner,\n failSpinner,\n stopSpinner,\n} from './cli/ui.js';\nimport {\n promptApiKey,\n promptFramework,\n promptProceed,\n} from './cli/prompts.js';\nimport { logger } from './utils/logger.js';\n\nexport async function runWizard(options: WizardOptions = {}): Promise<boolean> {\n const cwd = options.cwd || process.cwd();\n const isInteractive = !options.yes && !options.json && !options.dryRun;\n\n try {\n // Welcome message\n if (isInteractive) {\n printWelcome();\n }\n\n // Step 1: Get API key (skip for dry-run/json modes)\n let apiKey = options.apiKey || 'dk_placeholder';\n if (isInteractive) {\n logger.step(1, 5, 'Enter your Datalyr API Key');\n apiKey = await promptApiKey(options.apiKey);\n logger.success('API key validated');\n }\n\n // Step 2: Detect framework\n if (!options.json) {\n logger.step(2, 5, 'Analyzing your project...');\n }\n const spinner = options.json ? null : startSpinner('Scanning project structure...');\n\n let detection = await detectFramework(cwd);\n if (spinner) {\n succeedSpinner(`Detected ${getFrameworkDisplayName(detection.framework)}`);\n }\n\n // If detection failed or user specified framework, use that\n if (detection.framework === 'unknown' || options.framework) {\n stopSpinner();\n if (options.framework) {\n detection = { ...detection, framework: options.framework };\n } else if (isInteractive) {\n logger.warn('Could not auto-detect framework');\n detection.framework = await promptFramework();\n } else {\n printError('Could not detect framework', 'Use --framework to specify');\n return false;\n }\n }\n\n // Build project context\n const packageManager = await detectPackageManager(cwd);\n const entryPoints = await findEntryPoints(cwd, detection.framework);\n\n const context: ProjectContext = {\n cwd,\n framework: detection.framework,\n sdks: detection.sdks,\n language: detection.language,\n packageManager,\n entryPoints,\n existingFiles: [],\n };\n\n if (isInteractive) {\n printDetection({\n framework: getFrameworkDisplayName(detection.framework),\n language: detection.language === 'typescript' ? 'TypeScript' : 'JavaScript',\n sdks: detection.sdks,\n });\n }\n\n // Step 3: Generate installation plan\n if (!options.json && !options.dryRun) {\n logger.step(3, 5, 'Installation Plan');\n }\n const plan = generateInstallationPlan(context, apiKey);\n\n if (options.dryRun) {\n const commands = [\n `${packageManager} add ${plan.packages.join(' ')}`,\n ];\n printDryRun({\n packages: plan.packages,\n files: plan.files,\n commands,\n });\n return true;\n }\n\n if (options.json) {\n console.log(JSON.stringify({\n framework: detection.framework,\n language: detection.language,\n sdks: detection.sdks,\n packages: plan.packages,\n files: plan.files.map(f => ({ path: f.path, action: f.action })),\n envVars: plan.envVars.map(v => v.key),\n }, null, 2));\n return true;\n }\n\n printPlan({\n packages: plan.packages,\n files: plan.files,\n });\n\n // Confirm with user\n if (isInteractive) {\n const proceed = await promptProceed();\n if (!proceed) {\n logger.info('Installation cancelled');\n return false;\n }\n }\n\n // Step 4: Execute installation\n logger.step(4, 5, 'Installing...');\n\n // Install packages\n if (plan.packages.length > 0) {\n const success = await installPackages(cwd, plan.packages);\n if (!success) {\n printError('Failed to install packages');\n return false;\n }\n }\n\n // Create/update files\n for (const file of plan.files) {\n const filePath = path.join(cwd, file.path);\n const exists = await fileExists(filePath);\n\n if (exists && file.action === 'create') {\n logger.warn(`Skipping ${file.path} (already exists)`);\n continue;\n }\n\n const fileSpinner = startSpinner(`Creating ${file.path}...`);\n await writeFile(filePath, file.content);\n succeedSpinner(`Created ${file.path}`);\n }\n\n // Update env file\n if (plan.envVars.length > 0) {\n await updateEnvFile(cwd, plan.envVars);\n }\n\n // Step 5: Success!\n logger.step(5, 5, 'Success!');\n printSuccess();\n\n // Print post-install steps\n if (plan.postInstallSteps.length > 0) {\n logger.header('Next steps:');\n plan.postInstallSteps.forEach((step, i) => {\n console.log(` ${i + 1}. ${step}`);\n });\n console.log();\n }\n\n return true;\n } catch (error) {\n stopSpinner();\n printError(\n error instanceof Error ? error.message : 'Unknown error occurred',\n options.debug ? (error as Error).stack : undefined,\n );\n return false;\n }\n}\n\nasync function findEntryPoints(cwd: string, framework: string): Promise<string[]> {\n const entryPoints: string[] = [];\n\n switch (framework) {\n case 'nextjs':\n // Check for App Router\n const appLayouts = await findFiles(cwd, 'app/layout.{tsx,jsx,ts,js}');\n entryPoints.push(...appLayouts);\n // Check for Pages Router\n const pagesApps = await findFiles(cwd, 'pages/_app.{tsx,jsx,ts,js}');\n entryPoints.push(...pagesApps);\n break;\n\n case 'react':\n case 'react-vite':\n const mains = await findFiles(cwd, 'src/main.{tsx,jsx,ts,js}');\n entryPoints.push(...mains);\n const apps = await findFiles(cwd, 'src/App.{tsx,jsx,ts,js}');\n entryPoints.push(...apps);\n break;\n\n case 'react-native':\n case 'expo':\n const appFiles = await findFiles(cwd, 'App.{tsx,jsx,ts,js}');\n entryPoints.push(...appFiles);\n break;\n }\n\n return entryPoints;\n}\n\n// Re-export types for library usage\nexport type { WizardOptions, ProjectContext, InstallationPlan, Framework, SDK, PackageManager } from './types.js';\nexport { detectFramework } from './detection/detector.js';\nexport { generateInstallationPlan } from './generators/index.js';\nexport { runAgentWizard, type WizardAgentOptions } from './agent/runner.js';\n","import path from 'path';\nimport type { DetectionResult, Framework, PackageJson, SDK } from '../types.js';\nimport { fileExists, readPackageJson, findFile } from '../utils/fs.js';\n\ninterface FrameworkSignal {\n framework: Framework;\n score: number;\n signal: string;\n}\n\nexport async function detectFramework(cwd: string): Promise<DetectionResult> {\n const signals: FrameworkSignal[] = [];\n const pkg = await readPackageJson(cwd);\n const deps = { ...pkg?.dependencies, ...pkg?.devDependencies };\n\n // Check for iOS/Swift project first (no package.json needed)\n if (await fileExists(path.join(cwd, 'Package.swift'))) {\n signals.push({ framework: 'ios', score: 100, signal: 'Package.swift found' });\n }\n const xcodeprojs = await findFile(cwd, ['*.xcodeproj', '*.xcworkspace']);\n if (xcodeprojs) {\n signals.push({ framework: 'ios', score: 90, signal: 'Xcode project found' });\n }\n\n if (!pkg) {\n // No package.json - check if it's iOS or unknown\n const iosScore = signals.filter(s => s.framework === 'ios').reduce((a, b) => a + b.score, 0);\n if (iosScore > 0) {\n return buildResult('ios', signals, null);\n }\n return buildResult('unknown', [], null);\n }\n\n // Next.js detection\n if (deps.next) {\n signals.push({ framework: 'nextjs', score: 100, signal: 'next in dependencies' });\n if (await fileExists(path.join(cwd, 'app', 'layout.tsx')) ||\n await fileExists(path.join(cwd, 'app', 'layout.js'))) {\n signals.push({ framework: 'nextjs', score: 20, signal: 'App Router detected' });\n }\n if (await fileExists(path.join(cwd, 'pages', '_app.tsx')) ||\n await fileExists(path.join(cwd, 'pages', '_app.js'))) {\n signals.push({ framework: 'nextjs', score: 15, signal: 'Pages Router detected' });\n }\n }\n\n // Expo detection (check before React Native)\n if (deps.expo) {\n signals.push({ framework: 'expo', score: 100, signal: 'expo in dependencies' });\n }\n\n // React Native detection\n if (deps['react-native'] && !deps.expo) {\n signals.push({ framework: 'react-native', score: 100, signal: 'react-native in dependencies' });\n }\n\n // Remix detection\n if (deps['@remix-run/react'] || deps['@remix-run/node']) {\n signals.push({ framework: 'remix', score: 100, signal: '@remix-run packages found' });\n }\n\n // Astro detection\n if (deps.astro) {\n signals.push({ framework: 'astro', score: 100, signal: 'astro in dependencies' });\n }\n\n // SvelteKit detection\n if (deps['@sveltejs/kit']) {\n signals.push({ framework: 'sveltekit', score: 100, signal: '@sveltejs/kit in dependencies' });\n } else if (deps.svelte) {\n signals.push({ framework: 'svelte', score: 80, signal: 'svelte in dependencies' });\n }\n\n // Nuxt detection\n if (deps.nuxt) {\n signals.push({ framework: 'nuxt', score: 100, signal: 'nuxt in dependencies' });\n } else if (deps.vue) {\n signals.push({ framework: 'vue', score: 80, signal: 'vue in dependencies' });\n }\n\n // React detection (after Next.js, Remix, Expo, RN)\n if (deps.react && deps['react-dom']) {\n if (!deps.next && !deps['@remix-run/react'] && !deps['react-native'] && !deps.expo) {\n if (deps.vite || deps['@vitejs/plugin-react']) {\n signals.push({ framework: 'react-vite', score: 90, signal: 'React + Vite' });\n } else if (deps['react-scripts']) {\n signals.push({ framework: 'react', score: 85, signal: 'Create React App' });\n } else {\n signals.push({ framework: 'react', score: 70, signal: 'React project' });\n }\n }\n }\n\n // Node.js detection (server-only, no frontend)\n if (deps.express || deps.fastify || deps.koa || deps.hapi) {\n if (!deps.react && !deps.vue && !deps.svelte) {\n signals.push({ framework: 'node', score: 80, signal: 'Node.js server framework' });\n }\n }\n\n // Find the highest scoring framework\n const frameworkScores = new Map<Framework, number>();\n signals.forEach(s => {\n const current = frameworkScores.get(s.framework) || 0;\n frameworkScores.set(s.framework, current + s.score);\n });\n\n let bestFramework: Framework = 'unknown';\n let bestScore = 0;\n frameworkScores.forEach((score, framework) => {\n if (score > bestScore) {\n bestScore = score;\n bestFramework = framework;\n }\n });\n\n return buildResult(bestFramework, signals, pkg);\n}\n\nfunction buildResult(\n framework: Framework,\n signals: FrameworkSignal[],\n pkg: PackageJson | null,\n): DetectionResult {\n const relevantSignals = signals\n .filter(s => s.framework === framework)\n .map(s => s.signal);\n\n const confidence = Math.min(100, signals\n .filter(s => s.framework === framework)\n .reduce((a, b) => a + b.score, 0));\n\n const language = detectLanguage(pkg);\n const sdks = getSDKsForFramework(framework);\n\n const hasAppRouter = framework === 'nextjs' &&\n relevantSignals.some(s => s.includes('App Router'));\n\n return {\n framework,\n confidence,\n signals: relevantSignals,\n sdks,\n language,\n hasAppRouter,\n isExpo: framework === 'expo',\n };\n}\n\nfunction detectLanguage(pkg: PackageJson | null): 'typescript' | 'javascript' {\n if (!pkg) return 'javascript';\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n return deps.typescript ? 'typescript' : 'javascript';\n}\n\nfunction getSDKsForFramework(framework: Framework): SDK[] {\n switch (framework) {\n case 'nextjs':\n case 'remix':\n case 'sveltekit':\n case 'nuxt':\n case 'astro':\n // Full-stack frameworks need both client and server SDKs\n return ['@datalyr/web', '@datalyr/api'];\n\n case 'react':\n case 'react-vite':\n case 'svelte':\n case 'vue':\n // Client-only frameworks\n return ['@datalyr/web'];\n\n case 'react-native':\n case 'expo':\n return ['@datalyr/react-native'];\n\n case 'ios':\n return ['DatalyrSDK'];\n\n case 'node':\n return ['@datalyr/api'];\n\n default:\n return ['@datalyr/web'];\n }\n}\n\nexport function getFrameworkDisplayName(framework: Framework): string {\n const names: Record<Framework, string> = {\n nextjs: 'Next.js',\n react: 'React (Create React App)',\n 'react-vite': 'React (Vite)',\n svelte: 'Svelte',\n sveltekit: 'SvelteKit',\n vue: 'Vue',\n nuxt: 'Nuxt',\n remix: 'Remix',\n astro: 'Astro',\n 'react-native': 'React Native',\n expo: 'Expo',\n ios: 'iOS (Swift)',\n node: 'Node.js',\n unknown: 'Unknown',\n };\n return names[framework];\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { glob } from 'glob';\nimport type { PackageJson } from '../types.js';\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readFile(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\nexport async function readJson<T>(filePath: string): Promise<T | null> {\n try {\n return await fs.readJson(filePath);\n } catch {\n return null;\n }\n}\n\nexport async function readPackageJson(cwd: string): Promise<PackageJson | null> {\n return readJson<PackageJson>(path.join(cwd, 'package.json'));\n}\n\nexport async function getFileTree(cwd: string, depth = 3): Promise<string[]> {\n const pattern = depth === 1 ? '*' : `**/*`;\n const files = await glob(pattern, {\n cwd,\n ignore: [\n 'node_modules/**',\n '.git/**',\n 'dist/**',\n 'build/**',\n '.next/**',\n 'coverage/**',\n '*.log',\n ],\n maxDepth: depth,\n dot: false,\n });\n return files.sort();\n}\n\nexport async function findFile(cwd: string, patterns: string[]): Promise<string | null> {\n for (const pattern of patterns) {\n const matches = await glob(pattern, { cwd, nodir: true });\n if (matches.length > 0) {\n return path.join(cwd, matches[0]);\n }\n }\n return null;\n}\n\nexport async function findFiles(cwd: string, pattern: string): Promise<string[]> {\n const matches = await glob(pattern, {\n cwd,\n ignore: ['node_modules/**', '.git/**'],\n });\n return matches.map(f => path.join(cwd, f));\n}\n\nexport function getExtension(lang: 'typescript' | 'javascript'): string {\n return lang === 'typescript' ? 'ts' : 'js';\n}\n\nexport function getReactExtension(lang: 'typescript' | 'javascript'): string {\n return lang === 'typescript' ? 'tsx' : 'jsx';\n}\n","import path from 'path';\nimport type { PackageManager } from '../types.js';\nimport { fileExists } from './fs.js';\n\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n // Check lock files in order of preference\n if (await fileExists(path.join(cwd, 'bun.lockb'))) {\n return 'bun';\n }\n if (await fileExists(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n }\n if (await fileExists(path.join(cwd, 'yarn.lock'))) {\n return 'yarn';\n }\n if (await fileExists(path.join(cwd, 'package-lock.json'))) {\n return 'npm';\n }\n\n // Default to npm if no lock file found\n return 'npm';\n}\n\nexport function getInstallCommand(pm: PackageManager, packages: string[], dev = false): string {\n const pkgList = packages.join(' ');\n switch (pm) {\n case 'npm':\n return dev ? `npm install -D ${pkgList}` : `npm install ${pkgList}`;\n case 'yarn':\n return dev ? `yarn add -D ${pkgList}` : `yarn add ${pkgList}`;\n case 'pnpm':\n return dev ? `pnpm add -D ${pkgList}` : `pnpm add ${pkgList}`;\n case 'bun':\n return dev ? `bun add -d ${pkgList}` : `bun add ${pkgList}`;\n default:\n // Fallback to npm for unknown package managers\n return dev ? `npm install -D ${pkgList}` : `npm install ${pkgList}`;\n }\n}\n\nexport function getRunCommand(pm: PackageManager, script: string): string {\n switch (pm) {\n case 'npm':\n return `npm run ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'pnpm':\n return `pnpm ${script}`;\n case 'bun':\n return `bun run ${script}`;\n default:\n // Fallback to npm for unknown package managers\n return `npm run ${script}`;\n }\n}\n","import type { GeneratedFile } from '../../types.js';\n\nexport function generateNextJSFiles(options: {\n language: 'typescript' | 'javascript';\n hasAppRouter: boolean;\n apiKey: string;\n}): GeneratedFile[] {\n const { language, hasAppRouter } = options;\n const ext = language === 'typescript' ? 'tsx' : 'jsx';\n const tsExt = language === 'typescript' ? 'ts' : 'js';\n\n const files: GeneratedFile[] = [];\n\n if (hasAppRouter) {\n // App Router setup\n files.push({\n path: `app/providers.${ext}`,\n action: 'create',\n description: 'Datalyr provider component',\n content: generateAppRouterProvider(language),\n });\n\n files.push({\n path: `lib/datalyr.${tsExt}`,\n action: 'create',\n description: 'Server-side Datalyr instance',\n content: generateServerInstance(language),\n });\n } else {\n // Pages Router setup\n files.push({\n path: `lib/datalyr.${tsExt}`,\n action: 'create',\n description: 'Datalyr initialization',\n content: generatePagesRouterInit(language),\n });\n\n files.push({\n path: `lib/datalyr-server.${tsExt}`,\n action: 'create',\n description: 'Server-side Datalyr instance',\n content: generateServerInstance(language),\n });\n }\n\n return files;\n}\n\nfunction generateAppRouterProvider(language: 'typescript' | 'javascript'): string {\n if (language === 'typescript') {\n return `'use client';\n\nimport datalyr from '@datalyr/web';\nimport { useEffect } from 'react';\n\ninterface DatalyrProviderProps {\n children: React.ReactNode;\n}\n\nexport function DatalyrProvider({ children }: DatalyrProviderProps) {\n useEffect(() => {\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID!,\n debug: process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n }, []);\n\n return <>{children}</>;\n}\n`;\n }\n\n return `'use client';\n\nimport datalyr from '@datalyr/web';\nimport { useEffect } from 'react';\n\nexport function DatalyrProvider({ children }) {\n useEffect(() => {\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID,\n debug: process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n }, []);\n\n return <>{children}</>;\n}\n`;\n}\n\nfunction generateServerInstance(language: 'typescript' | 'javascript'): string {\n if (language === 'typescript') {\n return `import Datalyr from '@datalyr/api';\n\n// Server-side Datalyr instance\nexport const datalyr = new Datalyr(process.env.DATALYR_API_KEY!);\n\n// Helper to track server-side events\nexport async function trackServerEvent(\n event: string,\n properties?: Record<string, unknown>,\n userId?: string,\n) {\n await datalyr.track({\n event,\n properties,\n userId,\n timestamp: new Date().toISOString(),\n });\n}\n`;\n }\n\n return `import Datalyr from '@datalyr/api';\n\n// Server-side Datalyr instance\nexport const datalyr = new Datalyr(process.env.DATALYR_API_KEY);\n\n// Helper to track server-side events\nexport async function trackServerEvent(event, properties, userId) {\n await datalyr.track({\n event,\n properties,\n userId,\n timestamp: new Date().toISOString(),\n });\n}\n`;\n}\n\nfunction generatePagesRouterInit(language: 'typescript' | 'javascript'): string {\n if (language === 'typescript') {\n return `import datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr(): void {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID!,\n debug: process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n`;\n }\n\n return `import datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID,\n debug: process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n`;\n}\n\nexport function getNextJSLayoutUpdate(language: 'typescript' | 'javascript'): string {\n return `\n// Add this import at the top of your layout file:\nimport { DatalyrProvider } from './providers';\n\n// Then wrap your {children} with the provider:\n<DatalyrProvider>\n {children}\n</DatalyrProvider>\n`;\n}\n","import type { GeneratedFile } from '../../types.js';\n\nexport function generateReactFiles(options: {\n language: 'typescript' | 'javascript';\n isVite: boolean;\n}): GeneratedFile[] {\n const { language, isVite } = options;\n const ext = language === 'typescript' ? 'ts' : 'js';\n\n return [\n {\n path: `src/lib/datalyr.${ext}`,\n action: 'create',\n description: 'Datalyr initialization',\n content: generateReactInit(language),\n },\n ];\n}\n\nfunction generateReactInit(language: 'typescript' | 'javascript'): string {\n if (language === 'typescript') {\n return `import datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr(): void {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: import.meta.env.VITE_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n trackSPA: true,\n });\n\n initialized = true;\n}\n\n// Re-export for convenience\nexport { datalyr };\n\n// Usage in your main.tsx/App.tsx:\n// import { initDatalyr } from './lib/datalyr';\n// initDatalyr();\n`;\n }\n\n return `import datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: import.meta.env.VITE_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n trackSPA: true,\n });\n\n initialized = true;\n}\n\n// Re-export for convenience\nexport { datalyr };\n\n// Usage in your main.jsx/App.jsx:\n// import { initDatalyr } from './lib/datalyr';\n// initDatalyr();\n`;\n}\n\nexport function getReactMainUpdate(): string {\n return `\n// Add this import at the top of your main.tsx/main.jsx:\nimport { initDatalyr } from './lib/datalyr';\n\n// Then call it before ReactDOM.render:\ninitDatalyr();\n`;\n}\n","import type { GeneratedFile } from '../../types.js';\n\nexport function generateReactNativeFiles(options: {\n language: 'typescript' | 'javascript';\n isExpo: boolean;\n}): GeneratedFile[] {\n const { language, isExpo } = options;\n const ext = language === 'typescript' ? 'ts' : 'js';\n\n return [\n {\n path: `src/utils/datalyr.${ext}`,\n action: 'create',\n description: 'Datalyr initialization',\n content: generateReactNativeInit(language, isExpo),\n },\n ];\n}\n\nfunction generateReactNativeInit(\n language: 'typescript' | 'javascript',\n isExpo: boolean,\n): string {\n const importPath = isExpo ? '@datalyr/react-native/expo' : '@datalyr/react-native';\n\n if (language === 'typescript') {\n return `import { Datalyr } from '${importPath}';\n\n// IMPORTANT: Set DATALYR_API_KEY in your environment\n// For Expo: Add to app.config.js extra field and use expo-constants\n// For bare RN: Use react-native-config or babel-plugin-transform-inline-environment-variables\nconst DATALYR_API_KEY = process.env.DATALYR_API_KEY;\n\nlet initialized = false;\n\nexport async function initDatalyr(): Promise<void> {\n if (initialized) return;\n\n if (!DATALYR_API_KEY) {\n console.warn('Datalyr: API key not configured. Set DATALYR_API_KEY environment variable.');\n return;\n }\n\n await Datalyr.initialize({\n apiKey: DATALYR_API_KEY,\n enableAutoEvents: true,\n enableAttribution: true,\n debug: __DEV__,\n });\n\n initialized = true;\n}\n\n// Re-export for convenience\nexport { Datalyr };\n\n// Track custom events\nexport function trackEvent(event: string, properties?: Record<string, unknown>): void {\n Datalyr.track(event, properties);\n}\n\n// Identify users\nexport function identifyUser(userId: string, traits?: Record<string, unknown>): void {\n Datalyr.identify(userId, traits);\n}\n`;\n }\n\n return `import { Datalyr } from '${importPath}';\n\n// IMPORTANT: Set DATALYR_API_KEY in your environment\n// For Expo: Add to app.config.js extra field and use expo-constants\n// For bare RN: Use react-native-config or babel-plugin-transform-inline-environment-variables\nconst DATALYR_API_KEY = process.env.DATALYR_API_KEY;\n\nlet initialized = false;\n\nexport async function initDatalyr() {\n if (initialized) return;\n\n if (!DATALYR_API_KEY) {\n console.warn('Datalyr: API key not configured. Set DATALYR_API_KEY environment variable.');\n return;\n }\n\n await Datalyr.initialize({\n apiKey: DATALYR_API_KEY,\n enableAutoEvents: true,\n enableAttribution: true,\n debug: __DEV__,\n });\n\n initialized = true;\n}\n\n// Re-export for convenience\nexport { Datalyr };\n\n// Track custom events\nexport function trackEvent(event, properties) {\n Datalyr.track(event, properties);\n}\n\n// Identify users\nexport function identifyUser(userId, traits) {\n Datalyr.identify(userId, traits);\n}\n`;\n}\n\nexport function getReactNativeAppUpdate(): string {\n return `\n// Add this import at the top of your App.tsx/App.js:\nimport { initDatalyr } from './src/utils/datalyr';\n\n// Then call it in a useEffect:\nuseEffect(() => {\n initDatalyr();\n}, []);\n`;\n}\n","import path from 'path';\nimport type { EnvVar } from '../types.js';\nimport { fileExists, readFile, writeFile } from '../utils/fs.js';\nimport { startSpinner, succeedSpinner } from '../cli/ui.js';\n\nexport async function updateEnvFile(\n cwd: string,\n envVars: EnvVar[],\n options: { dryRun?: boolean; envFile?: string } = {},\n): Promise<boolean> {\n if (envVars.length === 0) return true;\n\n const envFileName = options.envFile || '.env.local';\n const envPath = path.join(cwd, envFileName);\n const examplePath = path.join(cwd, '.env.example');\n\n if (options.dryRun) {\n return true;\n }\n\n const spinner = startSpinner(`Updating ${envFileName}...`);\n\n try {\n // Read existing env file\n let existingContent = '';\n if (await fileExists(envPath)) {\n existingContent = (await readFile(envPath)) || '';\n }\n\n // Parse existing env vars\n const existingVars = parseEnvFile(existingContent);\n\n // Build new content\n const lines: string[] = [];\n if (existingContent) {\n lines.push(existingContent.trim());\n lines.push('');\n }\n\n // Add Datalyr section header if we have new vars to add\n const newVars = envVars.filter(v => !existingVars.has(v.key));\n if (newVars.length > 0) {\n lines.push('# Datalyr Analytics');\n for (const envVar of newVars) {\n if (envVar.description) {\n lines.push(`# ${envVar.description}`);\n }\n lines.push(`${envVar.key}=${envVar.value}`);\n }\n }\n\n // Write env file\n await writeFile(envPath, lines.join('\\n') + '\\n');\n\n // Also update .env.example if it exists\n if (await fileExists(examplePath)) {\n await updateEnvExample(examplePath, envVars);\n }\n\n succeedSpinner(`Updated ${envFileName}`);\n return true;\n } catch (error) {\n console.error(error);\n return false;\n }\n}\n\nasync function updateEnvExample(examplePath: string, envVars: EnvVar[]): Promise<void> {\n let content = (await readFile(examplePath)) || '';\n const existingVars = parseEnvFile(content);\n\n const newVars = envVars.filter(v => !existingVars.has(v.key));\n if (newVars.length === 0) return;\n\n const lines = content.trim().split('\\n');\n lines.push('');\n lines.push('# Datalyr Analytics');\n\n for (const envVar of newVars) {\n // Use placeholder value in example\n const exampleValue = envVar.isPublic ? 'your_workspace_id' : 'dk_your_api_key';\n lines.push(`${envVar.key}=${exampleValue}`);\n }\n\n await writeFile(examplePath, lines.join('\\n') + '\\n');\n}\n\nfunction parseEnvFile(content: string): Set<string> {\n const vars = new Set<string>();\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) {\n const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=/);\n if (match) {\n vars.add(match[1]);\n }\n }\n }\n\n return vars;\n}\n\nexport function getEnvVarsForFramework(\n framework: string,\n apiKey: string,\n): EnvVar[] {\n const vars: EnvVar[] = [];\n\n // Get the appropriate public env var prefix for the framework\n const getPublicEnvVarKey = (fw: string): string => {\n switch (fw) {\n case 'react':\n case 'react-vite':\n return 'VITE_DATALYR_WORKSPACE_ID';\n case 'svelte':\n case 'sveltekit':\n return 'PUBLIC_DATALYR_WORKSPACE_ID';\n case 'vue':\n case 'nuxt':\n return 'NUXT_PUBLIC_DATALYR_WORKSPACE_ID';\n case 'remix':\n case 'astro':\n case 'nextjs':\n default:\n return 'NEXT_PUBLIC_DATALYR_WORKSPACE_ID';\n }\n };\n\n // All web/full-stack frameworks need the public workspace ID\n if (['nextjs', 'react', 'react-vite', 'svelte', 'sveltekit', 'vue', 'nuxt', 'remix', 'astro'].includes(framework)) {\n vars.push({\n key: getPublicEnvVarKey(framework),\n value: '',\n description: 'Your Datalyr workspace ID (get from dashboard)',\n isPublic: true,\n });\n }\n\n // Full-stack frameworks also need server-side API key\n if (['nextjs', 'sveltekit', 'nuxt', 'remix', 'astro', 'node'].includes(framework)) {\n vars.push({\n key: 'DATALYR_API_KEY',\n value: apiKey,\n description: 'Datalyr API key for server-side tracking',\n isPublic: false,\n });\n }\n\n return vars;\n}\n","import ora, { Ora } from 'ora';\nimport chalk from 'chalk';\n\nlet currentSpinner: Ora | null = null;\n\nexport function startSpinner(text: string): Ora {\n if (currentSpinner) {\n currentSpinner.stop();\n }\n currentSpinner = ora({ text, color: 'cyan' }).start();\n return currentSpinner;\n}\n\nexport function succeedSpinner(text?: string): void {\n if (currentSpinner) {\n currentSpinner.succeed(text);\n currentSpinner = null;\n }\n}\n\nexport function failSpinner(text?: string): void {\n if (currentSpinner) {\n currentSpinner.fail(text);\n currentSpinner = null;\n }\n}\n\nexport function stopSpinner(): void {\n if (currentSpinner) {\n currentSpinner.stop();\n currentSpinner = null;\n }\n}\n\nexport function printWelcome(): void {\n console.log();\n console.log(chalk.cyan('╔════════════════════════════════════════════════╗'));\n console.log(chalk.cyan('║') + chalk.bold(' Welcome to Datalyr Wizard! ') + chalk.cyan('║'));\n console.log(chalk.cyan('║') + ' AI-powered SDK installation for Datalyr ' + chalk.cyan('║'));\n console.log(chalk.cyan('╚════════════════════════════════════════════════╝'));\n console.log();\n}\n\nexport function printSuccess(): void {\n console.log();\n console.log(chalk.green.bold('Installation complete!'));\n console.log();\n console.log(chalk.bold('Next steps:'));\n console.log();\n console.log(' 1. Add your workspace ID to .env.local:');\n console.log(chalk.cyan(' NEXT_PUBLIC_DATALYR_WORKSPACE_ID=your_workspace_id'));\n console.log();\n console.log(' 2. Start tracking events:');\n console.log(chalk.cyan(\" datalyr.track('button_clicked', { button: 'signup' })\"));\n console.log();\n console.log(' 3. View your data:');\n console.log(chalk.cyan(' https://app.datalyr.com/dashboard'));\n console.log();\n console.log(chalk.gray('Documentation: https://docs.datalyr.com'));\n console.log(chalk.gray('Support: hello@datalyr.com'));\n console.log();\n}\n\nexport function printPlan(plan: {\n packages: string[];\n files: { path: string; action: string; description: string }[];\n}): void {\n console.log();\n console.log(chalk.bold('Installation Plan:'));\n console.log();\n\n if (plan.packages.length > 0) {\n console.log(chalk.cyan(' 📦 Packages:'));\n plan.packages.forEach(pkg => {\n console.log(` • ${pkg}`);\n });\n console.log();\n }\n\n if (plan.files.length > 0) {\n console.log(chalk.cyan(' 📝 Files to create/update:'));\n plan.files.forEach(file => {\n const actionIcon = file.action === 'create' ? chalk.green('(create)') : chalk.yellow('(update)');\n console.log(` • ${file.path} ${actionIcon}`);\n });\n console.log();\n }\n}\n\nexport function printDetection(result: {\n framework: string;\n language: string;\n sdks: string[];\n}): void {\n console.log();\n console.log(chalk.bold('Detected Configuration:'));\n console.log(` Framework: ${chalk.cyan(result.framework)}`);\n console.log(` Language: ${chalk.cyan(result.language)}`);\n console.log(` SDK Needs: ${chalk.cyan(result.sdks.join(' + '))}`);\n console.log();\n}\n\nexport function printError(message: string, details?: string): void {\n console.log();\n console.log(chalk.red.bold('Error:'), message);\n if (details) {\n console.log(chalk.gray(details));\n }\n console.log();\n}\n\nexport function printDryRun(plan: {\n packages: string[];\n files: { path: string; action: string; content: string }[];\n commands: string[];\n}): void {\n console.log();\n console.log(chalk.yellow.bold('[DRY RUN] No changes will be made'));\n console.log();\n\n if (plan.commands.length > 0) {\n console.log(chalk.bold('Would run:'));\n plan.commands.forEach(cmd => console.log(chalk.cyan(` $ ${cmd}`)));\n console.log();\n }\n\n if (plan.files.length > 0) {\n console.log(chalk.bold('Would create/update files:'));\n plan.files.forEach(file => {\n console.log(chalk.cyan(` ${file.path} (${file.action})`));\n });\n console.log();\n }\n}\n","import type { Framework, GeneratedFile, InstallationPlan, ProjectContext, EnvVar } from '../types.js';\nimport { generateNextJSFiles } from './templates/nextjs.js';\nimport { generateReactFiles } from './templates/react.js';\nimport { generateReactNativeFiles } from './templates/react-native.js';\nimport { getEnvVarsForFramework } from '../installers/env.js';\n\nexport function generateInstallationPlan(\n context: ProjectContext,\n apiKey: string,\n): InstallationPlan {\n const packages = context.sdks.filter(sdk => sdk !== 'DatalyrSDK') as string[];\n const files = generateFilesForFramework(context, apiKey);\n const envVars = getEnvVarsForFramework(context.framework, apiKey);\n const postInstallSteps = getPostInstallSteps(context);\n\n return {\n packages,\n files,\n envVars,\n postInstallSteps,\n };\n}\n\nfunction generateFilesForFramework(\n context: ProjectContext,\n apiKey: string,\n): GeneratedFile[] {\n const { framework, language } = context;\n\n switch (framework) {\n case 'nextjs':\n return generateNextJSFiles({\n language,\n hasAppRouter: context.entryPoints.some(p => p.includes('app/layout')),\n apiKey,\n });\n\n case 'react':\n case 'react-vite':\n return generateReactFiles({\n language,\n isVite: framework === 'react-vite',\n });\n\n case 'react-native':\n case 'expo':\n return generateReactNativeFiles({\n language,\n isExpo: framework === 'expo',\n });\n\n case 'sveltekit':\n return generateSvelteKitFiles(language, apiKey);\n\n case 'svelte':\n return generateSvelteFiles(language);\n\n case 'node':\n return generateNodeFiles(language, apiKey);\n\n case 'ios':\n return generateIOSFiles(apiKey);\n\n default:\n // Generic web SDK setup\n return generateGenericWebFiles(language);\n }\n}\n\nfunction generateSvelteKitFiles(\n language: 'typescript' | 'javascript',\n apiKey: string,\n): GeneratedFile[] {\n const ext = language === 'typescript' ? 'ts' : 'js';\n return [\n {\n path: `src/lib/datalyr.${ext}`,\n action: 'create',\n description: 'Client-side Datalyr initialization',\n content: `import datalyr from '@datalyr/web';\nimport { browser } from '$app/environment';\n\nlet initialized = false;\n\nexport function initDatalyr()${language === 'typescript' ? ': void' : ''} {\n if (initialized || !browser) return;\n\n datalyr.init({\n workspaceId: import.meta.env.VITE_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n`,\n },\n {\n path: `src/lib/datalyr.server.${ext}`,\n action: 'create',\n description: 'Server-side Datalyr instance',\n content: `import Datalyr from '@datalyr/api';\nimport { DATALYR_API_KEY } from '$env/static/private';\n\nexport const datalyr = new Datalyr(DATALYR_API_KEY);\n`,\n },\n ];\n}\n\nfunction generateSvelteFiles(language: 'typescript' | 'javascript'): GeneratedFile[] {\n const ext = language === 'typescript' ? 'ts' : 'js';\n return [\n {\n path: `src/lib/datalyr.${ext}`,\n action: 'create',\n description: 'Datalyr initialization',\n content: `import datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr()${language === 'typescript' ? ': void' : ''} {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: import.meta.env.VITE_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n`,\n },\n ];\n}\n\nfunction generateNodeFiles(\n language: 'typescript' | 'javascript',\n apiKey: string,\n): GeneratedFile[] {\n const ext = language === 'typescript' ? 'ts' : 'js';\n return [\n {\n path: `src/lib/datalyr.${ext}`,\n action: 'create',\n description: 'Datalyr server instance',\n content: language === 'typescript'\n ? `import Datalyr from '@datalyr/api';\n\nconst apiKey = process.env.DATALYR_API_KEY;\nif (!apiKey) {\n throw new Error('DATALYR_API_KEY environment variable is required');\n}\n\nexport const datalyr = new Datalyr(apiKey);\n\nexport async function trackEvent(\n event: string,\n properties?: Record<string, unknown>,\n userId?: string,\n): Promise<void> {\n await datalyr.track({\n event,\n properties,\n userId,\n timestamp: new Date().toISOString(),\n });\n}\n`\n : `import Datalyr from '@datalyr/api';\n\nconst apiKey = process.env.DATALYR_API_KEY;\nif (!apiKey) {\n throw new Error('DATALYR_API_KEY environment variable is required');\n}\n\nexport const datalyr = new Datalyr(apiKey);\n\nexport async function trackEvent(event, properties, userId) {\n await datalyr.track({\n event,\n properties,\n userId,\n timestamp: new Date().toISOString(),\n });\n}\n`,\n },\n ];\n}\n\nfunction generateIOSFiles(_apiKey: string): GeneratedFile[] {\n return [\n {\n path: 'DatalyrConfig.swift',\n action: 'create',\n description: 'Datalyr iOS configuration',\n content: `import DatalyrSDK\nimport Foundation\n\nstruct DatalyrConfig {\n /// Initialize Datalyr SDK\n /// Reads configuration from Info.plist for security\n static func initialize() {\n guard let apiKey = Bundle.main.object(forInfoDictionaryKey: \"DATALYR_API_KEY\") as? String,\n let workspaceId = Bundle.main.object(forInfoDictionaryKey: \"DATALYR_WORKSPACE_ID\") as? String else {\n #if DEBUG\n fatalError(\"Datalyr API key or workspace ID not found in Info.plist. Add DATALYR_API_KEY and DATALYR_WORKSPACE_ID to your Info.plist.\")\n #else\n print(\"[Datalyr] Warning: API key or workspace ID not configured\")\n return\n #endif\n }\n\n Datalyr.shared.configure(\n apiKey: apiKey,\n workspaceId: workspaceId,\n options: DatalyrOptions(\n debug: false, // Set to true during development\n enableAutoEvents: true,\n enableAttribution: true\n )\n )\n }\n}\n\n// SETUP INSTRUCTIONS:\n// 1. Add to Info.plist:\n// <key>DATALYR_API_KEY</key>\n// <string>$(DATALYR_API_KEY)</string>\n// <key>DATALYR_WORKSPACE_ID</key>\n// <string>$(DATALYR_WORKSPACE_ID)</string>\n//\n// 2. Add to your .xcconfig file (recommended) or scheme environment:\n// DATALYR_API_KEY = dk_your_api_key_here\n// DATALYR_WORKSPACE_ID = your_workspace_id_here\n//\n// 3. Call DatalyrConfig.initialize() in your App's init or AppDelegate\n`,\n },\n {\n path: 'Datalyr.xcconfig',\n action: 'create',\n description: 'Datalyr configuration file (add your API key here)',\n content: `// Datalyr Configuration\n// Do NOT commit this file with real credentials to version control\n// Add to .gitignore: *.xcconfig\n\nDATALYR_API_KEY = YOUR_API_KEY_HERE\nDATALYR_WORKSPACE_ID = YOUR_WORKSPACE_ID_HERE\n`,\n },\n ];\n}\n\nfunction generateGenericWebFiles(language: 'typescript' | 'javascript'): GeneratedFile[] {\n const ext = language === 'typescript' ? 'ts' : 'js';\n return [\n {\n path: `src/lib/datalyr.${ext}`,\n action: 'create',\n description: 'Datalyr initialization',\n content: `import datalyr from '@datalyr/web';\n\nexport function initDatalyr()${language === 'typescript' ? ': void' : ''} {\n datalyr.init({\n workspaceId: 'YOUR_WORKSPACE_ID',\n debug: true,\n });\n}\n\nexport { datalyr };\n`,\n },\n ];\n}\n\nfunction getPostInstallSteps(context: ProjectContext): string[] {\n const steps: string[] = [];\n\n switch (context.framework) {\n case 'nextjs':\n steps.push('Add your workspace ID to .env.local');\n steps.push('Import DatalyrProvider in your app/layout.tsx');\n break;\n\n case 'react':\n case 'react-vite':\n steps.push('Add VITE_DATALYR_WORKSPACE_ID to your .env file');\n steps.push('Call initDatalyr() in your main.tsx');\n break;\n\n case 'react-native':\n case 'expo':\n steps.push('Run: cd ios && pod install');\n steps.push('Call initDatalyr() in your App.tsx useEffect');\n break;\n\n case 'ios':\n steps.push('Add DatalyrSDK via Swift Package Manager');\n steps.push('Add DATALYR_API_KEY and DATALYR_WORKSPACE_ID to Datalyr.xcconfig');\n steps.push('Configure Info.plist to use the xcconfig variables');\n steps.push('Call DatalyrConfig.initialize() in your App');\n break;\n\n default:\n steps.push('Add your workspace ID to your environment');\n }\n\n return steps;\n}\n","import { execa } from 'execa';\nimport type { PackageManager } from '../types.js';\nimport { detectPackageManager, getInstallCommand } from '../utils/package-manager.js';\nimport { startSpinner, succeedSpinner, failSpinner } from '../cli/ui.js';\n\nexport async function installPackages(\n cwd: string,\n packages: string[],\n options: { dev?: boolean; dryRun?: boolean } = {},\n): Promise<boolean> {\n if (packages.length === 0) return true;\n if (options.dryRun) return true;\n\n const pm = await detectPackageManager(cwd);\n const command = getInstallCommand(pm, packages, options.dev);\n\n const spinner = startSpinner(`Installing ${packages.join(', ')}...`);\n\n try {\n const [cmd, ...args] = command.split(' ');\n await execa(cmd, args, { cwd, stdio: 'pipe' });\n succeedSpinner(`Installed ${packages.join(', ')}`);\n return true;\n } catch (error) {\n failSpinner(`Failed to install packages`);\n console.error(error instanceof Error ? error.message : error);\n return false;\n }\n}\n\nexport async function isPackageInstalled(cwd: string, packageName: string): Promise<boolean> {\n try {\n const { stdout } = await execa('npm', ['ls', packageName, '--json'], {\n cwd,\n stdio: 'pipe',\n reject: false,\n });\n const result = JSON.parse(stdout);\n return !!result.dependencies?.[packageName];\n } catch {\n return false;\n }\n}\n","import { input, confirm, select } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport type { Framework } from '../types.js';\n\nexport async function promptApiKey(existingKey?: string): Promise<string> {\n if (existingKey) {\n return existingKey;\n }\n\n const apiKey = await input({\n message: 'Enter your Datalyr API key (starts with dk_):',\n validate: (value) => {\n if (!value.startsWith('dk_')) {\n return 'API key must start with \"dk_\"';\n }\n if (value.length < 10) {\n return 'API key seems too short';\n }\n return true;\n },\n });\n\n return apiKey;\n}\n\nexport async function promptConfirm(message: string, defaultValue = true): Promise<boolean> {\n return confirm({\n message,\n default: defaultValue,\n });\n}\n\nexport async function promptFramework(): Promise<Framework> {\n return select({\n message: 'Select your framework:',\n choices: [\n { name: 'Next.js', value: 'nextjs' as Framework },\n { name: 'React (Vite)', value: 'react-vite' as Framework },\n { name: 'React (Create React App)', value: 'react' as Framework },\n { name: 'Svelte/SvelteKit', value: 'sveltekit' as Framework },\n { name: 'Vue/Nuxt', value: 'nuxt' as Framework },\n { name: 'Remix', value: 'remix' as Framework },\n { name: 'Astro', value: 'astro' as Framework },\n { name: 'React Native', value: 'react-native' as Framework },\n { name: 'Expo', value: 'expo' as Framework },\n { name: 'iOS (Swift)', value: 'ios' as Framework },\n { name: 'Node.js (Server only)', value: 'node' as Framework },\n ],\n });\n}\n\nexport async function promptProceed(): Promise<boolean> {\n return confirm({\n message: 'Proceed with installation?',\n default: true,\n });\n}\n\nexport async function promptOverwrite(filePath: string): Promise<boolean> {\n console.log(chalk.yellow(` File already exists: ${filePath}`));\n return confirm({\n message: 'Overwrite this file?',\n default: false,\n });\n}\n\nexport async function promptSelectSDKs(\n detected: string[],\n): Promise<string[]> {\n if (detected.length === 1) {\n return detected;\n }\n\n const choices = detected.map(sdk => ({\n name: sdk,\n value: sdk,\n checked: true,\n }));\n\n // Using select for simplicity, but could use checkbox for multi-select\n const selected = await confirm({\n message: `Install both ${detected.join(' and ')}?`,\n default: true,\n });\n\n return selected ? detected : [detected[0]];\n}\n","import chalk from 'chalk';\n\nexport const logger = {\n info: (message: string) => console.log(chalk.blue('ℹ'), message),\n success: (message: string) => console.log(chalk.green('✓'), message),\n warn: (message: string) => console.log(chalk.yellow('⚠'), message),\n error: (message: string) => console.log(chalk.red('✗'), message),\n debug: (message: string, enabled = false) => {\n if (enabled) console.log(chalk.gray('[debug]'), message);\n },\n\n header: (title: string) => {\n console.log();\n console.log(chalk.bold.cyan(title));\n console.log(chalk.gray('─'.repeat(40)));\n },\n\n step: (step: number, total: number, message: string) => {\n console.log();\n console.log(chalk.bold(`Step ${step}/${total}: ${message}`));\n console.log(chalk.gray('─'.repeat(40)));\n },\n\n box: (lines: string[]) => {\n const maxLen = Math.max(...lines.map(l => l.length));\n const border = '═'.repeat(maxLen + 4);\n console.log(chalk.cyan(`╔${border}╗`));\n lines.forEach(line => {\n const padding = ' '.repeat(maxLen - line.length);\n console.log(chalk.cyan('║') + ` ${line}${padding} ` + chalk.cyan('║'));\n });\n console.log(chalk.cyan(`╚${border}╝`));\n },\n\n list: (items: string[], indent = 2) => {\n const spaces = ' '.repeat(indent);\n items.forEach(item => console.log(`${spaces}• ${item}`));\n },\n\n blank: () => console.log(),\n};\n","/**\n * Agent Runner\n * Orchestrates the full wizard flow with the Claude Agent SDK\n */\n\nimport * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport type { Framework } from '../types.js';\nimport {\n buildSystemPrompt,\n validateBashCommand,\n type AgentResult,\n} from './interface.js';\nimport { detectFramework, getFrameworkDisplayName } from '../detection/detector.js';\nimport { getFrameworkDocs } from './docs/index.js';\nimport { getSdksForFramework, type FrameworkConfig } from './configs/types.js';\nimport {\n BUSINESS_TYPES,\n getEventSuggestions,\n buildEventSelectOptions,\n resolveSelectedEvents,\n formatEventDescription,\n type BusinessType,\n type EventSuggestion,\n} from './events/suggestions.js';\nimport {\n PLATFORM_TYPES,\n AD_PLATFORMS,\n getSdksForPlatform,\n getAttributionEvents,\n getPlatformPostInstallSteps,\n type PlatformType,\n type AdPlatform,\n type PlatformConfig,\n} from './platform/config.js';\nimport { generateAIContextDoc } from '../generators/ai-context.js';\nimport { writeFile, readFile, mkdir } from 'fs/promises';\nimport { join, dirname, resolve } from 'path';\nimport { existsSync } from 'fs';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { glob } from 'glob';\n\nconst execAsync = promisify(exec);\n\nconst LLM_GATEWAY_URL = process.env.DATALYR_LLM_GATEWAY || 'https://wizard.datalyr.com';\n\nexport interface WizardAgentOptions {\n cwd?: string;\n apiKey?: string;\n debug?: boolean;\n framework?: Framework;\n skipVerification?: boolean;\n enableContainer?: boolean;\n}\n\ninterface WorkspaceInfo {\n id: string;\n name: string;\n timezone: string | null;\n domain: string | null;\n}\n\ninterface WorkspaceOption {\n id: string;\n name: string;\n public_id: string;\n domain: string | null;\n}\n\n/**\n * Run the agent-powered wizard\n */\nexport async function runAgentWizard(\n _config: FrameworkConfig, // Reserved for future use (e.g., default config overrides)\n options: WizardAgentOptions = {},\n): Promise<AgentResult> {\n const cwd = options.cwd || process.cwd();\n\n // Welcome message\n p.intro(chalk.cyan('Datalyr AI Wizard'));\n\n // Step 1: Confirm AI usage\n const useAI = await p.confirm({\n message: 'This wizard uses AI to analyze your project and install Datalyr. Continue?',\n initialValue: true,\n });\n\n if (p.isCancel(useAI) || !useAI) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n // Step 2: Get and validate API key (with retry loop)\n let apiKey = options.apiKey;\n let workspace: WorkspaceInfo | null = null;\n let keyAttempts = 0;\n const maxAttempts = 3;\n\n while (!workspace && keyAttempts < maxAttempts) {\n keyAttempts++;\n\n if (!apiKey) {\n // Show help on first attempt or after failed attempts\n if (keyAttempts === 1) {\n p.note(\n `To get your API key:\\n` +\n ` 1. Go to ${chalk.cyan('https://app.datalyr.com/settings/api')}\\n` +\n ` 2. Create a new API key (or copy existing)\\n` +\n ` 3. Paste it below`,\n 'API Key Required'\n );\n }\n\n const keyInput = await p.text({\n message: 'Enter your Datalyr API key (starts with dk_):',\n placeholder: 'dk_live_...',\n validate: (value) => {\n if (!value) return 'API key is required';\n if (!value.startsWith('dk_')) return 'API key must start with dk_';\n if (value.length < 20) return 'API key seems too short';\n return undefined;\n },\n });\n\n if (p.isCancel(keyInput)) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n apiKey = keyInput;\n }\n\n // Validate the API key\n const validateSpinner = p.spinner();\n validateSpinner.start('Validating API key...');\n\n try {\n // First validate the key and get default workspace\n const defaultWorkspace = await validateApiKey(apiKey);\n\n // Fetch all workspaces the user has access to\n const allWorkspaces = await fetchWorkspaces(apiKey);\n\n if (allWorkspaces.length > 1) {\n // Multiple workspaces - prompt user to select one\n validateSpinner.stop('API key validated');\n\n const workspaceChoice = await p.select({\n message: 'Select a workspace to configure:',\n options: allWorkspaces.map(w => ({\n value: w.id,\n label: w.name,\n hint: w.domain || undefined,\n })),\n });\n\n if (p.isCancel(workspaceChoice)) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n // Find the selected workspace\n const selectedWorkspace = allWorkspaces.find(w => w.id === workspaceChoice);\n if (selectedWorkspace) {\n workspace = {\n id: selectedWorkspace.id,\n name: selectedWorkspace.name,\n timezone: null,\n domain: selectedWorkspace.domain,\n };\n } else {\n workspace = defaultWorkspace;\n }\n\n p.log.info(`Selected workspace: ${chalk.cyan(workspace.name)}`);\n } else {\n // Single workspace or fallback\n workspace = defaultWorkspace;\n validateSpinner.stop(`Workspace: ${chalk.cyan(workspace.name)}`);\n }\n } catch (error) {\n validateSpinner.stop(chalk.red('Invalid API key'));\n\n const errorMessage = error instanceof Error ? error.message : 'Failed to validate API key';\n p.log.error(errorMessage);\n\n // Clear the invalid key so user can enter a new one\n apiKey = undefined;\n\n if (keyAttempts < maxAttempts) {\n // Offer options: retry, get new key, or exit\n const action = await p.select({\n message: 'What would you like to do?',\n options: [\n { value: 'retry', label: 'Try a different API key' },\n { value: 'signup', label: 'Create a free account', hint: 'Opens browser' },\n { value: 'exit', label: 'Exit wizard' },\n ],\n });\n\n if (p.isCancel(action) || action === 'exit') {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n if (action === 'signup') {\n const signupUrl = 'https://app.datalyr.com/signup?ref=wizard';\n p.log.info(`Opening ${chalk.cyan(signupUrl)} in your browser...`);\n\n // Try to open browser\n try {\n const { exec } = await import('child_process');\n const { promisify } = await import('util');\n const execAsync = promisify(exec);\n\n const platform = process.platform;\n const cmd = platform === 'darwin' ? 'open' :\n platform === 'win32' ? 'start' : 'xdg-open';\n\n await execAsync(`${cmd} \"${signupUrl}\"`);\n\n p.log.success('Browser opened! Create your account and come back with your API key.');\n\n // Give user time to sign up\n await p.text({\n message: 'Press Enter when you have your API key ready...',\n });\n } catch {\n p.log.warn(`Please visit: ${chalk.cyan(signupUrl)}`);\n }\n }\n // Continue loop to get new key\n }\n }\n }\n\n if (!workspace || !apiKey) {\n p.log.error(`Failed to validate API key after ${maxAttempts} attempts.`);\n p.log.info(`Get help at ${chalk.cyan('https://docs.datalyr.com/getting-started')}`);\n return { success: false, error: 'API key validation failed' };\n }\n\n // At this point we know apiKey is valid\n const validatedApiKey = apiKey;\n\n // Step 3: Detect framework\n const detectSpinner = p.spinner();\n detectSpinner.start('Analyzing your project...');\n\n let detection = await detectFramework(cwd);\n let framework = detection.framework;\n\n if (framework === 'unknown' && !options.framework) {\n detectSpinner.stop('Could not auto-detect framework');\n\n const frameworkChoice = await p.select({\n message: 'Select your framework:',\n options: [\n { value: 'nextjs', label: 'Next.js' },\n { value: 'react', label: 'React' },\n { value: 'react-vite', label: 'React (Vite)' },\n { value: 'svelte', label: 'Svelte' },\n { value: 'sveltekit', label: 'SvelteKit' },\n { value: 'react-native', label: 'React Native' },\n { value: 'expo', label: 'Expo' },\n { value: 'ios', label: 'iOS (Swift)' },\n { value: 'node', label: 'Node.js' },\n ],\n });\n\n if (p.isCancel(frameworkChoice)) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n framework = frameworkChoice as Framework;\n } else if (options.framework) {\n framework = options.framework;\n }\n\n detectSpinner.stop(`Detected: ${chalk.cyan(getFrameworkDisplayName(framework))}`);\n\n // Update SDKs if framework was manually selected\n if (detection.framework !== framework) {\n detection = { ...detection, framework, sdks: getSdksForFramework(framework) };\n }\n\n // Step 5: Platform type (web/mobile/both)\n const isMobileFramework = ['react-native', 'expo', 'ios'].includes(framework);\n const isWebFramework = ['nextjs', 'react', 'react-vite', 'svelte', 'sveltekit'].includes(framework);\n\n let platformType: PlatformType = 'web';\n if (isMobileFramework) {\n platformType = 'mobile';\n } else if (!isMobileFramework && !isWebFramework) {\n // Ask for hybrid setups\n const platformChoice = await p.select({\n message: 'What platforms are you targeting?',\n options: PLATFORM_TYPES.map(type => ({\n value: type.id,\n label: type.label,\n hint: type.hint,\n })),\n });\n\n if (p.isCancel(platformChoice)) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n platformType = platformChoice as PlatformType;\n }\n\n // Step 6: Ask about ad platforms (for attribution)\n const runningAds = await p.confirm({\n message: 'Are you running paid ads (Meta, Google, TikTok)?',\n initialValue: false,\n });\n\n let adPlatforms: AdPlatform[] = [];\n let platformConfig: PlatformConfig = {\n platformType,\n adPlatforms: [],\n enableDeepLinking: false,\n enableServerSideConversions: false,\n };\n\n if (!p.isCancel(runningAds) && runningAds) {\n const adPlatformChoices = await p.multiselect({\n message: 'Select your ad platforms:',\n options: AD_PLATFORMS.filter(p => p.id !== 'none').map(platform => ({\n value: platform.id,\n label: platform.label,\n hint: platform.description,\n })),\n required: false,\n });\n\n if (!p.isCancel(adPlatformChoices)) {\n adPlatforms = adPlatformChoices as AdPlatform[];\n\n // If using ad platforms, ask about server-side conversions\n if (adPlatforms.length > 0) {\n const serverSide = await p.confirm({\n message: 'Enable server-side conversion tracking (CAPI)?',\n initialValue: true,\n });\n\n platformConfig.enableServerSideConversions = !p.isCancel(serverSide) && serverSide;\n }\n }\n }\n\n // Ask about deep linking for mobile\n if (platformType === 'mobile' || platformType === 'both') {\n const deepLinking = await p.confirm({\n message: 'Set up deep linking / deferred deep links?',\n initialValue: adPlatforms.length > 0,\n });\n\n platformConfig.enableDeepLinking = !p.isCancel(deepLinking) && deepLinking;\n }\n\n platformConfig.adPlatforms = adPlatforms;\n\n // Ask about container scripts (managing third-party pixels through Datalyr)\n let enableContainer = options.enableContainer;\n\n if (enableContainer === undefined && platformType !== 'mobile') {\n // Only ask for web platforms - container scripts manage browser pixels\n const containerChoice = await p.confirm({\n message: 'Manage third-party pixels through Datalyr dashboard?',\n initialValue: adPlatforms.length > 0, // Default yes if using ad platforms\n });\n\n if (!p.isCancel(containerChoice)) {\n enableContainer = containerChoice;\n\n if (containerChoice) {\n p.note(\n `Container scripts let you:\\n` +\n ` ${chalk.green('•')} Add/remove Meta, Google, TikTok pixels without code\\n` +\n ` ${chalk.green('•')} Auto-fire datalyr.track() events to all pixels\\n` +\n ` ${chalk.green('•')} Inject custom scripts (Hotjar, Intercom, etc.)`,\n 'Container Scripts'\n );\n }\n }\n }\n\n // Default to enabled if not set\n const containerEnabled = enableContainer !== false;\n\n // Step 7: Ask about business type for event suggestions\n const businessTypeChoice = await p.select({\n message: 'What type of app are you building?',\n options: BUSINESS_TYPES.map(type => ({\n value: type.id,\n label: type.label,\n hint: type.hint,\n })),\n });\n\n if (p.isCancel(businessTypeChoice)) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n const selectedBusinessType = businessTypeChoice as BusinessType;\n const suggestedEvents = getEventSuggestions(selectedBusinessType);\n const attributionEvents = getAttributionEvents(platformConfig);\n\n // Show what Datalyr auto-tracks\n const autoTrackedEvents = platformType === 'mobile' || platformType === 'both'\n ? ['page_view / screen_view', 'session_start', 'app_install (mobile)', 'attribution data']\n : ['page_view', 'session_start', 'referrer', 'UTM parameters'];\n\n p.note(\n `${chalk.bold('Auto-tracked (no code needed):')}\\n` +\n autoTrackedEvents.map(e => ` ${chalk.dim('•')} ${e}`).join('\\n') +\n `\\n\\n${chalk.bold('High-value events')} are the key actions that matter for your business:\\n` +\n ` ${chalk.dim('•')} Conversions (signups, purchases, leads)\\n` +\n ` ${chalk.dim('•')} Engagement (feature usage, key interactions)\\n` +\n ` ${chalk.dim('•')} Revenue (transactions, subscriptions)`,\n 'Event Tracking'\n );\n\n // Step 8: Let user select which events to track\n const allEvents = [...suggestedEvents, ...attributionEvents.map(e => ({\n name: e.name,\n description: e.description,\n properties: e.properties,\n priority: 'high' as const,\n }))];\n\n // Remove duplicates by event name\n const uniqueEvents = allEvents.filter((event, index, self) =>\n index === self.findIndex(e => e.name === event.name)\n );\n\n // Build options with \"All recommended\" option and property descriptions\n const eventOptions = buildEventSelectOptions(uniqueEvents, true);\n\n // Show suggested events for the business type\n const businessTypeLabel = BUSINESS_TYPES.find(b => b.id === selectedBusinessType)?.label || selectedBusinessType;\n p.note(\n `Based on your ${chalk.cyan(businessTypeLabel)} app, we suggest these events:\\n\\n` +\n uniqueEvents\n .filter(e => e.priority === 'high')\n .map(e => ` ${chalk.green('•')} ${chalk.bold(e.name)}: ${formatEventDescription(e)}`)\n .join('\\n'),\n 'Suggested Events'\n );\n\n const selectedEventNames = await p.multiselect({\n message: 'Select events to track:',\n options: eventOptions,\n initialValues: ['__all_recommended__'],\n required: false,\n });\n\n let selectedEvents: EventSuggestion[] = p.isCancel(selectedEventNames)\n ? uniqueEvents.filter(e => e.priority === 'high')\n : resolveSelectedEvents(selectedEventNames as string[], uniqueEvents);\n\n // Ask if they want to add custom events\n const addCustom = await p.confirm({\n message: 'Want to add any custom events specific to your app?',\n initialValue: false,\n });\n\n if (!p.isCancel(addCustom) && addCustom) {\n const customEventInput = await p.text({\n message: 'Enter custom event names (comma-separated):',\n placeholder: 'checkout_completed, feature_clicked, ...',\n });\n\n if (!p.isCancel(customEventInput) && customEventInput) {\n const customEvents = customEventInput\n .split(',')\n .map(e => e.trim())\n .filter(e => e.length > 0)\n .map(name => ({\n name,\n description: 'Custom event',\n properties: ['value', 'context'],\n priority: 'high' as const,\n }));\n\n selectedEvents = [...selectedEvents, ...customEvents];\n }\n }\n\n // Show selected events summary\n if (selectedEvents.length > 0) {\n const eventList = selectedEvents\n .slice(0, 6)\n .map(e => ` ${chalk.green('•')} ${chalk.bold(e.name)}`)\n .join('\\n');\n\n const moreCount = selectedEvents.length > 6 ? ` (+${selectedEvents.length - 6} more)` : '';\n\n p.note(\n `Events you'll track:\\n\\n${eventList}${moreCount}`,\n 'Your Events'\n );\n }\n\n // Determine SDKs based on platform + framework + ad platforms\n const platformSdks = getSdksForPlatform(platformType, adPlatforms);\n const allSdks = [...new Set([...detection.sdks, ...platformSdks])];\n\n // Get platform-specific post-install steps\n const platformSteps = getPlatformPostInstallSteps(platformConfig);\n\n // Step 9: Show what will happen\n p.note(\n `The wizard will:\n${chalk.green('•')} Install ${chalk.cyan(allSdks.join(', '))}\n${chalk.green('•')} Create initialization code\n${chalk.green('•')} Configure environment variables\n${chalk.green('•')} Set up workspace: ${chalk.cyan(workspace.name)}\n${adPlatforms.length > 0 ? `${chalk.green('•')} Configure attribution for: ${chalk.cyan(adPlatforms.join(', '))}` : ''}\n${containerEnabled && platformType !== 'mobile' ? `${chalk.green('•')} Enable container scripts for pixel management` : ''}`,\n 'Installation Plan'\n );\n\n const proceed = await p.confirm({\n message: 'Proceed with installation?',\n initialValue: true,\n });\n\n if (p.isCancel(proceed) || !proceed) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n // Step 7: Run the agent\n const agentSpinner = p.spinner();\n agentSpinner.start('AI agent is working...');\n\n try {\n const result = await executeAgent({\n framework,\n apiKey: validatedApiKey,\n cwd,\n docs: getFrameworkDocs(framework, validatedApiKey),\n debug: options.debug,\n enableContainer: containerEnabled,\n workspaceId: workspace.id,\n });\n\n if (result.success) {\n agentSpinner.stop(chalk.green('Installation complete!'));\n\n // Step 8: Verification\n if (!options.skipVerification) {\n const verifyResult = await verifyInstallation(validatedApiKey, workspace.id);\n if (verifyResult.success) {\n p.log.success('SDK verified and ready to track events!');\n } else {\n p.log.warn('Could not verify SDK installation. This may be normal if events haven\\'t been sent yet.');\n p.log.info(`Check your dashboard at: ${chalk.cyan(`https://app.datalyr.com/dashboard/${workspace.id}/events`)}`);\n }\n }\n\n // Step 9: Generate AI context file for coding assistants\n try {\n const aiContextDoc = generateAIContextDoc({\n workspaceName: workspace.name,\n workspaceId: workspace.id,\n framework,\n platformType,\n adPlatforms,\n businessType: selectedBusinessType,\n selectedEvents,\n sdks: allSdks,\n enableServerSideConversions: platformConfig.enableServerSideConversions,\n enableContainer: containerEnabled,\n });\n\n await writeFile(join(cwd, '.datalyr.md'), aiContextDoc);\n p.log.success('Created .datalyr.md for AI coding assistants');\n } catch {\n // Non-critical, don't fail if we can't write the file\n }\n\n // Show next steps with selected event examples\n const eventExamples = selectedEvents.slice(0, 3).map(e =>\n `datalyr.track('${e.name}', { ${e.properties.slice(0, 2).map(p => `${p}: '...'`).join(', ')} })`\n ).join('\\n ');\n\n // Show platform-specific steps if any\n const stepsText = platformSteps.length > 0\n ? `\\n\\n${chalk.bold('Next steps:')}\\n${platformSteps.map(s => ` ${chalk.yellow('→')} ${s}`).join('\\n')}`\n : '';\n\n p.note(\n `Your workspace \"${workspace.name}\" is ready!\n\n${chalk.bold('Start tracking events:')}\n ${eventExamples || \"datalyr.track('event_name', { property: 'value' })\"}\n\n${chalk.bold('View your data:')}\n ${chalk.cyan(`https://app.datalyr.com/dashboard/${workspace.id}/events`)}${stepsText}`,\n 'Success!'\n );\n\n p.outro(chalk.green('Datalyr is ready to use!'));\n } else {\n agentSpinner.stop(chalk.red('Installation failed'));\n p.log.error(result.error || 'Unknown error');\n }\n\n return result;\n } catch (error) {\n agentSpinner.stop(chalk.red('Agent error'));\n\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n p.log.error(errorMessage);\n\n return { success: false, error: errorMessage };\n }\n}\n\ninterface ExecuteAgentParams {\n framework: Framework;\n apiKey: string;\n cwd: string;\n docs: string;\n debug?: boolean;\n enableContainer?: boolean;\n workspaceId: string;\n}\n\n// Claude API response types\ninterface ToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\ninterface TextBlock {\n type: 'text';\n text: string;\n}\n\ntype ContentBlock = ToolUseBlock | TextBlock;\n\ninterface ClaudeResponse {\n id: string;\n type: 'message';\n role: 'assistant';\n content: ContentBlock[];\n stop_reason: 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence';\n usage: { input_tokens: number; output_tokens: number };\n}\n\ninterface ToolResult {\n type: 'tool_result';\n tool_use_id: string;\n content: string;\n is_error?: boolean;\n}\n\n/**\n * Execute the agent via the LLM gateway with tool use\n */\nasync function executeAgent(params: ExecuteAgentParams): Promise<AgentResult> {\n const { framework, apiKey, cwd, docs, debug, enableContainer = true, workspaceId } = params;\n\n // Build the initial user message\n const initialMessage = buildIntegrationPrompt(framework, apiKey, docs, enableContainer, workspaceId);\n\n // Conversation messages\n const messages: Array<{ role: string; content: unknown }> = [\n { role: 'user', content: initialMessage },\n ];\n\n // Track modified files\n const filesModified: string[] = [];\n\n // Agent loop - max 20 iterations to prevent runaway\n const maxIterations = 20;\n let iterations = 0;\n\n while (iterations < maxIterations) {\n iterations++;\n\n if (debug) {\n console.log(`[DEBUG] Agent iteration ${iterations}`);\n }\n\n try {\n // Call the LLM gateway with timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000); // 60 second timeout\n\n const response = await fetch(`${LLM_GATEWAY_URL}/agent`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n messages,\n system: buildSystemPrompt(),\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n return { success: false, error: `Gateway error: ${error}` };\n }\n\n const claudeResponse = await response.json() as ClaudeResponse;\n\n if (debug) {\n console.log('[DEBUG] Response:', JSON.stringify(claudeResponse, null, 2));\n }\n\n // Add assistant message to conversation\n messages.push({ role: 'assistant', content: claudeResponse.content });\n\n // Check if we're done (end_turn or no tool use)\n if (claudeResponse.stop_reason === 'end_turn') {\n // Check if task_complete was called\n const taskComplete = claudeResponse.content.find(\n (block): block is ToolUseBlock =>\n block.type === 'tool_use' && block.name === 'task_complete'\n );\n\n if (taskComplete) {\n const input = taskComplete.input as { success: boolean; summary: string; files_modified?: string[] };\n return {\n success: input.success,\n message: input.summary,\n filesModified: input.files_modified || filesModified,\n };\n }\n\n // No task_complete but end_turn - agent stopped without explicit completion\n // This is unexpected behavior, mark as incomplete even if files were modified\n if (filesModified.length > 0) {\n return {\n success: false,\n message: 'Agent stopped unexpectedly. Files were modified but installation may be incomplete.',\n error: 'Agent did not call task_complete. Please verify the installation manually.',\n filesModified,\n };\n }\n\n return {\n success: false,\n error: 'Agent stopped without completing the installation task.',\n };\n }\n\n // Process tool use blocks\n if (claudeResponse.stop_reason === 'tool_use') {\n const toolUseBlocks = claudeResponse.content.filter(\n (block): block is ToolUseBlock => block.type === 'tool_use'\n );\n\n const toolResults: ToolResult[] = [];\n\n for (const toolUse of toolUseBlocks) {\n // Check for task_complete\n if (toolUse.name === 'task_complete') {\n const input = toolUse.input as { success: boolean; summary: string; files_modified?: string[] };\n return {\n success: input.success,\n message: input.summary,\n filesModified: input.files_modified || filesModified,\n };\n }\n\n // Execute the tool locally\n const result = await executeTool(toolUse, cwd, debug);\n\n // Track file modifications\n if (toolUse.name === 'write_file' && !result.is_error) {\n const path = toolUse.input.path as string;\n if (!filesModified.includes(path)) {\n filesModified.push(path);\n }\n }\n\n toolResults.push({\n type: 'tool_result',\n tool_use_id: toolUse.id,\n content: result.content,\n is_error: result.is_error,\n });\n }\n\n // Add tool results to conversation\n messages.push({ role: 'user', content: toolResults });\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n if (debug) {\n console.error('[DEBUG] Agent error:', error);\n }\n return { success: false, error: `Agent error: ${errorMessage}` };\n }\n }\n\n return { success: false, error: 'Agent exceeded maximum iterations' };\n}\n\n/**\n * Validate that a path stays within the project directory (prevent path traversal)\n */\nfunction isPathSafe(basePath: string, targetPath: string): boolean {\n const resolvedBase = resolve(basePath);\n const resolvedTarget = resolve(basePath, targetPath);\n return resolvedTarget.startsWith(resolvedBase + '/') || resolvedTarget === resolvedBase;\n}\n\n/**\n * Execute a tool locally\n */\nasync function executeTool(\n toolUse: ToolUseBlock,\n cwd: string,\n debug?: boolean,\n): Promise<{ content: string; is_error?: boolean }> {\n const { name, input } = toolUse;\n\n if (debug) {\n console.log(`[DEBUG] Executing tool: ${name}`, input);\n }\n\n try {\n switch (name) {\n case 'read_file': {\n // Input validation\n if (typeof input.path !== 'string' || !input.path.trim()) {\n return { content: 'Error: path must be a non-empty string', is_error: true };\n }\n const path = input.path.trim();\n\n // Path traversal protection\n if (!isPathSafe(cwd, path)) {\n return { content: 'Error: path traversal detected - access denied', is_error: true };\n }\n\n const fullPath = join(cwd, path);\n const content = await readFile(fullPath, 'utf-8');\n return { content };\n }\n\n case 'write_file': {\n // Input validation\n if (typeof input.path !== 'string' || !input.path.trim()) {\n return { content: 'Error: path must be a non-empty string', is_error: true };\n }\n if (typeof input.content !== 'string') {\n return { content: 'Error: content must be a string', is_error: true };\n }\n const path = input.path.trim();\n const content = input.content;\n\n // Path traversal protection\n if (!isPathSafe(cwd, path)) {\n return { content: 'Error: path traversal detected - access denied', is_error: true };\n }\n\n const fullPath = join(cwd, path);\n\n // Ensure directory exists\n const dir = dirname(fullPath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n await writeFile(fullPath, content, 'utf-8');\n return { content: `Successfully wrote ${path}` };\n }\n\n case 'run_command': {\n // Input validation\n if (typeof input.command !== 'string' || !input.command.trim()) {\n return { content: 'Error: command must be a non-empty string', is_error: true };\n }\n const command = input.command.trim();\n\n // Security: use validateBashCommand for full validation\n const validation = validateBashCommand(command);\n if (!validation.allowed) {\n return {\n content: `Command blocked: ${validation.reason}`,\n is_error: true,\n };\n }\n\n const { stdout, stderr } = await execAsync(command, { cwd, timeout: 120000 });\n return { content: stdout || stderr || 'Command completed successfully' };\n }\n\n case 'list_files': {\n // Input validation\n if (typeof input.path !== 'string') {\n return { content: 'Error: path must be a string', is_error: true };\n }\n const path = input.path.trim() || '.';\n const pattern = typeof input.pattern === 'string' ? input.pattern : '*';\n\n // Path traversal protection\n if (!isPathSafe(cwd, path)) {\n return { content: 'Error: path traversal detected - access denied', is_error: true };\n }\n\n const fullPath = join(cwd, path);\n\n const files = await glob(pattern, {\n cwd: fullPath,\n nodir: false,\n maxDepth: 3,\n });\n\n return { content: files.slice(0, 100).join('\\n') };\n }\n\n default:\n return { content: `Unknown tool: ${name}`, is_error: true };\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n return { content: `Error: ${errorMessage}`, is_error: true };\n }\n}\n\n/**\n * Build the integration prompt for the agent\n */\nfunction buildIntegrationPrompt(\n framework: Framework,\n apiKey: string,\n docs: string,\n enableContainer: boolean,\n workspaceId: string,\n): string {\n const containerConfig = enableContainer\n ? ' enableContainer: true, // Load third-party pixels from Datalyr dashboard'\n : ' enableContainer: false, // Container scripts disabled';\n\n const envVarName = framework === 'nextjs' ? 'NEXT_PUBLIC_DATALYR_WORKSPACE_ID' :\n framework === 'sveltekit' ? 'PUBLIC_DATALYR_WORKSPACE_ID' :\n framework.startsWith('react') && framework !== 'react-native' ? 'VITE_DATALYR_WORKSPACE_ID' :\n 'DATALYR_WORKSPACE_ID';\n\n return `Install Datalyr analytics into this ${getFrameworkDisplayName(framework)} project.\n\n## Workspace ID\n${workspaceId}\n\n## API Key (for server-side only)\n${apiKey}\n\n## Integration Documentation\n${docs}\n\n## SDK Configuration\nWhen initializing the SDK, use these options:\n\\`\\`\\`typescript\ndatalyr.init({\n workspaceId: process.env.${envVarName},\n${containerConfig}\n});\n\\`\\`\\`\n\n## Environment Variable\nAdd to .env.local (or .env):\n${envVarName}=${workspaceId}\n\n## Your Task\n\n1. Read package.json to understand the project\n2. Install the SDK: run the appropriate install command\n3. Create initialization code following the documentation\n4. Add the environment variable to .env.local or .env\n5. Call task_complete when done\n\nStart by reading package.json.`;\n}\n\n/**\n * Validate API key and get workspace info\n */\nasync function validateApiKey(apiKey: string): Promise<WorkspaceInfo> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 second timeout\n\n const response = await fetch(`${LLM_GATEWAY_URL}/validate-key`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ apiKey }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.json() as { error?: string };\n throw new Error(error.error || 'Failed to validate API key');\n }\n\n const result = await response.json() as {\n success: boolean;\n workspace?: WorkspaceInfo;\n error?: string;\n };\n\n if (!result.success || !result.workspace) {\n throw new Error(result.error || 'Invalid API key');\n }\n\n return result.workspace;\n}\n\n/**\n * Fetch all workspaces the user has access to\n */\nasync function fetchWorkspaces(apiKey: string): Promise<WorkspaceOption[]> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 second timeout\n\n const response = await fetch(`${LLM_GATEWAY_URL}/workspaces`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ apiKey }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n // Fallback: if /workspaces endpoint fails, return empty array\n // The caller will use the single workspace from validateApiKey\n return [];\n }\n\n const result = await response.json() as {\n success: boolean;\n workspaces?: WorkspaceOption[];\n error?: string;\n };\n\n if (!result.success || !result.workspaces) {\n return [];\n }\n\n return result.workspaces;\n}\n\n/**\n * Verify installation by checking SDK connection\n */\nasync function verifyInstallation(apiKey: string, workspaceId: string): Promise<{ success: boolean; message?: string }> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 15000); // 15 second timeout\n\n const response = await fetch(`${LLM_GATEWAY_URL}/verify`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ apiKey, workspaceId }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return { success: false };\n }\n\n const result = await response.json() as {\n success: boolean;\n message?: string;\n };\n\n return result;\n } catch {\n // Verification is optional, don't fail if it doesn't work\n return { success: false };\n }\n}\n","/**\n * Agent Interface\n * Handles agent signals and security hooks for the wizard\n */\n\n// Agent signals for communication\nexport const AGENT_SIGNALS = {\n STATUS: '[STATUS]',\n ERROR_MISSING_KEY: '[ERROR_MISSING_KEY]',\n ERROR_FAILED: '[ERROR_FAILED]',\n SUCCESS: '[SUCCESS]',\n} as const;\n\n// Allowed bash commands for security\nconst ALLOWED_COMMANDS = [\n // Package managers\n 'npm',\n 'yarn',\n 'pnpm',\n 'bun',\n 'npx',\n // Build tools\n 'tsc',\n 'node',\n // iOS\n 'pod',\n 'xcodebuild',\n // File operations (read-only)\n 'cat',\n 'ls',\n 'find',\n 'grep',\n 'head',\n 'tail',\n 'wc',\n // Git (read-only)\n 'git status',\n 'git log',\n 'git diff',\n 'git branch',\n];\n\n// Dangerous patterns to block\nconst BLOCKED_PATTERNS = [\n /;/, // Command chaining\n /`/, // Backticks\n /\\$\\(/, // Command substitution\n /\\$\\w/, // Variable expansion (could contain malicious code)\n /\\|\\s*sh/, // Piping to shell\n /\\|\\s*bash/, // Piping to bash\n /\\|\\s*zsh/, // Piping to zsh\n /\\|\\|/, // Or operator (allows fallback commands)\n /\\s&\\s/, // Background execution mid-command\n /\\s&$/, // Background execution at end\n /rm\\s+-rf/, // Dangerous rm\n /rm\\s+-r/, // Recursive rm\n />\\s*\\//, // Overwriting system files\n /&&\\s*rm/, // rm after &&\n /\\|\\s*rm/, // rm after pipe\n];\n\n/**\n * Security hook to validate bash commands\n */\nexport function validateBashCommand(command: string): { allowed: boolean; reason?: string } {\n // Check for blocked patterns\n for (const pattern of BLOCKED_PATTERNS) {\n if (pattern.test(command)) {\n return { allowed: false, reason: `Blocked pattern detected: ${pattern}` };\n }\n }\n\n // Extract the base command\n const baseCommand = command.trim().split(/\\s+/)[0];\n\n // Check if command starts with an allowed command\n const isAllowed = ALLOWED_COMMANDS.some(allowed => {\n if (allowed.includes(' ')) {\n return command.startsWith(allowed);\n }\n return baseCommand === allowed;\n });\n\n if (!isAllowed) {\n return { allowed: false, reason: `Command not in allowlist: ${baseCommand}` };\n }\n\n return { allowed: true };\n}\n\nexport interface AgentConfig {\n apiKey: string;\n model?: string;\n maxTokens?: number;\n debug?: boolean;\n}\n\nexport interface AgentResult {\n success: boolean;\n message?: string;\n error?: string;\n filesModified?: string[];\n}\n\n/**\n * Build the system prompt for the agent\n * Uses Anthropic prompting best practices: role prompting, XML structure, examples\n */\nexport function buildSystemPrompt(): string {\n return `<role>\nYou are a senior developer specializing in SDK integrations. You have 10+ years of experience integrating analytics tools into React, Next.js, Svelte, React Native, and iOS projects. You are meticulous, always read code before modifying it, and preserve existing functionality.\n</role>\n\n<task>\nInstall and configure the Datalyr analytics SDK in the user's project. Complete this task by:\n1. Detecting the framework and understanding the project structure\n2. Installing the correct SDK packages\n3. Creating initialization code in the appropriate entry point\n4. Configuring environment variables\n</task>\n\n<sdks>\n| SDK | Use Case | Install Command |\n|-----|----------|-----------------|\n| @datalyr/web | Browser apps (React, Vue, Svelte, Next.js client) | npm install @datalyr/web |\n| @datalyr/api | Server-side (Next.js API routes, Express, Node) | npm install @datalyr/api |\n| @datalyr/react-native | React Native & Expo mobile apps | npm install @datalyr/react-native |\n| DatalyrSDK | Native iOS Swift apps | Swift Package Manager |\n</sdks>\n\n<rules>\n1. ALWAYS read files before modifying them - never edit blind\n2. PRESERVE existing code - only add Datalyr, never remove functionality\n3. MATCH the project's code style (indentation, quotes, semicolons)\n4. USE TypeScript if the project uses TypeScript\n5. PLACE initialization in the correct entry point for the framework\n6. UPDATE .env or .env.local with NEXT_PUBLIC_DATALYR_WORKSPACE_ID\n7. CHECK for existing Datalyr setup first - don't duplicate\n</rules>\n\n<workflow>\nStep 1: Read package.json to detect framework and package manager\nStep 2: List files to find entry points (app/layout.tsx, src/main.tsx, App.tsx, etc.)\nStep 3: Read entry point files to understand current structure\nStep 4: Install SDK packages using detected package manager\nStep 5: Create initialization file (lib/datalyr.ts or similar)\nStep 6: Update entry point to import and initialize Datalyr\nStep 7: Update or create .env.local with workspace ID placeholder\nStep 8: Call task_complete with summary of changes\n</workflow>\n\n<examples>\n<example name=\"nextjs-app-router\">\nFor Next.js 13+ with App Router, create app/providers.tsx:\n\\`\\`\\`tsx\n'use client';\nimport datalyr from '@datalyr/web';\nimport { useEffect } from 'react';\n\nexport function DatalyrProvider({ children }: { children: React.ReactNode }) {\n useEffect(() => {\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID!,\n debug: process.env.NODE_ENV === 'development',\n });\n }, []);\n return <>{children}</>;\n}\n\\`\\`\\`\nThen wrap children in app/layout.tsx with <DatalyrProvider>.\n</example>\n\n<example name=\"react-vite\">\nFor React + Vite, create src/lib/datalyr.ts:\n\\`\\`\\`ts\nimport datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized) return;\n datalyr.init({\n workspaceId: import.meta.env.VITE_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n });\n initialized = true;\n}\n\nexport { datalyr };\n\\`\\`\\`\nThen call initDatalyr() at the top of src/main.tsx.\n</example>\n\n<example name=\"react-native\">\nFor React Native, create src/utils/datalyr.ts:\n\\`\\`\\`ts\nimport { Datalyr } from '@datalyr/react-native';\n\nexport async function initDatalyr(apiKey: string) {\n await Datalyr.initialize({\n apiKey,\n enableAutoEvents: true,\n debug: __DEV__,\n });\n}\n\nexport { Datalyr };\n\\`\\`\\`\nThen call initDatalyr() in App.tsx useEffect.\n</example>\n</examples>\n\n<signals>\nWhen complete: ${AGENT_SIGNALS.SUCCESS}\nOn error: ${AGENT_SIGNALS.ERROR_FAILED}\nStatus updates: ${AGENT_SIGNALS.STATUS} <message>\n</signals>`;\n}\n","/**\n * Framework Documentation\n * These docs are passed to the agent to guide SDK installation\n */\n\nimport type { Framework } from '../../types.js';\n\nexport function getFrameworkDocs(framework: Framework, apiKey: string): string {\n switch (framework) {\n case 'nextjs':\n return getNextjsDocs(apiKey);\n case 'react':\n case 'react-vite':\n return getReactDocs(apiKey);\n case 'sveltekit':\n return getSvelteKitDocs(apiKey);\n case 'svelte':\n return getSvelteDocs(apiKey);\n case 'react-native':\n case 'expo':\n return getReactNativeDocs(apiKey, framework === 'expo');\n case 'ios':\n return getIOSDocs(apiKey);\n case 'node':\n return getNodeDocs(apiKey);\n default:\n return getGenericWebDocs(apiKey);\n }\n}\n\nfunction getNextjsDocs(apiKey: string): string {\n return `\n# Datalyr Next.js Integration\n\n## Packages to Install\n- @datalyr/web (client-side tracking)\n- @datalyr/api (server-side tracking)\n\n## Environment Variables\nAdd to .env.local:\n\\`\\`\\`\nNEXT_PUBLIC_DATALYR_WORKSPACE_ID=your_workspace_id\nDATALYR_API_KEY=${apiKey}\n\\`\\`\\`\n\n## App Router Setup (Next.js 13+)\n\n### 1. Create Provider Component\nCreate \\`app/providers.tsx\\`:\n\\`\\`\\`tsx\n'use client';\n\nimport datalyr from '@datalyr/web';\nimport { useEffect } from 'react';\n\nexport function DatalyrProvider({ children }: { children: React.ReactNode }) {\n useEffect(() => {\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID!,\n debug: process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n }, []);\n\n return <>{children}</>;\n}\n\\`\\`\\`\n\n### 2. Wrap Layout\nUpdate \\`app/layout.tsx\\` to wrap children with the provider:\n\\`\\`\\`tsx\nimport { DatalyrProvider } from './providers';\n\nexport default function RootLayout({ children }) {\n return (\n <html>\n <body>\n <DatalyrProvider>\n {children}\n </DatalyrProvider>\n </body>\n </html>\n );\n}\n\\`\\`\\`\n\n### 3. Server-Side Instance (Optional)\nCreate \\`lib/datalyr.ts\\` for server-side tracking:\n\\`\\`\\`ts\nimport Datalyr from '@datalyr/api';\n\nexport const datalyr = new Datalyr(process.env.DATALYR_API_KEY!);\n\\`\\`\\`\n\n## Pages Router Setup (Legacy)\n\n### 1. Create Hook\nCreate \\`lib/datalyr.ts\\`:\n\\`\\`\\`ts\nimport datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID!,\n debug: process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n\\`\\`\\`\n\n### 2. Initialize in _app.tsx\n\\`\\`\\`tsx\nimport { useEffect } from 'react';\nimport { initDatalyr } from '../lib/datalyr';\n\nfunction MyApp({ Component, pageProps }) {\n useEffect(() => {\n initDatalyr();\n }, []);\n\n return <Component {...pageProps} />;\n}\n\\`\\`\\`\n`;\n}\n\nfunction getReactDocs(apiKey: string): string {\n return `\n# Datalyr React Integration\n\n## Package to Install\n- @datalyr/web\n\n## Environment Variables\nAdd to .env (or .env.local for Vite):\n\\`\\`\\`\nVITE_DATALYR_WORKSPACE_ID=your_workspace_id\n# Or for Create React App:\nREACT_APP_DATALYR_WORKSPACE_ID=your_workspace_id\n\\`\\`\\`\n\n## Setup\n\n### 1. Create Initialization Module\nCreate \\`src/lib/datalyr.ts\\`:\n\\`\\`\\`ts\nimport datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n // Vite uses import.meta.env, CRA uses process.env\n workspaceId: import.meta.env?.VITE_DATALYR_WORKSPACE_ID ||\n process.env.REACT_APP_DATALYR_WORKSPACE_ID,\n debug: import.meta.env?.DEV || process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n\\`\\`\\`\n\n### 2. Initialize in Entry Point\nUpdate \\`src/main.tsx\\` (Vite) or \\`src/index.tsx\\` (CRA):\n\\`\\`\\`tsx\nimport { initDatalyr } from './lib/datalyr';\n\n// Initialize before rendering\ninitDatalyr();\n\n// ... rest of your app setup\n\\`\\`\\`\n\n## Tracking Events\n\\`\\`\\`ts\nimport { datalyr } from './lib/datalyr';\n\n// Track an event\ndatalyr.track('button_clicked', { button_id: 'signup' });\n\n// Identify a user\ndatalyr.identify('user_123', { email: 'user@example.com' });\n\\`\\`\\`\n`;\n}\n\nfunction getSvelteKitDocs(apiKey: string): string {\n return `\n# Datalyr SvelteKit Integration\n\n## Packages to Install\n- @datalyr/web (client-side)\n- @datalyr/api (server-side)\n\n## Environment Variables\nAdd to .env:\n\\`\\`\\`\nPUBLIC_DATALYR_WORKSPACE_ID=your_workspace_id\nDATALYR_API_KEY=${apiKey}\n\\`\\`\\`\n\n## Setup\n\n### 1. Client-Side Initialization\nCreate \\`src/lib/datalyr.ts\\`:\n\\`\\`\\`ts\nimport datalyr from '@datalyr/web';\nimport { browser } from '$app/environment';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized || !browser) return;\n\n datalyr.init({\n workspaceId: import.meta.env.PUBLIC_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n\\`\\`\\`\n\n### 2. Initialize in Layout\nUpdate \\`src/routes/+layout.svelte\\`:\n\\`\\`\\`svelte\n<script>\n import { onMount } from 'svelte';\n import { initDatalyr } from '$lib/datalyr';\n\n onMount(() => {\n initDatalyr();\n });\n</script>\n\n<slot />\n\\`\\`\\`\n\n### 3. Server-Side Instance\nCreate \\`src/lib/server/datalyr.ts\\`:\n\\`\\`\\`ts\nimport Datalyr from '@datalyr/api';\nimport { DATALYR_API_KEY } from '$env/static/private';\n\nexport const datalyr = new Datalyr(DATALYR_API_KEY);\n\\`\\`\\`\n`;\n}\n\nfunction getSvelteDocs(apiKey: string): string {\n return `\n# Datalyr Svelte Integration\n\n## Package to Install\n- @datalyr/web\n\n## Environment Variables\nAdd to .env:\n\\`\\`\\`\nVITE_DATALYR_WORKSPACE_ID=your_workspace_id\n\\`\\`\\`\n\n## Setup\n\n### 1. Create Initialization Module\nCreate \\`src/lib/datalyr.ts\\`:\n\\`\\`\\`ts\nimport datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: import.meta.env.VITE_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n\\`\\`\\`\n\n### 2. Initialize in App\nUpdate \\`src/App.svelte\\`:\n\\`\\`\\`svelte\n<script>\n import { onMount } from 'svelte';\n import { initDatalyr } from './lib/datalyr';\n\n onMount(() => {\n initDatalyr();\n });\n</script>\n\n<!-- Your app content -->\n\\`\\`\\`\n`;\n}\n\nfunction getReactNativeDocs(_apiKey: string, isExpo: boolean): string {\n const importPath = isExpo ? '@datalyr/react-native/expo' : '@datalyr/react-native';\n const configImport = isExpo ? \"import Constants from 'expo-constants';\" : '';\n const configAccess = isExpo\n ? \"Constants.expoConfig?.extra?.datalyrApiKey || ''\"\n : \"process.env.DATALYR_API_KEY || ''\";\n\n return `\n# Datalyr React Native Integration${isExpo ? ' (Expo)' : ''}\n\n## Package to Install\n- @datalyr/react-native\n${isExpo ? '- expo-constants (for config access)' : ''}\n\n## Post-Install (iOS)\nAfter installing, run:\n\\`\\`\\`bash\ncd ios && pod install\n\\`\\`\\`\n\n## Environment Configuration\n${isExpo ? `\n### For Expo\nAdd to \\`app.config.js\\` or \\`app.json\\`:\n\\`\\`\\`js\nexport default {\n expo: {\n extra: {\n datalyrApiKey: process.env.DATALYR_API_KEY,\n datalyrWorkspaceId: process.env.DATALYR_WORKSPACE_ID,\n },\n },\n};\n\\`\\`\\`\n\nCreate \\`.env\\` file:\n\\`\\`\\`\nDATALYR_API_KEY=your_api_key\nDATALYR_WORKSPACE_ID=your_workspace_id\n\\`\\`\\`\n` : `\n### For React Native CLI\nCreate \\`.env\\` file and use react-native-config:\n\\`\\`\\`\nDATALYR_API_KEY=your_api_key\nDATALYR_WORKSPACE_ID=your_workspace_id\n\\`\\`\\`\n`}\n**Security Note**: Never commit API keys to source control. Use environment variables or secrets management.\n\n## Setup\n\n### 1. Create Initialization Module\nCreate \\`src/utils/datalyr.ts\\`:\n\\`\\`\\`ts\nimport { Datalyr } from '${importPath}';\n${configImport}\n\nlet initialized = false;\n\nexport async function initDatalyr() {\n if (initialized) return;\n\n const apiKey = ${configAccess};\n\n if (!apiKey) {\n console.warn('[Datalyr] API key not configured');\n return;\n }\n\n await Datalyr.initialize({\n apiKey,\n enableAutoEvents: true,\n enableAttribution: true,\n debug: __DEV__,\n });\n\n initialized = true;\n}\n\nexport { Datalyr };\n\\`\\`\\`\n\n### 2. Initialize in App\nUpdate \\`App.tsx\\`:\n\\`\\`\\`tsx\nimport { useEffect } from 'react';\nimport { initDatalyr } from './src/utils/datalyr';\n\nexport default function App() {\n useEffect(() => {\n initDatalyr();\n }, []);\n\n return (\n // Your app content\n );\n}\n\\`\\`\\`\n\n## Tracking Events\n\\`\\`\\`ts\nimport { Datalyr } from './src/utils/datalyr';\n\n// Track an event\nDatalyr.track('purchase_completed', { amount: 99.99 });\n\n// Identify a user\nDatalyr.identify('user_123', { email: 'user@example.com' });\n\\`\\`\\`\n`;\n}\n\nfunction getNodeDocs(apiKey: string): string {\n return `\n# Datalyr Node.js Integration\n\n## Package to Install\n- @datalyr/api\n\n## Environment Variables\nAdd to .env:\n\\`\\`\\`\nDATALYR_API_KEY=${apiKey}\n\\`\\`\\`\n\n## Setup\n\n### 1. Create Datalyr Instance\nCreate \\`src/lib/datalyr.ts\\`:\n\\`\\`\\`ts\nimport Datalyr from '@datalyr/api';\n\nconst apiKey = process.env.DATALYR_API_KEY;\nif (!apiKey) {\n throw new Error('DATALYR_API_KEY is required');\n}\n\nexport const datalyr = new Datalyr(apiKey);\n\\`\\`\\`\n\n### 2. Track Events\n\\`\\`\\`ts\nimport { datalyr } from './lib/datalyr';\n\n// Track server-side events\nawait datalyr.track({\n event: 'order_completed',\n userId: 'user_123',\n properties: {\n orderId: 'order_456',\n amount: 99.99,\n },\n});\n\n// Identify a user\nawait datalyr.identify({\n userId: 'user_123',\n traits: {\n email: 'user@example.com',\n plan: 'premium',\n },\n});\n\\`\\`\\`\n`;\n}\n\nfunction getIOSDocs(_apiKey: string): string {\n return `\n# Datalyr iOS (Swift) Integration\n\n## Package to Install\nAdd via Swift Package Manager:\n- https://github.com/datalyr/datalyr-ios-sdk\n\n## Setup\n\n### 1. Add Keys to Info.plist\nAdd both keys to your Info.plist (or use xcconfig for different environments):\n\\`\\`\\`xml\n<key>DATALYR_WORKSPACE_ID</key>\n<string>YOUR_WORKSPACE_ID</string>\n<key>DATALYR_API_KEY</key>\n<string>YOUR_API_KEY</string>\n\\`\\`\\`\n\n**Security Note**: For production apps, consider using xcconfig files or build-time environment variables to inject these values, keeping them out of source control.\n\n### 2. Add Configuration File\nCreate \\`DatalyrConfig.swift\\`:\n\\`\\`\\`swift\nimport DatalyrSDK\nimport Foundation\n\nstruct DatalyrConfig {\n static func initialize() {\n guard let workspaceId = Bundle.main.object(forInfoDictionaryKey: \"DATALYR_WORKSPACE_ID\") as? String,\n let apiKey = Bundle.main.object(forInfoDictionaryKey: \"DATALYR_API_KEY\") as? String else {\n #if DEBUG\n fatalError(\"DATALYR_WORKSPACE_ID or DATALYR_API_KEY not found in Info.plist\")\n #else\n print(\"[Datalyr] Warning: SDK not configured - missing Info.plist keys\")\n return\n #endif\n }\n\n Datalyr.shared.configure(\n apiKey: apiKey,\n workspaceId: workspaceId,\n options: DatalyrOptions(\n debug: false,\n enableAutoEvents: true,\n enableAttribution: true\n )\n )\n }\n}\n\\`\\`\\`\n\n### 3. Initialize in App\nFor SwiftUI (\\`@main App\\`):\n\\`\\`\\`swift\n@main\nstruct MyApp: App {\n init() {\n DatalyrConfig.initialize()\n }\n\n var body: some Scene {\n WindowGroup {\n ContentView()\n }\n }\n}\n\\`\\`\\`\n\nFor UIKit (AppDelegate):\n\\`\\`\\`swift\nfunc application(_ application: UIApplication, didFinishLaunchingWithOptions...) -> Bool {\n DatalyrConfig.initialize()\n return true\n}\n\\`\\`\\`\n\n## Tracking Events\n\\`\\`\\`swift\nimport DatalyrSDK\n\n// Track an event\nDatalyr.shared.track(\"purchase_completed\", properties: [\n \"amount\": 99.99,\n \"currency\": \"USD\"\n])\n\n// Identify a user\nDatalyr.shared.identify(\"user_123\", traits: [\n \"email\": \"user@example.com\",\n \"plan\": \"premium\"\n])\n\\`\\`\\`\n`;\n}\n\nfunction getGenericWebDocs(apiKey: string): string {\n return `\n# Datalyr Web Integration\n\n## Package to Install\n- @datalyr/web\n\n## Setup\n\n### Via NPM\n\\`\\`\\`ts\nimport datalyr from '@datalyr/web';\n\ndatalyr.init({\n workspaceId: 'YOUR_WORKSPACE_ID',\n debug: true,\n});\n\n// Track events\ndatalyr.track('page_viewed', { page: '/home' });\n\\`\\`\\`\n\n### Via Script Tag\n\\`\\`\\`html\n<script src=\"https://track.datalyr.com/dl.js\"\n data-workspace-id=\"YOUR_WORKSPACE_ID\">\n</script>\n\\`\\`\\`\n`;\n}\n","/**\n * Framework Configuration Types\n * Defines SDK mappings and setup instructions for each supported framework\n */\n\nimport type { Framework, SDK } from '../../types.js';\n\nexport interface FrameworkConfig {\n /** Framework identifier */\n id: Framework;\n\n /** Display name */\n name: string;\n\n /** Package to detect in package.json */\n detectPackage: string;\n\n /** SDKs to install */\n sdks: SDK[];\n\n /** Environment variables */\n envVars: {\n key: string;\n description: string;\n isPublic: boolean;\n }[];\n\n /** Estimated setup time in minutes */\n estimatedTime: number;\n\n /** Documentation URL */\n docsUrl: string;\n\n /** Post-installation steps */\n postInstallSteps: string[];\n\n /** Files to look for to detect router type (Next.js specific) */\n routerDetection?: {\n appRouter: string[];\n pagesRouter: string[];\n };\n}\n\nexport const NEXTJS_CONFIG: FrameworkConfig = {\n id: 'nextjs',\n name: 'Next.js',\n detectPackage: 'next',\n sdks: ['@datalyr/web', '@datalyr/api'],\n envVars: [\n {\n key: 'NEXT_PUBLIC_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n {\n key: 'DATALYR_API_KEY',\n description: 'Server-side API key',\n isPublic: false,\n },\n ],\n estimatedTime: 3,\n docsUrl: 'https://docs.datalyr.com/sdks/nextjs',\n postInstallSteps: [\n 'Add your workspace ID to .env.local',\n 'Wrap your layout with DatalyrProvider',\n 'Start tracking events with datalyr.track()',\n ],\n routerDetection: {\n appRouter: ['app/layout.tsx', 'app/layout.jsx', 'app/layout.ts', 'app/layout.js'],\n pagesRouter: ['pages/_app.tsx', 'pages/_app.jsx', 'pages/_app.ts', 'pages/_app.js'],\n },\n};\n\nexport const REACT_CONFIG: FrameworkConfig = {\n id: 'react',\n name: 'React',\n detectPackage: 'react',\n sdks: ['@datalyr/web'],\n envVars: [\n {\n key: 'VITE_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n ],\n estimatedTime: 2,\n docsUrl: 'https://docs.datalyr.com/sdks/react',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Call initDatalyr() in your main file',\n ],\n};\n\nexport const REACT_NATIVE_CONFIG: FrameworkConfig = {\n id: 'react-native',\n name: 'React Native',\n detectPackage: 'react-native',\n sdks: ['@datalyr/react-native'],\n envVars: [],\n estimatedTime: 5,\n docsUrl: 'https://docs.datalyr.com/sdks/react-native',\n postInstallSteps: [\n 'Run: cd ios && pod install',\n 'Call initDatalyr() in App.tsx',\n 'For attribution, configure Meta/TikTok app IDs',\n ],\n};\n\nexport const EXPO_CONFIG: FrameworkConfig = {\n id: 'expo',\n name: 'Expo',\n detectPackage: 'expo',\n sdks: ['@datalyr/react-native'],\n envVars: [],\n estimatedTime: 3,\n docsUrl: 'https://docs.datalyr.com/sdks/expo',\n postInstallSteps: [\n 'Call initDatalyr() in App.tsx',\n 'For attribution, configure Meta/TikTok app IDs in app.json',\n ],\n};\n\nexport const SVELTEKIT_CONFIG: FrameworkConfig = {\n id: 'sveltekit',\n name: 'SvelteKit',\n detectPackage: '@sveltejs/kit',\n sdks: ['@datalyr/web', '@datalyr/api'],\n envVars: [\n {\n key: 'PUBLIC_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n {\n key: 'DATALYR_API_KEY',\n description: 'Server-side API key',\n isPublic: false,\n },\n ],\n estimatedTime: 3,\n docsUrl: 'https://docs.datalyr.com/sdks/sveltekit',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Call initDatalyr() in +layout.svelte',\n ],\n};\n\nexport const NODE_CONFIG: FrameworkConfig = {\n id: 'node',\n name: 'Node.js',\n detectPackage: 'express',\n sdks: ['@datalyr/api'],\n envVars: [\n {\n key: 'DATALYR_API_KEY',\n description: 'Your Datalyr API key',\n isPublic: false,\n },\n ],\n estimatedTime: 2,\n docsUrl: 'https://docs.datalyr.com/sdks/node',\n postInstallSteps: [\n 'Add your API key to .env',\n 'Track events with datalyr.track()',\n ],\n};\n\nexport const VUE_CONFIG: FrameworkConfig = {\n id: 'vue',\n name: 'Vue.js',\n detectPackage: 'vue',\n sdks: ['@datalyr/web'],\n envVars: [\n {\n key: 'VITE_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n ],\n estimatedTime: 2,\n docsUrl: 'https://docs.datalyr.com/sdks/vue',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Call datalyr.init() in main.ts',\n 'Track events with datalyr.track()',\n ],\n};\n\nexport const NUXT_CONFIG: FrameworkConfig = {\n id: 'nuxt',\n name: 'Nuxt',\n detectPackage: 'nuxt',\n sdks: ['@datalyr/web', '@datalyr/api'],\n envVars: [\n {\n key: 'NUXT_PUBLIC_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n {\n key: 'DATALYR_API_KEY',\n description: 'Server-side API key',\n isPublic: false,\n },\n ],\n estimatedTime: 3,\n docsUrl: 'https://docs.datalyr.com/sdks/nuxt',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Create a Nuxt plugin for initialization',\n 'Track events with datalyr.track()',\n ],\n};\n\nexport const REMIX_CONFIG: FrameworkConfig = {\n id: 'remix',\n name: 'Remix',\n detectPackage: '@remix-run/react',\n sdks: ['@datalyr/web', '@datalyr/api'],\n envVars: [\n {\n key: 'DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n {\n key: 'DATALYR_API_KEY',\n description: 'Server-side API key',\n isPublic: false,\n },\n ],\n estimatedTime: 3,\n docsUrl: 'https://docs.datalyr.com/sdks/remix',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Initialize in root.tsx',\n 'Track events with datalyr.track()',\n ],\n};\n\nexport const ASTRO_CONFIG: FrameworkConfig = {\n id: 'astro',\n name: 'Astro',\n detectPackage: 'astro',\n sdks: ['@datalyr/web'],\n envVars: [\n {\n key: 'PUBLIC_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n ],\n estimatedTime: 2,\n docsUrl: 'https://docs.datalyr.com/sdks/astro',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Add script to Layout component',\n 'Track events with datalyr.track()',\n ],\n};\n\nexport const IOS_CONFIG: FrameworkConfig = {\n id: 'ios',\n name: 'iOS (Swift)',\n detectPackage: '', // Detected by Package.swift or .xcodeproj\n sdks: ['DatalyrSDK'],\n envVars: [\n {\n key: 'DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID (in Info.plist)',\n isPublic: false,\n },\n {\n key: 'DATALYR_API_KEY',\n description: 'Your Datalyr API key (in Info.plist)',\n isPublic: false,\n },\n ],\n estimatedTime: 5,\n docsUrl: 'https://docs.datalyr.com/sdks/ios',\n postInstallSteps: [\n 'Add DatalyrSDK via Swift Package Manager',\n 'Add keys to Info.plist',\n 'Call DatalyrConfig.initialize() in App init',\n ],\n};\n\nexport const SVELTE_CONFIG: FrameworkConfig = {\n id: 'svelte',\n name: 'Svelte',\n detectPackage: 'svelte',\n sdks: ['@datalyr/web'],\n envVars: [\n {\n key: 'VITE_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n ],\n estimatedTime: 2,\n docsUrl: 'https://docs.datalyr.com/sdks/svelte',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Call initDatalyr() in App.svelte',\n ],\n};\n\nexport const FRAMEWORK_CONFIGS: Record<Framework, FrameworkConfig | undefined> = {\n nextjs: NEXTJS_CONFIG,\n react: REACT_CONFIG,\n 'react-vite': REACT_CONFIG,\n svelte: SVELTE_CONFIG,\n sveltekit: SVELTEKIT_CONFIG,\n vue: VUE_CONFIG,\n nuxt: NUXT_CONFIG,\n remix: REMIX_CONFIG,\n astro: ASTRO_CONFIG,\n 'react-native': REACT_NATIVE_CONFIG,\n expo: EXPO_CONFIG,\n ios: IOS_CONFIG,\n node: NODE_CONFIG,\n unknown: undefined,\n};\n\nexport function getFrameworkConfig(framework: Framework): FrameworkConfig | undefined {\n return FRAMEWORK_CONFIGS[framework];\n}\n\nexport function getSdksForFramework(framework: Framework): SDK[] {\n const config = FRAMEWORK_CONFIGS[framework];\n if (!config) {\n // Default SDKs for unknown frameworks\n return ['@datalyr/web'];\n }\n return config.sdks;\n}\n","/**\n * Event Tracking Suggestions\n * Provides recommended events based on business type\n */\n\nexport type BusinessType = 'saas' | 'mobile_app' | 'lead_gen' | 'b2b' | 'agency';\n\n// Keep AppType as alias for backward compatibility\nexport type AppType = BusinessType;\n\nexport interface BusinessTypeInfo {\n id: BusinessType;\n label: string;\n description: string;\n hint: string;\n}\n\n// Backward compatibility alias\nexport type AppTypeInfo = BusinessTypeInfo;\n\nexport interface EventSuggestion {\n name: string;\n description: string;\n properties: string[];\n priority: 'high' | 'medium' | 'low';\n}\n\nexport const BUSINESS_TYPES: BusinessTypeInfo[] = [\n {\n id: 'saas',\n label: 'SaaS / Web App',\n description: 'Subscription or freemium product',\n hint: 'Trials, signups, features, upgrades',\n },\n {\n id: 'mobile_app',\n label: 'Mobile App',\n description: 'Consumer or B2B mobile app',\n hint: 'Installs, in-app events, attribution',\n },\n {\n id: 'lead_gen',\n label: 'Lead Gen / Marketing',\n description: 'Capture leads and conversions',\n hint: 'Funnels, forms, demos, signups',\n },\n {\n id: 'b2b',\n label: 'B2B Product',\n description: 'Business software',\n hint: 'Demos, trials, team invites, usage',\n },\n {\n id: 'agency',\n label: 'Agency / Client Work',\n description: 'Building for clients',\n hint: 'Multi-site, white-label tracking',\n },\n];\n\n// Backward compatibility\nexport const APP_TYPES = BUSINESS_TYPES;\n\nconst EVENT_SUGGESTIONS: Record<BusinessType, EventSuggestion[]> = {\n saas: [\n {\n name: 'signed_up',\n description: 'User created an account',\n properties: ['method', 'referrer'],\n priority: 'high',\n },\n {\n name: 'trial_started',\n description: 'User started a free trial',\n properties: ['plan'],\n priority: 'high',\n },\n {\n name: 'subscription_started',\n description: 'User converted to paid',\n properties: ['plan', 'value', 'currency'],\n priority: 'high',\n },\n {\n name: 'onboarding_completed',\n description: 'User finished onboarding',\n properties: ['steps_completed'],\n priority: 'medium',\n },\n ],\n\n mobile_app: [\n {\n name: 'signed_up',\n description: 'User created an account',\n properties: ['method', 'referrer'],\n priority: 'high',\n },\n {\n name: 'onboarding_started',\n description: 'User started onboarding flow',\n properties: ['source'],\n priority: 'high',\n },\n {\n name: 'onboarding_completed',\n description: 'User finished onboarding',\n properties: ['steps_completed'],\n priority: 'high',\n },\n {\n name: 'paywall_viewed',\n description: 'User saw the paywall/pricing',\n properties: ['source', 'paywall_id'],\n priority: 'high',\n },\n {\n name: 'trial_started',\n description: 'User started a free trial',\n properties: ['plan'],\n priority: 'high',\n },\n {\n name: 'subscription_started',\n description: 'User converted to paid subscription',\n properties: ['plan', 'value', 'currency'],\n priority: 'high',\n },\n {\n name: 'purchase',\n description: 'User made in-app purchase',\n properties: ['product_id', 'value', 'currency'],\n priority: 'medium',\n },\n ],\n\n lead_gen: [\n {\n name: 'lead',\n description: 'User submitted their info',\n properties: ['form_name', 'source'],\n priority: 'high',\n },\n {\n name: 'signed_up',\n description: 'User signed up / joined waitlist',\n properties: ['method', 'referrer'],\n priority: 'high',\n },\n {\n name: 'demo_requested',\n description: 'User requested a demo',\n properties: ['product'],\n priority: 'high',\n },\n {\n name: 'cta_clicked',\n description: 'User clicked a CTA',\n properties: ['button_name', 'page'],\n priority: 'medium',\n },\n ],\n\n b2b: [\n {\n name: 'signed_up',\n description: 'User created an account',\n properties: ['method', 'company_size'],\n priority: 'high',\n },\n {\n name: 'demo_requested',\n description: 'User requested a demo',\n properties: ['product', 'company_size'],\n priority: 'high',\n },\n {\n name: 'trial_started',\n description: 'User started a trial',\n properties: ['plan'],\n priority: 'high',\n },\n {\n name: 'lead',\n description: 'Lead captured',\n properties: ['source', 'company_size'],\n priority: 'high',\n },\n ],\n\n agency: [\n {\n name: 'lead',\n description: 'Lead captured',\n properties: ['form_name', 'client_id'],\n priority: 'high',\n },\n {\n name: 'conversion',\n description: 'Conversion event',\n properties: ['conversion_type', 'value', 'client_id'],\n priority: 'high',\n },\n {\n name: 'form_submitted',\n description: 'User submitted a form',\n properties: ['form_name', 'client_id'],\n priority: 'high',\n },\n {\n name: 'cta_clicked',\n description: 'User clicked a CTA',\n properties: ['button_name', 'client_id'],\n priority: 'medium',\n },\n ],\n};\n\n/**\n * Get event suggestions for a business type\n */\nexport function getEventSuggestions(businessType: BusinessType): EventSuggestion[] {\n return EVENT_SUGGESTIONS[businessType] || EVENT_SUGGESTIONS.saas;\n}\n\n/**\n * Get high priority events for a business type\n */\nexport function getHighPriorityEvents(businessType: BusinessType): EventSuggestion[] {\n return getEventSuggestions(businessType).filter(e => e.priority === 'high');\n}\n\n/**\n * Generate example tracking code for an event\n */\nexport function generateEventCode(event: EventSuggestion): string {\n const propsObj = event.properties\n .slice(0, 3)\n .map(p => `${p}: '...'`)\n .join(', ');\n\n return `datalyr.track('${event.name}', { ${propsObj} });`;\n}\n\n/**\n * Format event description with properties for display in UI\n */\nexport function formatEventDescription(event: EventSuggestion): string {\n const propsDisplay = event.properties.length > 0\n ? ` (${event.properties.join(', ')})`\n : '';\n return `${event.description}${propsDisplay}`;\n}\n\n/**\n * Build multiselect options for event selection with \"All recommended\" option\n */\nexport interface EventSelectOption {\n value: string;\n label: string;\n hint: string;\n}\n\nexport function buildEventSelectOptions(\n events: EventSuggestion[],\n includeAllOption: boolean = true\n): EventSelectOption[] {\n const options: EventSelectOption[] = [];\n\n // Add \"All recommended\" option at the top\n if (includeAllOption) {\n const highPriorityCount = events.filter(e => e.priority === 'high').length;\n options.push({\n value: '__all_recommended__',\n label: 'All recommended events',\n hint: `Select all ${highPriorityCount} high-priority events`,\n });\n }\n\n // Add individual events\n for (const event of events) {\n const priorityBadge = event.priority === 'high' ? '[recommended] ' : '';\n options.push({\n value: event.name,\n label: event.name,\n hint: `${priorityBadge}${formatEventDescription(event)}`,\n });\n }\n\n return options;\n}\n\n/**\n * Resolve selected event values, handling the \"All recommended\" option\n */\nexport function resolveSelectedEvents(\n selectedValues: string[],\n allEvents: EventSuggestion[]\n): EventSuggestion[] {\n // If \"All recommended\" is selected, return all high-priority events\n if (selectedValues.includes('__all_recommended__')) {\n return allEvents.filter(e => e.priority === 'high');\n }\n\n // Filter selected events by name\n return allEvents.filter(e => selectedValues.includes(e.name));\n}\n","/**\n * Platform Configuration\n * Handles platform type, ad platforms, and attribution setup\n */\n\nexport type PlatformType = 'web' | 'mobile' | 'both';\n\nexport type AdPlatform = 'meta' | 'google' | 'tiktok' | 'apple_search_ads' | 'none';\n\nexport interface PlatformConfig {\n /** Web, Mobile, or Both */\n platformType: PlatformType;\n\n /** Ad platforms for attribution */\n adPlatforms: AdPlatform[];\n\n /** Whether to set up deep linking (mobile) */\n enableDeepLinking: boolean;\n\n /** Whether to set up server-side conversions (CAPI) */\n enableServerSideConversions: boolean;\n}\n\nexport interface PlatformTypeInfo {\n id: PlatformType;\n label: string;\n description: string;\n hint: string;\n}\n\nexport interface AdPlatformInfo {\n id: AdPlatform;\n label: string;\n description: string;\n requiresServerSide: boolean;\n configKeys: string[];\n}\n\nexport const PLATFORM_TYPES: PlatformTypeInfo[] = [\n {\n id: 'web',\n label: 'Web Only',\n description: 'Website or web application',\n hint: 'React, Next.js, Svelte, etc.',\n },\n {\n id: 'mobile',\n label: 'Mobile Only',\n description: 'iOS or Android app',\n hint: 'React Native, Expo, Swift',\n },\n {\n id: 'both',\n label: 'Web + Mobile',\n description: 'Both web and mobile apps',\n hint: 'Full cross-platform attribution',\n },\n];\n\nexport const AD_PLATFORMS: AdPlatformInfo[] = [\n {\n id: 'meta',\n label: 'Meta Ads (Facebook/Instagram)',\n description: 'Track conversions from Meta campaigns',\n requiresServerSide: true,\n configKeys: ['META_PIXEL_ID', 'META_ACCESS_TOKEN', 'META_APP_ID'],\n },\n {\n id: 'google',\n label: 'Google Ads',\n description: 'Track conversions from Google campaigns',\n requiresServerSide: true,\n configKeys: ['GOOGLE_ADS_CUSTOMER_ID', 'GOOGLE_ADS_CONVERSION_ID'],\n },\n {\n id: 'tiktok',\n label: 'TikTok Ads',\n description: 'Track conversions from TikTok campaigns',\n requiresServerSide: true,\n configKeys: ['TIKTOK_PIXEL_ID', 'TIKTOK_ACCESS_TOKEN', 'TIKTOK_APP_ID'],\n },\n {\n id: 'apple_search_ads',\n label: 'Apple Search Ads',\n description: 'Track iOS app install attribution',\n requiresServerSide: false,\n configKeys: [],\n },\n {\n id: 'none',\n label: 'No ad platforms',\n description: 'Skip ad platform setup',\n requiresServerSide: false,\n configKeys: [],\n },\n];\n\n/**\n * Determine which SDKs are needed based on platform config\n */\nexport function getSdksForPlatform(\n platformType: PlatformType,\n adPlatforms: AdPlatform[],\n): string[] {\n const sdks: string[] = [];\n\n // Base SDKs based on platform\n if (platformType === 'web' || platformType === 'both') {\n sdks.push('@datalyr/web');\n }\n\n if (platformType === 'mobile' || platformType === 'both') {\n sdks.push('@datalyr/react-native');\n }\n\n // Server-side SDK if using ad platforms with CAPI\n const needsServerSide = adPlatforms.some(\n p => AD_PLATFORMS.find(ap => ap.id === p)?.requiresServerSide\n );\n\n if (needsServerSide) {\n sdks.push('@datalyr/api');\n }\n\n return sdks;\n}\n\n/**\n * Get environment variables needed for ad platform setup\n */\nexport function getAdPlatformEnvVars(adPlatforms: AdPlatform[]): {\n key: string;\n description: string;\n platform: AdPlatform;\n}[] {\n const envVars: { key: string; description: string; platform: AdPlatform }[] = [];\n\n for (const platformId of adPlatforms) {\n const platform = AD_PLATFORMS.find(p => p.id === platformId);\n if (!platform) continue;\n\n for (const key of platform.configKeys) {\n envVars.push({\n key,\n description: `${platform.label} - ${key.replace(/_/g, ' ').toLowerCase()}`,\n platform: platformId,\n });\n }\n }\n\n return envVars;\n}\n\n/**\n * Get attribution-related events based on platform and ad config\n */\nexport function getAttributionEvents(config: PlatformConfig): {\n name: string;\n description: string;\n properties: string[];\n serverSide: boolean;\n}[] {\n const events: {\n name: string;\n description: string;\n properties: string[];\n serverSide: boolean;\n }[] = [];\n\n // App install (mobile only)\n if (config.platformType === 'mobile' || config.platformType === 'both') {\n events.push({\n name: 'app_install',\n description: 'User installed the app (auto-tracked)',\n properties: ['attribution_source', 'campaign_id', 'ad_group_id'],\n serverSide: false,\n });\n\n events.push({\n name: 'app_open',\n description: 'User opened the app',\n properties: ['source', 'deep_link_url', 'is_first_open'],\n serverSide: false,\n });\n }\n\n // Deep link events\n if (config.enableDeepLinking) {\n events.push({\n name: 'deep_link_opened',\n description: 'User opened a deep link',\n properties: ['url', 'source', 'campaign'],\n serverSide: false,\n });\n\n events.push({\n name: 'deferred_deep_link',\n description: 'User installed via deferred deep link',\n properties: ['original_url', 'install_time', 'open_time'],\n serverSide: false,\n });\n }\n\n // Server-side conversion events\n if (config.enableServerSideConversions) {\n // Meta CAPI events\n if (config.adPlatforms.includes('meta')) {\n events.push({\n name: 'purchase',\n description: 'Purchase event for Meta CAPI',\n properties: ['value', 'currency', 'email', 'phone', 'fbc', 'fbp'],\n serverSide: true,\n });\n\n events.push({\n name: 'lead',\n description: 'Lead event for Meta CAPI',\n properties: ['email', 'phone', 'fbc', 'fbp'],\n serverSide: true,\n });\n }\n\n // TikTok Events API\n if (config.adPlatforms.includes('tiktok')) {\n events.push({\n name: 'complete_payment',\n description: 'Purchase event for TikTok Events API',\n properties: ['value', 'currency', 'email', 'phone', 'ttclid'],\n serverSide: true,\n });\n }\n\n // Google Ads\n if (config.adPlatforms.includes('google')) {\n events.push({\n name: 'conversion',\n description: 'Conversion event for Google Ads',\n properties: ['value', 'currency', 'email', 'phone', 'gclid'],\n serverSide: true,\n });\n }\n }\n\n return events;\n}\n\n/**\n * Get post-install steps based on platform configuration\n */\nexport function getPlatformPostInstallSteps(config: PlatformConfig): string[] {\n const steps: string[] = [];\n\n // Mobile-specific steps\n if (config.platformType === 'mobile' || config.platformType === 'both') {\n steps.push('Run `cd ios && pod install` to install native dependencies');\n\n if (config.enableDeepLinking) {\n steps.push('Configure URL schemes in Xcode/Android manifest for deep linking');\n steps.push('Set up Associated Domains (iOS) or App Links (Android)');\n }\n }\n\n // Ad platform steps\n for (const platformId of config.adPlatforms) {\n const platform = AD_PLATFORMS.find(p => p.id === platformId);\n if (!platform || platformId === 'none') continue;\n\n steps.push(`Add ${platform.label} credentials to your environment variables`);\n\n if (platform.requiresServerSide) {\n steps.push(`Set up server-side endpoint for ${platform.label} conversions`);\n }\n\n // Mobile-specific ad platform steps\n if (config.platformType !== 'web') {\n if (platformId === 'meta') {\n steps.push('Add Meta App ID to Info.plist (iOS) and AndroidManifest.xml');\n }\n if (platformId === 'tiktok') {\n steps.push('Add TikTok App ID to Info.plist (iOS) and AndroidManifest.xml');\n }\n if (platformId === 'apple_search_ads') {\n steps.push('Enable AdServices.framework in Xcode');\n }\n }\n }\n\n return steps;\n}\n\n/**\n * Generate code snippet for tracking attribution events\n */\nexport function generateAttributionCode(\n event: { name: string; properties: string[]; serverSide: boolean },\n language: 'typescript' | 'javascript' = 'typescript',\n): string {\n const propsObj = event.properties\n .slice(0, 3)\n .map(p => `${p}: '...'`)\n .join(', ');\n\n if (event.serverSide) {\n return language === 'typescript'\n ? `await datalyr.track('${event.name}', { ${propsObj} }, { userId: user.id });`\n : `await datalyr.track('${event.name}', { ${propsObj} }, { userId: user.id });`;\n }\n\n return `datalyr.track('${event.name}', { ${propsObj} });`;\n}\n","/**\n * Generate AI context file for coding assistants\n * This file helps Cursor, Bolt, Claude etc understand the Datalyr setup\n */\n\nimport type { Framework } from '../types.js';\nimport type { BusinessType, EventSuggestion } from '../agent/events/suggestions.js';\nimport type { AdPlatform, PlatformType } from '../agent/platform/config.js';\n\n/**\n * Infer TypeScript type from property name\n */\nfunction inferPropertyType(propName: string): string {\n const lowerName = propName.toLowerCase();\n\n // Numeric types\n if (['value', 'price', 'amount', 'total', 'quantity', 'count', 'steps_completed'].some(n => lowerName.includes(n))) {\n return 'number';\n }\n\n // Boolean types\n if (['is_', 'has_', 'enable', 'disable'].some(n => lowerName.startsWith(n) || lowerName.includes(n))) {\n return 'boolean';\n }\n\n // Currency is typically a 3-letter code\n if (lowerName === 'currency') {\n return 'string; // ISO 4217 code (e.g., \"USD\", \"EUR\")';\n }\n\n // Email/phone are common identifiers\n if (lowerName === 'email') {\n return 'string; // User email for attribution matching';\n }\n if (lowerName === 'phone') {\n return 'string; // User phone for attribution matching';\n }\n\n // IDs\n if (lowerName.endsWith('_id') || lowerName === 'id') {\n return 'string';\n }\n\n // Default to string\n return 'string';\n}\n\nexport interface AIContextParams {\n workspaceName: string;\n workspaceId: string;\n framework: Framework;\n platformType: PlatformType;\n adPlatforms: AdPlatform[];\n businessType: BusinessType;\n selectedEvents: EventSuggestion[];\n sdks: string[];\n enableServerSideConversions: boolean;\n enableContainer?: boolean;\n}\n\nexport function generateAIContextDoc(params: AIContextParams): string {\n const {\n workspaceName,\n workspaceId,\n framework,\n platformType,\n adPlatforms,\n businessType,\n selectedEvents,\n sdks,\n enableServerSideConversions,\n enableContainer = true,\n } = params;\n\n // Build detailed event list with TypeScript interface-style property docs\n const eventsList = selectedEvents\n .map(e => {\n const propsWithTypes = e.properties.map(p => {\n // Infer likely types from property names\n const type = inferPropertyType(p);\n return ` ${p}: ${type};`;\n }).join('\\n');\n return `### \\`${e.name}\\`\\n${e.description}\\n\\n\\`\\`\\`typescript\\ndatalyr.track('${e.name}', {\\n${propsWithTypes}\\n});\\n\\`\\`\\``;\n })\n .join('\\n\\n');\n\n const trackingExamples = selectedEvents.slice(0, 3).map(e => {\n const props = e.properties.slice(0, 2).map(p => `${p}: '...'`).join(', ');\n return `datalyr.track('${e.name}', { ${props} });`;\n }).join('\\n');\n\n const serverSideExample = enableServerSideConversions ? `\n## Server-Side Tracking (CAPI)\n\nFor conversion events that need server-side tracking:\n\n\\`\\`\\`typescript\n// In your API route or server action\nimport { datalyr } from '@/lib/datalyr.server';\n\nawait datalyr.track({\n event: 'purchase',\n userId: user.id,\n properties: {\n value: 99.00,\n currency: 'USD',\n email: user.email, // Required for ad platform matching\n phone: user.phone, // Optional, improves match rate\n },\n});\n\\`\\`\\`\n` : '';\n\n const adPlatformsSection = adPlatforms.length > 0 ? `\n## Attribution Setup\n\nAd platforms configured: ${adPlatforms.join(', ')}\n\nFor proper attribution matching, include user data in conversion events:\n- \\`email\\`: User's email (hashed automatically)\n- \\`phone\\`: User's phone number (hashed automatically)\n${adPlatforms.includes('meta') ? '- `fbc`, `fbp`: Meta click/browser IDs (from cookies)' : ''}\n${adPlatforms.includes('google') ? '- `gclid`: Google click ID (from URL params)' : ''}\n${adPlatforms.includes('tiktok') ? '- `ttclid`: TikTok click ID (from URL params)' : ''}\n` : '';\n\n const containerSection = enableContainer ? `\n## Container Scripts\n\nContainer scripts are **enabled**. Third-party pixels (Meta Pixel, Google Tag, TikTok Pixel)\nare managed through the Datalyr dashboard, not in code.\n\nConfigure pixels at: https://app.datalyr.com/dashboard/${workspaceId}/settings/pixels\n\nBenefits:\n- Add/remove pixels without code changes\n- Events tracked with \\`datalyr.track()\\` auto-fire to all configured pixels\n- Server-side fallback for ad blockers\n` : '';\n\n return `# Datalyr Analytics Setup\n\nThis file documents the Datalyr analytics configuration for AI coding assistants.\n\n## Project Info\n\n- **Workspace**: ${workspaceName}\n- **Workspace ID**: \\`${workspaceId}\\`\n- **Framework**: ${framework}\n- **Platform**: ${platformType}\n- **Business Type**: ${businessType}\n- **SDKs**: ${sdks.join(', ')}\n\n## Quick Start\n\n${framework === 'ios' ? `\\`\\`\\`swift\nimport DatalyrSDK\n\n// Track an event\nDatalyr.shared.track(\"event_name\", properties: [\"key\": \"value\"])\n\\`\\`\\`` : `\\`\\`\\`typescript\nimport datalyr from '@datalyr/web';\n\n// Track an event\n${trackingExamples}\n\\`\\`\\``}\n\n## Events to Track\n\n${eventsList}\n\n## Usage Patterns\n\n### Identify Users\n\n\\`\\`\\`typescript\n// After user signs in\ndatalyr.identify(user.id, {\n email: user.email,\n name: user.name,\n plan: user.plan,\n});\n\\`\\`\\`\n\n### Track Events\n\n\\`\\`\\`typescript\n// Track any event with properties\ndatalyr.track('event_name', {\n property: 'value',\n value: 100,\n});\n\\`\\`\\`\n${serverSideExample}${adPlatformsSection}${containerSection}\n## Dashboard\n\nView your analytics at:\nhttps://app.datalyr.com/dashboard/${workspaceId}/events\n\n## Documentation\n\n- SDK Docs: https://docs.datalyr.com/sdks/${framework}\n- API Reference: https://docs.datalyr.com/api\n`;\n}\n"],"mappings":"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","names":["import_path","import_path","fs","path","path","path","import_path","path","import_path","text","ora","chalk","path","spinner","p","spinner","import_chalk","import_chalk","chalk","import_chalk","p","p","p","import_path","import_fs","import_glob","chalk","exec","promisify","execAsync","p","input","path","spinner","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/detection/detector.ts","../src/utils/fs.ts","../src/utils/package-manager.ts","../src/generators/templates/nextjs.ts","../src/generators/templates/react.ts","../src/generators/templates/react-native.ts","../src/installers/env.ts","../src/cli/ui.ts","../src/generators/index.ts","../src/installers/npm.ts","../src/cli/prompts.ts","../src/utils/logger.ts","../src/agent/runner.ts","../src/agent/interface.ts","../src/agent/docs/index.ts","../src/agent/configs/types.ts","../src/agent/events/suggestions.ts","../src/agent/platform/config.ts","../src/generators/ai-context.ts"],"sourcesContent":["import path from 'path';\nimport type { WizardOptions, ProjectContext, InstallationPlan } from './types.js';\nimport { detectFramework, getFrameworkDisplayName } from './detection/detector.js';\nimport { detectPackageManager } from './utils/package-manager.js';\nimport { generateInstallationPlan } from './generators/index.js';\nimport { installPackages } from './installers/npm.js';\nimport { updateEnvFile } from './installers/env.js';\nimport { writeFile, fileExists, findFiles } from './utils/fs.js';\nimport {\n printWelcome,\n printDetection,\n printPlan,\n printSuccess,\n printError,\n printDryRun,\n startSpinner,\n succeedSpinner,\n failSpinner,\n stopSpinner,\n} from './cli/ui.js';\nimport {\n promptApiKey,\n promptFramework,\n promptProceed,\n} from './cli/prompts.js';\nimport { logger } from './utils/logger.js';\n\nexport async function runWizard(options: WizardOptions = {}): Promise<boolean> {\n const cwd = options.cwd || process.cwd();\n const isInteractive = !options.yes && !options.json && !options.dryRun;\n\n try {\n // Welcome message\n if (isInteractive) {\n printWelcome();\n }\n\n // Step 1: Get API key (skip for dry-run/json modes)\n let apiKey = options.apiKey || 'dk_placeholder';\n if (isInteractive) {\n logger.step(1, 5, 'Enter your Datalyr API Key');\n apiKey = await promptApiKey(options.apiKey);\n logger.success('API key validated');\n }\n\n // Step 2: Detect framework\n if (!options.json) {\n logger.step(2, 5, 'Analyzing your project...');\n }\n const spinner = options.json ? null : startSpinner('Scanning project structure...');\n\n let detection = await detectFramework(cwd);\n if (spinner) {\n succeedSpinner(`Detected ${getFrameworkDisplayName(detection.framework)}`);\n }\n\n // If detection failed or user specified framework, use that\n if (detection.framework === 'unknown' || options.framework) {\n stopSpinner();\n if (options.framework) {\n detection = { ...detection, framework: options.framework };\n } else if (isInteractive) {\n logger.warn('Could not auto-detect framework');\n detection.framework = await promptFramework();\n } else {\n printError('Could not detect framework', 'Use --framework to specify');\n return false;\n }\n }\n\n // Build project context\n const packageManager = await detectPackageManager(cwd);\n const entryPoints = await findEntryPoints(cwd, detection.framework);\n\n const context: ProjectContext = {\n cwd,\n framework: detection.framework,\n sdks: detection.sdks,\n language: detection.language,\n packageManager,\n entryPoints,\n existingFiles: [],\n };\n\n if (isInteractive) {\n printDetection({\n framework: getFrameworkDisplayName(detection.framework),\n language: detection.language === 'typescript' ? 'TypeScript' : 'JavaScript',\n sdks: detection.sdks,\n });\n }\n\n // Step 3: Generate installation plan\n if (!options.json && !options.dryRun) {\n logger.step(3, 5, 'Installation Plan');\n }\n const plan = generateInstallationPlan(context, apiKey);\n\n if (options.dryRun) {\n const commands = [\n `${packageManager} add ${plan.packages.join(' ')}`,\n ];\n printDryRun({\n packages: plan.packages,\n files: plan.files,\n commands,\n });\n return true;\n }\n\n if (options.json) {\n console.log(JSON.stringify({\n framework: detection.framework,\n language: detection.language,\n sdks: detection.sdks,\n packages: plan.packages,\n files: plan.files.map(f => ({ path: f.path, action: f.action })),\n envVars: plan.envVars.map(v => v.key),\n }, null, 2));\n return true;\n }\n\n printPlan({\n packages: plan.packages,\n files: plan.files,\n });\n\n // Confirm with user\n if (isInteractive) {\n const proceed = await promptProceed();\n if (!proceed) {\n logger.info('Installation cancelled');\n return false;\n }\n }\n\n // Step 4: Execute installation\n logger.step(4, 5, 'Installing...');\n\n // Install packages\n if (plan.packages.length > 0) {\n const success = await installPackages(cwd, plan.packages);\n if (!success) {\n printError('Failed to install packages');\n return false;\n }\n }\n\n // Create/update files\n for (const file of plan.files) {\n const filePath = path.join(cwd, file.path);\n const exists = await fileExists(filePath);\n\n if (exists && file.action === 'create') {\n logger.warn(`Skipping ${file.path} (already exists)`);\n continue;\n }\n\n const fileSpinner = startSpinner(`Creating ${file.path}...`);\n await writeFile(filePath, file.content);\n succeedSpinner(`Created ${file.path}`);\n }\n\n // Update env file\n if (plan.envVars.length > 0) {\n await updateEnvFile(cwd, plan.envVars);\n }\n\n // Step 5: Success!\n logger.step(5, 5, 'Success!');\n printSuccess();\n\n // Print post-install steps\n if (plan.postInstallSteps.length > 0) {\n logger.header('Next steps:');\n plan.postInstallSteps.forEach((step, i) => {\n console.log(` ${i + 1}. ${step}`);\n });\n console.log();\n }\n\n return true;\n } catch (error) {\n stopSpinner();\n printError(\n error instanceof Error ? error.message : 'Unknown error occurred',\n options.debug ? (error as Error).stack : undefined,\n );\n return false;\n }\n}\n\nasync function findEntryPoints(cwd: string, framework: string): Promise<string[]> {\n const entryPoints: string[] = [];\n\n switch (framework) {\n case 'nextjs':\n // Check for App Router\n const appLayouts = await findFiles(cwd, 'app/layout.{tsx,jsx,ts,js}');\n entryPoints.push(...appLayouts);\n // Check for Pages Router\n const pagesApps = await findFiles(cwd, 'pages/_app.{tsx,jsx,ts,js}');\n entryPoints.push(...pagesApps);\n break;\n\n case 'react':\n case 'react-vite':\n const mains = await findFiles(cwd, 'src/main.{tsx,jsx,ts,js}');\n entryPoints.push(...mains);\n const apps = await findFiles(cwd, 'src/App.{tsx,jsx,ts,js}');\n entryPoints.push(...apps);\n break;\n\n case 'react-native':\n case 'expo':\n const appFiles = await findFiles(cwd, 'App.{tsx,jsx,ts,js}');\n entryPoints.push(...appFiles);\n break;\n }\n\n return entryPoints;\n}\n\n// Re-export types for library usage\nexport type { WizardOptions, ProjectContext, InstallationPlan, Framework, SDK, PackageManager } from './types.js';\nexport { detectFramework } from './detection/detector.js';\nexport { generateInstallationPlan } from './generators/index.js';\nexport { runAgentWizard, type WizardAgentOptions } from './agent/runner.js';\n","import path from 'path';\nimport type { DetectionResult, Framework, PackageJson, SDK } from '../types.js';\nimport { fileExists, readPackageJson, findFile } from '../utils/fs.js';\n\ninterface FrameworkSignal {\n framework: Framework;\n score: number;\n signal: string;\n}\n\nexport async function detectFramework(cwd: string): Promise<DetectionResult> {\n const signals: FrameworkSignal[] = [];\n const pkg = await readPackageJson(cwd);\n const deps = { ...pkg?.dependencies, ...pkg?.devDependencies };\n\n // Check for iOS/Swift project first (no package.json needed)\n if (await fileExists(path.join(cwd, 'Package.swift'))) {\n signals.push({ framework: 'ios', score: 100, signal: 'Package.swift found' });\n }\n const xcodeprojs = await findFile(cwd, ['*.xcodeproj', '*.xcworkspace']);\n if (xcodeprojs) {\n signals.push({ framework: 'ios', score: 90, signal: 'Xcode project found' });\n }\n\n if (!pkg) {\n // No package.json - check if it's iOS or unknown\n const iosScore = signals.filter(s => s.framework === 'ios').reduce((a, b) => a + b.score, 0);\n if (iosScore > 0) {\n return buildResult('ios', signals, null);\n }\n return buildResult('unknown', [], null);\n }\n\n // Next.js detection\n if (deps.next) {\n signals.push({ framework: 'nextjs', score: 100, signal: 'next in dependencies' });\n if (await fileExists(path.join(cwd, 'app', 'layout.tsx')) ||\n await fileExists(path.join(cwd, 'app', 'layout.js'))) {\n signals.push({ framework: 'nextjs', score: 20, signal: 'App Router detected' });\n }\n if (await fileExists(path.join(cwd, 'pages', '_app.tsx')) ||\n await fileExists(path.join(cwd, 'pages', '_app.js'))) {\n signals.push({ framework: 'nextjs', score: 15, signal: 'Pages Router detected' });\n }\n }\n\n // Expo detection (check before React Native)\n if (deps.expo) {\n signals.push({ framework: 'expo', score: 100, signal: 'expo in dependencies' });\n }\n\n // React Native detection\n if (deps['react-native'] && !deps.expo) {\n signals.push({ framework: 'react-native', score: 100, signal: 'react-native in dependencies' });\n }\n\n // Remix detection\n if (deps['@remix-run/react'] || deps['@remix-run/node']) {\n signals.push({ framework: 'remix', score: 100, signal: '@remix-run packages found' });\n }\n\n // Astro detection\n if (deps.astro) {\n signals.push({ framework: 'astro', score: 100, signal: 'astro in dependencies' });\n }\n\n // SvelteKit detection\n if (deps['@sveltejs/kit']) {\n signals.push({ framework: 'sveltekit', score: 100, signal: '@sveltejs/kit in dependencies' });\n } else if (deps.svelte) {\n signals.push({ framework: 'svelte', score: 80, signal: 'svelte in dependencies' });\n }\n\n // Nuxt detection\n if (deps.nuxt) {\n signals.push({ framework: 'nuxt', score: 100, signal: 'nuxt in dependencies' });\n } else if (deps.vue) {\n signals.push({ framework: 'vue', score: 80, signal: 'vue in dependencies' });\n }\n\n // React detection (after Next.js, Remix, Expo, RN)\n if (deps.react && deps['react-dom']) {\n if (!deps.next && !deps['@remix-run/react'] && !deps['react-native'] && !deps.expo) {\n if (deps.vite || deps['@vitejs/plugin-react']) {\n signals.push({ framework: 'react-vite', score: 90, signal: 'React + Vite' });\n } else if (deps['react-scripts']) {\n signals.push({ framework: 'react', score: 85, signal: 'Create React App' });\n } else {\n signals.push({ framework: 'react', score: 70, signal: 'React project' });\n }\n }\n }\n\n // Node.js detection (server-only, no frontend)\n if (deps.express || deps.fastify || deps.koa || deps.hapi) {\n if (!deps.react && !deps.vue && !deps.svelte) {\n signals.push({ framework: 'node', score: 80, signal: 'Node.js server framework' });\n }\n }\n\n // Find the highest scoring framework\n const frameworkScores = new Map<Framework, number>();\n signals.forEach(s => {\n const current = frameworkScores.get(s.framework) || 0;\n frameworkScores.set(s.framework, current + s.score);\n });\n\n let bestFramework: Framework = 'unknown';\n let bestScore = 0;\n frameworkScores.forEach((score, framework) => {\n if (score > bestScore) {\n bestScore = score;\n bestFramework = framework;\n }\n });\n\n return buildResult(bestFramework, signals, pkg);\n}\n\nfunction buildResult(\n framework: Framework,\n signals: FrameworkSignal[],\n pkg: PackageJson | null,\n): DetectionResult {\n const relevantSignals = signals\n .filter(s => s.framework === framework)\n .map(s => s.signal);\n\n const confidence = Math.min(100, signals\n .filter(s => s.framework === framework)\n .reduce((a, b) => a + b.score, 0));\n\n const language = detectLanguage(pkg);\n const sdks = getSDKsForFramework(framework);\n\n const hasAppRouter = framework === 'nextjs' &&\n relevantSignals.some(s => s.includes('App Router'));\n\n return {\n framework,\n confidence,\n signals: relevantSignals,\n sdks,\n language,\n hasAppRouter,\n isExpo: framework === 'expo',\n };\n}\n\nfunction detectLanguage(pkg: PackageJson | null): 'typescript' | 'javascript' {\n if (!pkg) return 'javascript';\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n return deps.typescript ? 'typescript' : 'javascript';\n}\n\nfunction getSDKsForFramework(framework: Framework): SDK[] {\n switch (framework) {\n case 'nextjs':\n case 'remix':\n case 'sveltekit':\n case 'nuxt':\n case 'astro':\n // Full-stack frameworks need both client and server SDKs\n return ['@datalyr/web', '@datalyr/api'];\n\n case 'react':\n case 'react-vite':\n case 'svelte':\n case 'vue':\n // Client-only frameworks\n return ['@datalyr/web'];\n\n case 'react-native':\n case 'expo':\n return ['@datalyr/react-native'];\n\n case 'ios':\n return ['DatalyrSDK'];\n\n case 'node':\n return ['@datalyr/api'];\n\n default:\n return ['@datalyr/web'];\n }\n}\n\nexport function getFrameworkDisplayName(framework: Framework): string {\n const names: Record<Framework, string> = {\n nextjs: 'Next.js',\n react: 'React (Create React App)',\n 'react-vite': 'React (Vite)',\n svelte: 'Svelte',\n sveltekit: 'SvelteKit',\n vue: 'Vue',\n nuxt: 'Nuxt',\n remix: 'Remix',\n astro: 'Astro',\n 'react-native': 'React Native',\n expo: 'Expo',\n ios: 'iOS (Swift)',\n node: 'Node.js',\n unknown: 'Unknown',\n };\n return names[framework];\n}\n","import fs from 'fs-extra';\nimport path from 'path';\nimport { glob } from 'glob';\nimport type { PackageJson } from '../types.js';\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readFile(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\nexport async function readJson<T>(filePath: string): Promise<T | null> {\n try {\n return await fs.readJson(filePath);\n } catch {\n return null;\n }\n}\n\nexport async function readPackageJson(cwd: string): Promise<PackageJson | null> {\n return readJson<PackageJson>(path.join(cwd, 'package.json'));\n}\n\nexport async function getFileTree(cwd: string, depth = 3): Promise<string[]> {\n const pattern = depth === 1 ? '*' : `**/*`;\n const files = await glob(pattern, {\n cwd,\n ignore: [\n 'node_modules/**',\n '.git/**',\n 'dist/**',\n 'build/**',\n '.next/**',\n 'coverage/**',\n '*.log',\n ],\n maxDepth: depth,\n dot: false,\n });\n return files.sort();\n}\n\nexport async function findFile(cwd: string, patterns: string[]): Promise<string | null> {\n for (const pattern of patterns) {\n const matches = await glob(pattern, { cwd, nodir: true });\n if (matches.length > 0) {\n return path.join(cwd, matches[0]);\n }\n }\n return null;\n}\n\nexport async function findFiles(cwd: string, pattern: string): Promise<string[]> {\n const matches = await glob(pattern, {\n cwd,\n ignore: ['node_modules/**', '.git/**'],\n });\n return matches.map(f => path.join(cwd, f));\n}\n\nexport function getExtension(lang: 'typescript' | 'javascript'): string {\n return lang === 'typescript' ? 'ts' : 'js';\n}\n\nexport function getReactExtension(lang: 'typescript' | 'javascript'): string {\n return lang === 'typescript' ? 'tsx' : 'jsx';\n}\n","import path from 'path';\nimport type { PackageManager } from '../types.js';\nimport { fileExists } from './fs.js';\n\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n // Check lock files in order of preference\n if (await fileExists(path.join(cwd, 'bun.lockb'))) {\n return 'bun';\n }\n if (await fileExists(path.join(cwd, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n }\n if (await fileExists(path.join(cwd, 'yarn.lock'))) {\n return 'yarn';\n }\n if (await fileExists(path.join(cwd, 'package-lock.json'))) {\n return 'npm';\n }\n\n // Default to npm if no lock file found\n return 'npm';\n}\n\nexport function getInstallCommand(pm: PackageManager, packages: string[], dev = false): string {\n const pkgList = packages.join(' ');\n switch (pm) {\n case 'npm':\n return dev ? `npm install -D ${pkgList}` : `npm install ${pkgList}`;\n case 'yarn':\n return dev ? `yarn add -D ${pkgList}` : `yarn add ${pkgList}`;\n case 'pnpm':\n return dev ? `pnpm add -D ${pkgList}` : `pnpm add ${pkgList}`;\n case 'bun':\n return dev ? `bun add -d ${pkgList}` : `bun add ${pkgList}`;\n default:\n // Fallback to npm for unknown package managers\n return dev ? `npm install -D ${pkgList}` : `npm install ${pkgList}`;\n }\n}\n\nexport function getRunCommand(pm: PackageManager, script: string): string {\n switch (pm) {\n case 'npm':\n return `npm run ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'pnpm':\n return `pnpm ${script}`;\n case 'bun':\n return `bun run ${script}`;\n default:\n // Fallback to npm for unknown package managers\n return `npm run ${script}`;\n }\n}\n","import type { GeneratedFile } from '../../types.js';\n\nexport function generateNextJSFiles(options: {\n language: 'typescript' | 'javascript';\n hasAppRouter: boolean;\n apiKey: string;\n}): GeneratedFile[] {\n const { language, hasAppRouter } = options;\n const ext = language === 'typescript' ? 'tsx' : 'jsx';\n const tsExt = language === 'typescript' ? 'ts' : 'js';\n\n const files: GeneratedFile[] = [];\n\n if (hasAppRouter) {\n // App Router setup\n files.push({\n path: `app/providers.${ext}`,\n action: 'create',\n description: 'Datalyr provider component',\n content: generateAppRouterProvider(language),\n });\n\n files.push({\n path: `lib/datalyr.${tsExt}`,\n action: 'create',\n description: 'Server-side Datalyr instance',\n content: generateServerInstance(language),\n });\n } else {\n // Pages Router setup\n files.push({\n path: `lib/datalyr.${tsExt}`,\n action: 'create',\n description: 'Datalyr initialization',\n content: generatePagesRouterInit(language),\n });\n\n files.push({\n path: `lib/datalyr-server.${tsExt}`,\n action: 'create',\n description: 'Server-side Datalyr instance',\n content: generateServerInstance(language),\n });\n }\n\n return files;\n}\n\nfunction generateAppRouterProvider(language: 'typescript' | 'javascript'): string {\n if (language === 'typescript') {\n return `'use client';\n\nimport datalyr from '@datalyr/web';\nimport { useEffect } from 'react';\n\ninterface DatalyrProviderProps {\n children: React.ReactNode;\n}\n\nexport function DatalyrProvider({ children }: DatalyrProviderProps) {\n useEffect(() => {\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID!,\n debug: process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n }, []);\n\n return <>{children}</>;\n}\n`;\n }\n\n return `'use client';\n\nimport datalyr from '@datalyr/web';\nimport { useEffect } from 'react';\n\nexport function DatalyrProvider({ children }) {\n useEffect(() => {\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID,\n debug: process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n }, []);\n\n return <>{children}</>;\n}\n`;\n}\n\nfunction generateServerInstance(language: 'typescript' | 'javascript'): string {\n if (language === 'typescript') {\n return `import Datalyr from '@datalyr/api';\n\n// Server-side Datalyr instance\nexport const datalyr = new Datalyr(process.env.DATALYR_API_KEY!);\n\n// Helper to track server-side events\nexport async function trackServerEvent(\n event: string,\n properties?: Record<string, unknown>,\n userId?: string,\n) {\n await datalyr.track({\n event,\n properties,\n userId,\n timestamp: new Date().toISOString(),\n });\n}\n`;\n }\n\n return `import Datalyr from '@datalyr/api';\n\n// Server-side Datalyr instance\nexport const datalyr = new Datalyr(process.env.DATALYR_API_KEY);\n\n// Helper to track server-side events\nexport async function trackServerEvent(event, properties, userId) {\n await datalyr.track({\n event,\n properties,\n userId,\n timestamp: new Date().toISOString(),\n });\n}\n`;\n}\n\nfunction generatePagesRouterInit(language: 'typescript' | 'javascript'): string {\n if (language === 'typescript') {\n return `import datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr(): void {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID!,\n debug: process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n`;\n }\n\n return `import datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID,\n debug: process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n`;\n}\n\nexport function getNextJSLayoutUpdate(language: 'typescript' | 'javascript'): string {\n return `\n// Add this import at the top of your layout file:\nimport { DatalyrProvider } from './providers';\n\n// Then wrap your {children} with the provider:\n<DatalyrProvider>\n {children}\n</DatalyrProvider>\n`;\n}\n","import type { GeneratedFile } from '../../types.js';\n\nexport function generateReactFiles(options: {\n language: 'typescript' | 'javascript';\n isVite: boolean;\n}): GeneratedFile[] {\n const { language, isVite } = options;\n const ext = language === 'typescript' ? 'ts' : 'js';\n\n return [\n {\n path: `src/lib/datalyr.${ext}`,\n action: 'create',\n description: 'Datalyr initialization',\n content: generateReactInit(language),\n },\n ];\n}\n\nfunction generateReactInit(language: 'typescript' | 'javascript'): string {\n if (language === 'typescript') {\n return `import datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr(): void {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: import.meta.env.VITE_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n trackSPA: true,\n });\n\n initialized = true;\n}\n\n// Re-export for convenience\nexport { datalyr };\n\n// Usage in your main.tsx/App.tsx:\n// import { initDatalyr } from './lib/datalyr';\n// initDatalyr();\n`;\n }\n\n return `import datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: import.meta.env.VITE_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n trackSPA: true,\n });\n\n initialized = true;\n}\n\n// Re-export for convenience\nexport { datalyr };\n\n// Usage in your main.jsx/App.jsx:\n// import { initDatalyr } from './lib/datalyr';\n// initDatalyr();\n`;\n}\n\nexport function getReactMainUpdate(): string {\n return `\n// Add this import at the top of your main.tsx/main.jsx:\nimport { initDatalyr } from './lib/datalyr';\n\n// Then call it before ReactDOM.render:\ninitDatalyr();\n`;\n}\n","import type { GeneratedFile } from '../../types.js';\n\nexport function generateReactNativeFiles(options: {\n language: 'typescript' | 'javascript';\n isExpo: boolean;\n}): GeneratedFile[] {\n const { language, isExpo } = options;\n const ext = language === 'typescript' ? 'ts' : 'js';\n\n return [\n {\n path: `src/utils/datalyr.${ext}`,\n action: 'create',\n description: 'Datalyr initialization',\n content: generateReactNativeInit(language, isExpo),\n },\n ];\n}\n\nfunction generateReactNativeInit(\n language: 'typescript' | 'javascript',\n isExpo: boolean,\n): string {\n const importPath = isExpo ? '@datalyr/react-native/expo' : '@datalyr/react-native';\n\n if (language === 'typescript') {\n return `import { Datalyr } from '${importPath}';\n\n// IMPORTANT: Set DATALYR_API_KEY in your environment\n// For Expo: Add to app.config.js extra field and use expo-constants\n// For bare RN: Use react-native-config or babel-plugin-transform-inline-environment-variables\nconst DATALYR_API_KEY = process.env.DATALYR_API_KEY;\n\nlet initialized = false;\n\nexport async function initDatalyr(): Promise<void> {\n if (initialized) return;\n\n if (!DATALYR_API_KEY) {\n console.warn('Datalyr: API key not configured. Set DATALYR_API_KEY environment variable.');\n return;\n }\n\n await Datalyr.initialize({\n apiKey: DATALYR_API_KEY,\n enableAutoEvents: true,\n enableAttribution: true,\n debug: __DEV__,\n });\n\n initialized = true;\n}\n\n// Re-export for convenience\nexport { Datalyr };\n\n// Track custom events\nexport function trackEvent(event: string, properties?: Record<string, unknown>): void {\n Datalyr.track(event, properties);\n}\n\n// Identify users\nexport function identifyUser(userId: string, traits?: Record<string, unknown>): void {\n Datalyr.identify(userId, traits);\n}\n`;\n }\n\n return `import { Datalyr } from '${importPath}';\n\n// IMPORTANT: Set DATALYR_API_KEY in your environment\n// For Expo: Add to app.config.js extra field and use expo-constants\n// For bare RN: Use react-native-config or babel-plugin-transform-inline-environment-variables\nconst DATALYR_API_KEY = process.env.DATALYR_API_KEY;\n\nlet initialized = false;\n\nexport async function initDatalyr() {\n if (initialized) return;\n\n if (!DATALYR_API_KEY) {\n console.warn('Datalyr: API key not configured. Set DATALYR_API_KEY environment variable.');\n return;\n }\n\n await Datalyr.initialize({\n apiKey: DATALYR_API_KEY,\n enableAutoEvents: true,\n enableAttribution: true,\n debug: __DEV__,\n });\n\n initialized = true;\n}\n\n// Re-export for convenience\nexport { Datalyr };\n\n// Track custom events\nexport function trackEvent(event, properties) {\n Datalyr.track(event, properties);\n}\n\n// Identify users\nexport function identifyUser(userId, traits) {\n Datalyr.identify(userId, traits);\n}\n`;\n}\n\nexport function getReactNativeAppUpdate(): string {\n return `\n// Add this import at the top of your App.tsx/App.js:\nimport { initDatalyr } from './src/utils/datalyr';\n\n// Then call it in a useEffect:\nuseEffect(() => {\n initDatalyr();\n}, []);\n`;\n}\n","import path from 'path';\nimport type { EnvVar } from '../types.js';\nimport { fileExists, readFile, writeFile } from '../utils/fs.js';\nimport { startSpinner, succeedSpinner } from '../cli/ui.js';\n\nexport async function updateEnvFile(\n cwd: string,\n envVars: EnvVar[],\n options: { dryRun?: boolean; envFile?: string } = {},\n): Promise<boolean> {\n if (envVars.length === 0) return true;\n\n const envFileName = options.envFile || '.env.local';\n const envPath = path.join(cwd, envFileName);\n const examplePath = path.join(cwd, '.env.example');\n\n if (options.dryRun) {\n return true;\n }\n\n const spinner = startSpinner(`Updating ${envFileName}...`);\n\n try {\n // Read existing env file\n let existingContent = '';\n if (await fileExists(envPath)) {\n existingContent = (await readFile(envPath)) || '';\n }\n\n // Parse existing env vars\n const existingVars = parseEnvFile(existingContent);\n\n // Build new content\n const lines: string[] = [];\n if (existingContent) {\n lines.push(existingContent.trim());\n lines.push('');\n }\n\n // Add Datalyr section header if we have new vars to add\n const newVars = envVars.filter(v => !existingVars.has(v.key));\n if (newVars.length > 0) {\n lines.push('# Datalyr Analytics');\n for (const envVar of newVars) {\n if (envVar.description) {\n lines.push(`# ${envVar.description}`);\n }\n lines.push(`${envVar.key}=${envVar.value}`);\n }\n }\n\n // Write env file\n await writeFile(envPath, lines.join('\\n') + '\\n');\n\n // Also update .env.example if it exists\n if (await fileExists(examplePath)) {\n await updateEnvExample(examplePath, envVars);\n }\n\n succeedSpinner(`Updated ${envFileName}`);\n return true;\n } catch (error) {\n console.error(error);\n return false;\n }\n}\n\nasync function updateEnvExample(examplePath: string, envVars: EnvVar[]): Promise<void> {\n let content = (await readFile(examplePath)) || '';\n const existingVars = parseEnvFile(content);\n\n const newVars = envVars.filter(v => !existingVars.has(v.key));\n if (newVars.length === 0) return;\n\n const lines = content.trim().split('\\n');\n lines.push('');\n lines.push('# Datalyr Analytics');\n\n for (const envVar of newVars) {\n // Use placeholder value in example\n const exampleValue = envVar.isPublic ? 'your_workspace_id' : 'dk_your_api_key';\n lines.push(`${envVar.key}=${exampleValue}`);\n }\n\n await writeFile(examplePath, lines.join('\\n') + '\\n');\n}\n\nfunction parseEnvFile(content: string): Set<string> {\n const vars = new Set<string>();\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) {\n const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=/);\n if (match) {\n vars.add(match[1]);\n }\n }\n }\n\n return vars;\n}\n\nexport function getEnvVarsForFramework(\n framework: string,\n apiKey: string,\n): EnvVar[] {\n const vars: EnvVar[] = [];\n\n // Get the appropriate public env var prefix for the framework\n const getPublicEnvVarKey = (fw: string): string => {\n switch (fw) {\n case 'react':\n case 'react-vite':\n return 'VITE_DATALYR_WORKSPACE_ID';\n case 'svelte':\n case 'sveltekit':\n return 'PUBLIC_DATALYR_WORKSPACE_ID';\n case 'vue':\n case 'nuxt':\n return 'NUXT_PUBLIC_DATALYR_WORKSPACE_ID';\n case 'remix':\n case 'astro':\n case 'nextjs':\n default:\n return 'NEXT_PUBLIC_DATALYR_WORKSPACE_ID';\n }\n };\n\n // All web/full-stack frameworks need the public workspace ID\n if (['nextjs', 'react', 'react-vite', 'svelte', 'sveltekit', 'vue', 'nuxt', 'remix', 'astro'].includes(framework)) {\n vars.push({\n key: getPublicEnvVarKey(framework),\n value: '',\n description: 'Your Datalyr workspace ID (get from dashboard)',\n isPublic: true,\n });\n }\n\n // Full-stack frameworks also need server-side API key\n if (['nextjs', 'sveltekit', 'nuxt', 'remix', 'astro', 'node'].includes(framework)) {\n vars.push({\n key: 'DATALYR_API_KEY',\n value: apiKey,\n description: 'Datalyr API key for server-side tracking',\n isPublic: false,\n });\n }\n\n return vars;\n}\n","import ora, { Ora } from 'ora';\nimport chalk from 'chalk';\n\nlet currentSpinner: Ora | null = null;\n\nexport function startSpinner(text: string): Ora {\n if (currentSpinner) {\n currentSpinner.stop();\n }\n currentSpinner = ora({ text, color: 'cyan' }).start();\n return currentSpinner;\n}\n\nexport function succeedSpinner(text?: string): void {\n if (currentSpinner) {\n currentSpinner.succeed(text);\n currentSpinner = null;\n }\n}\n\nexport function failSpinner(text?: string): void {\n if (currentSpinner) {\n currentSpinner.fail(text);\n currentSpinner = null;\n }\n}\n\nexport function stopSpinner(): void {\n if (currentSpinner) {\n currentSpinner.stop();\n currentSpinner = null;\n }\n}\n\nexport function printWelcome(): void {\n console.log();\n console.log(chalk.cyan('╔════════════════════════════════════════════════╗'));\n console.log(chalk.cyan('║') + chalk.bold(' Welcome to Datalyr Wizard! ') + chalk.cyan('║'));\n console.log(chalk.cyan('║') + ' AI-powered SDK installation for Datalyr ' + chalk.cyan('║'));\n console.log(chalk.cyan('╚════════════════════════════════════════════════╝'));\n console.log();\n}\n\nexport function printSuccess(): void {\n console.log();\n console.log(chalk.green.bold('Installation complete!'));\n console.log();\n console.log(chalk.bold('Next steps:'));\n console.log();\n console.log(' 1. Add your workspace ID to .env.local:');\n console.log(chalk.cyan(' NEXT_PUBLIC_DATALYR_WORKSPACE_ID=your_workspace_id'));\n console.log();\n console.log(' 2. Start tracking events:');\n console.log(chalk.cyan(\" datalyr.track('button_clicked', { button: 'signup' })\"));\n console.log();\n console.log(' 3. View your data:');\n console.log(chalk.cyan(' https://app.datalyr.com/dashboard'));\n console.log();\n console.log(chalk.gray('Documentation: https://docs.datalyr.com'));\n console.log(chalk.gray('Support: hello@datalyr.com'));\n console.log();\n}\n\nexport function printPlan(plan: {\n packages: string[];\n files: { path: string; action: string; description: string }[];\n}): void {\n console.log();\n console.log(chalk.bold('Installation Plan:'));\n console.log();\n\n if (plan.packages.length > 0) {\n console.log(chalk.cyan(' 📦 Packages:'));\n plan.packages.forEach(pkg => {\n console.log(` • ${pkg}`);\n });\n console.log();\n }\n\n if (plan.files.length > 0) {\n console.log(chalk.cyan(' 📝 Files to create/update:'));\n plan.files.forEach(file => {\n const actionIcon = file.action === 'create' ? chalk.green('(create)') : chalk.yellow('(update)');\n console.log(` • ${file.path} ${actionIcon}`);\n });\n console.log();\n }\n}\n\nexport function printDetection(result: {\n framework: string;\n language: string;\n sdks: string[];\n}): void {\n console.log();\n console.log(chalk.bold('Detected Configuration:'));\n console.log(` Framework: ${chalk.cyan(result.framework)}`);\n console.log(` Language: ${chalk.cyan(result.language)}`);\n console.log(` SDK Needs: ${chalk.cyan(result.sdks.join(' + '))}`);\n console.log();\n}\n\nexport function printError(message: string, details?: string): void {\n console.log();\n console.log(chalk.red.bold('Error:'), message);\n if (details) {\n console.log(chalk.gray(details));\n }\n console.log();\n}\n\nexport function printDryRun(plan: {\n packages: string[];\n files: { path: string; action: string; content: string }[];\n commands: string[];\n}): void {\n console.log();\n console.log(chalk.yellow.bold('[DRY RUN] No changes will be made'));\n console.log();\n\n if (plan.commands.length > 0) {\n console.log(chalk.bold('Would run:'));\n plan.commands.forEach(cmd => console.log(chalk.cyan(` $ ${cmd}`)));\n console.log();\n }\n\n if (plan.files.length > 0) {\n console.log(chalk.bold('Would create/update files:'));\n plan.files.forEach(file => {\n console.log(chalk.cyan(` ${file.path} (${file.action})`));\n });\n console.log();\n }\n}\n","import type { Framework, GeneratedFile, InstallationPlan, ProjectContext, EnvVar } from '../types.js';\nimport { generateNextJSFiles } from './templates/nextjs.js';\nimport { generateReactFiles } from './templates/react.js';\nimport { generateReactNativeFiles } from './templates/react-native.js';\nimport { getEnvVarsForFramework } from '../installers/env.js';\n\nexport function generateInstallationPlan(\n context: ProjectContext,\n apiKey: string,\n): InstallationPlan {\n const packages = context.sdks.filter(sdk => sdk !== 'DatalyrSDK') as string[];\n const files = generateFilesForFramework(context, apiKey);\n const envVars = getEnvVarsForFramework(context.framework, apiKey);\n const postInstallSteps = getPostInstallSteps(context);\n\n return {\n packages,\n files,\n envVars,\n postInstallSteps,\n };\n}\n\nfunction generateFilesForFramework(\n context: ProjectContext,\n apiKey: string,\n): GeneratedFile[] {\n const { framework, language } = context;\n\n switch (framework) {\n case 'nextjs':\n return generateNextJSFiles({\n language,\n hasAppRouter: context.entryPoints.some(p => p.includes('app/layout')),\n apiKey,\n });\n\n case 'react':\n case 'react-vite':\n return generateReactFiles({\n language,\n isVite: framework === 'react-vite',\n });\n\n case 'react-native':\n case 'expo':\n return generateReactNativeFiles({\n language,\n isExpo: framework === 'expo',\n });\n\n case 'sveltekit':\n return generateSvelteKitFiles(language, apiKey);\n\n case 'svelte':\n return generateSvelteFiles(language);\n\n case 'node':\n return generateNodeFiles(language, apiKey);\n\n case 'ios':\n return generateIOSFiles(apiKey);\n\n default:\n // Generic web SDK setup\n return generateGenericWebFiles(language);\n }\n}\n\nfunction generateSvelteKitFiles(\n language: 'typescript' | 'javascript',\n apiKey: string,\n): GeneratedFile[] {\n const ext = language === 'typescript' ? 'ts' : 'js';\n return [\n {\n path: `src/lib/datalyr.${ext}`,\n action: 'create',\n description: 'Client-side Datalyr initialization',\n content: `import datalyr from '@datalyr/web';\nimport { browser } from '$app/environment';\n\nlet initialized = false;\n\nexport function initDatalyr()${language === 'typescript' ? ': void' : ''} {\n if (initialized || !browser) return;\n\n datalyr.init({\n workspaceId: import.meta.env.VITE_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n`,\n },\n {\n path: `src/lib/datalyr.server.${ext}`,\n action: 'create',\n description: 'Server-side Datalyr instance',\n content: `import Datalyr from '@datalyr/api';\nimport { DATALYR_API_KEY } from '$env/static/private';\n\nexport const datalyr = new Datalyr(DATALYR_API_KEY);\n`,\n },\n ];\n}\n\nfunction generateSvelteFiles(language: 'typescript' | 'javascript'): GeneratedFile[] {\n const ext = language === 'typescript' ? 'ts' : 'js';\n return [\n {\n path: `src/lib/datalyr.${ext}`,\n action: 'create',\n description: 'Datalyr initialization',\n content: `import datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr()${language === 'typescript' ? ': void' : ''} {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: import.meta.env.VITE_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n`,\n },\n ];\n}\n\nfunction generateNodeFiles(\n language: 'typescript' | 'javascript',\n apiKey: string,\n): GeneratedFile[] {\n const ext = language === 'typescript' ? 'ts' : 'js';\n return [\n {\n path: `src/lib/datalyr.${ext}`,\n action: 'create',\n description: 'Datalyr server instance',\n content: language === 'typescript'\n ? `import Datalyr from '@datalyr/api';\n\nconst apiKey = process.env.DATALYR_API_KEY;\nif (!apiKey) {\n throw new Error('DATALYR_API_KEY environment variable is required');\n}\n\nexport const datalyr = new Datalyr(apiKey);\n\nexport async function trackEvent(\n event: string,\n properties?: Record<string, unknown>,\n userId?: string,\n): Promise<void> {\n await datalyr.track({\n event,\n properties,\n userId,\n timestamp: new Date().toISOString(),\n });\n}\n`\n : `import Datalyr from '@datalyr/api';\n\nconst apiKey = process.env.DATALYR_API_KEY;\nif (!apiKey) {\n throw new Error('DATALYR_API_KEY environment variable is required');\n}\n\nexport const datalyr = new Datalyr(apiKey);\n\nexport async function trackEvent(event, properties, userId) {\n await datalyr.track({\n event,\n properties,\n userId,\n timestamp: new Date().toISOString(),\n });\n}\n`,\n },\n ];\n}\n\nfunction generateIOSFiles(_apiKey: string): GeneratedFile[] {\n return [\n {\n path: 'DatalyrConfig.swift',\n action: 'create',\n description: 'Datalyr iOS configuration',\n content: `import DatalyrSDK\nimport Foundation\n\nstruct DatalyrConfig {\n /// Initialize Datalyr SDK\n /// Reads configuration from Info.plist for security\n static func initialize() {\n guard let apiKey = Bundle.main.object(forInfoDictionaryKey: \"DATALYR_API_KEY\") as? String,\n let workspaceId = Bundle.main.object(forInfoDictionaryKey: \"DATALYR_WORKSPACE_ID\") as? String else {\n #if DEBUG\n fatalError(\"Datalyr API key or workspace ID not found in Info.plist. Add DATALYR_API_KEY and DATALYR_WORKSPACE_ID to your Info.plist.\")\n #else\n print(\"[Datalyr] Warning: API key or workspace ID not configured\")\n return\n #endif\n }\n\n Datalyr.shared.configure(\n apiKey: apiKey,\n workspaceId: workspaceId,\n options: DatalyrOptions(\n debug: false, // Set to true during development\n enableAutoEvents: true,\n enableAttribution: true\n )\n )\n }\n}\n\n// SETUP INSTRUCTIONS:\n// 1. Add to Info.plist:\n// <key>DATALYR_API_KEY</key>\n// <string>$(DATALYR_API_KEY)</string>\n// <key>DATALYR_WORKSPACE_ID</key>\n// <string>$(DATALYR_WORKSPACE_ID)</string>\n//\n// 2. Add to your .xcconfig file (recommended) or scheme environment:\n// DATALYR_API_KEY = dk_your_api_key_here\n// DATALYR_WORKSPACE_ID = your_workspace_id_here\n//\n// 3. Call DatalyrConfig.initialize() in your App's init or AppDelegate\n`,\n },\n {\n path: 'Datalyr.xcconfig',\n action: 'create',\n description: 'Datalyr configuration file (add your API key here)',\n content: `// Datalyr Configuration\n// Do NOT commit this file with real credentials to version control\n// Add to .gitignore: *.xcconfig\n\nDATALYR_API_KEY = YOUR_API_KEY_HERE\nDATALYR_WORKSPACE_ID = YOUR_WORKSPACE_ID_HERE\n`,\n },\n ];\n}\n\nfunction generateGenericWebFiles(language: 'typescript' | 'javascript'): GeneratedFile[] {\n const ext = language === 'typescript' ? 'ts' : 'js';\n return [\n {\n path: `src/lib/datalyr.${ext}`,\n action: 'create',\n description: 'Datalyr initialization',\n content: `import datalyr from '@datalyr/web';\n\nexport function initDatalyr()${language === 'typescript' ? ': void' : ''} {\n datalyr.init({\n workspaceId: 'YOUR_WORKSPACE_ID',\n debug: true,\n });\n}\n\nexport { datalyr };\n`,\n },\n ];\n}\n\nfunction getPostInstallSteps(context: ProjectContext): string[] {\n const steps: string[] = [];\n\n switch (context.framework) {\n case 'nextjs':\n steps.push('Add your workspace ID to .env.local');\n steps.push('Import DatalyrProvider in your app/layout.tsx');\n break;\n\n case 'react':\n case 'react-vite':\n steps.push('Add VITE_DATALYR_WORKSPACE_ID to your .env file');\n steps.push('Call initDatalyr() in your main.tsx');\n break;\n\n case 'react-native':\n case 'expo':\n steps.push('Run: cd ios && pod install');\n steps.push('Call initDatalyr() in your App.tsx useEffect');\n break;\n\n case 'ios':\n steps.push('Add DatalyrSDK via Swift Package Manager');\n steps.push('Add DATALYR_API_KEY and DATALYR_WORKSPACE_ID to Datalyr.xcconfig');\n steps.push('Configure Info.plist to use the xcconfig variables');\n steps.push('Call DatalyrConfig.initialize() in your App');\n break;\n\n default:\n steps.push('Add your workspace ID to your environment');\n }\n\n return steps;\n}\n","import { execa } from 'execa';\nimport type { PackageManager } from '../types.js';\nimport { detectPackageManager, getInstallCommand } from '../utils/package-manager.js';\nimport { startSpinner, succeedSpinner, failSpinner } from '../cli/ui.js';\n\nexport async function installPackages(\n cwd: string,\n packages: string[],\n options: { dev?: boolean; dryRun?: boolean } = {},\n): Promise<boolean> {\n if (packages.length === 0) return true;\n if (options.dryRun) return true;\n\n const pm = await detectPackageManager(cwd);\n const command = getInstallCommand(pm, packages, options.dev);\n\n const spinner = startSpinner(`Installing ${packages.join(', ')}...`);\n\n try {\n const [cmd, ...args] = command.split(' ');\n await execa(cmd, args, { cwd, stdio: 'pipe' });\n succeedSpinner(`Installed ${packages.join(', ')}`);\n return true;\n } catch (error) {\n failSpinner(`Failed to install packages`);\n console.error(error instanceof Error ? error.message : error);\n return false;\n }\n}\n\nexport async function isPackageInstalled(cwd: string, packageName: string): Promise<boolean> {\n try {\n const { stdout } = await execa('npm', ['ls', packageName, '--json'], {\n cwd,\n stdio: 'pipe',\n reject: false,\n });\n const result = JSON.parse(stdout);\n return !!result.dependencies?.[packageName];\n } catch {\n return false;\n }\n}\n","import { input, confirm, select } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport type { Framework } from '../types.js';\n\nexport async function promptApiKey(existingKey?: string): Promise<string> {\n if (existingKey) {\n return existingKey;\n }\n\n const apiKey = await input({\n message: 'Enter your Datalyr API key (starts with dk_):',\n validate: (value) => {\n if (!value.startsWith('dk_')) {\n return 'API key must start with \"dk_\"';\n }\n if (value.length < 10) {\n return 'API key seems too short';\n }\n return true;\n },\n });\n\n return apiKey;\n}\n\nexport async function promptConfirm(message: string, defaultValue = true): Promise<boolean> {\n return confirm({\n message,\n default: defaultValue,\n });\n}\n\nexport async function promptFramework(): Promise<Framework> {\n return select({\n message: 'Select your framework:',\n choices: [\n { name: 'Next.js', value: 'nextjs' as Framework },\n { name: 'React (Vite)', value: 'react-vite' as Framework },\n { name: 'React (Create React App)', value: 'react' as Framework },\n { name: 'Svelte/SvelteKit', value: 'sveltekit' as Framework },\n { name: 'Vue/Nuxt', value: 'nuxt' as Framework },\n { name: 'Remix', value: 'remix' as Framework },\n { name: 'Astro', value: 'astro' as Framework },\n { name: 'React Native', value: 'react-native' as Framework },\n { name: 'Expo', value: 'expo' as Framework },\n { name: 'iOS (Swift)', value: 'ios' as Framework },\n { name: 'Node.js (Server only)', value: 'node' as Framework },\n ],\n });\n}\n\nexport async function promptProceed(): Promise<boolean> {\n return confirm({\n message: 'Proceed with installation?',\n default: true,\n });\n}\n\nexport async function promptOverwrite(filePath: string): Promise<boolean> {\n console.log(chalk.yellow(` File already exists: ${filePath}`));\n return confirm({\n message: 'Overwrite this file?',\n default: false,\n });\n}\n\nexport async function promptSelectSDKs(\n detected: string[],\n): Promise<string[]> {\n if (detected.length === 1) {\n return detected;\n }\n\n const choices = detected.map(sdk => ({\n name: sdk,\n value: sdk,\n checked: true,\n }));\n\n // Using select for simplicity, but could use checkbox for multi-select\n const selected = await confirm({\n message: `Install both ${detected.join(' and ')}?`,\n default: true,\n });\n\n return selected ? detected : [detected[0]];\n}\n","import chalk from 'chalk';\n\nexport const logger = {\n info: (message: string) => console.log(chalk.blue('ℹ'), message),\n success: (message: string) => console.log(chalk.green('✓'), message),\n warn: (message: string) => console.log(chalk.yellow('⚠'), message),\n error: (message: string) => console.log(chalk.red('✗'), message),\n debug: (message: string, enabled = false) => {\n if (enabled) console.log(chalk.gray('[debug]'), message);\n },\n\n header: (title: string) => {\n console.log();\n console.log(chalk.bold.cyan(title));\n console.log(chalk.gray('─'.repeat(40)));\n },\n\n step: (step: number, total: number, message: string) => {\n console.log();\n console.log(chalk.bold(`Step ${step}/${total}: ${message}`));\n console.log(chalk.gray('─'.repeat(40)));\n },\n\n box: (lines: string[]) => {\n const maxLen = Math.max(...lines.map(l => l.length));\n const border = '═'.repeat(maxLen + 4);\n console.log(chalk.cyan(`╔${border}╗`));\n lines.forEach(line => {\n const padding = ' '.repeat(maxLen - line.length);\n console.log(chalk.cyan('║') + ` ${line}${padding} ` + chalk.cyan('║'));\n });\n console.log(chalk.cyan(`╚${border}╝`));\n },\n\n list: (items: string[], indent = 2) => {\n const spaces = ' '.repeat(indent);\n items.forEach(item => console.log(`${spaces}• ${item}`));\n },\n\n blank: () => console.log(),\n};\n","/**\n * Agent Runner\n * Orchestrates the full wizard flow with the Claude Agent SDK\n */\n\nimport * as p from '@clack/prompts';\nimport chalk from 'chalk';\nimport type { Framework } from '../types.js';\nimport {\n buildSystemPrompt,\n validateBashCommand,\n type AgentResult,\n} from './interface.js';\nimport { detectFramework, getFrameworkDisplayName } from '../detection/detector.js';\nimport { getFrameworkDocs } from './docs/index.js';\nimport { getSdksForFramework, type FrameworkConfig } from './configs/types.js';\nimport {\n BUSINESS_TYPES,\n getEventSuggestions,\n buildEventSelectOptions,\n resolveSelectedEvents,\n formatEventDescription,\n type BusinessType,\n type EventSuggestion,\n} from './events/suggestions.js';\nimport {\n PLATFORM_TYPES,\n AD_PLATFORMS,\n getSdksForPlatform,\n getAttributionEvents,\n getPlatformPostInstallSteps,\n type PlatformType,\n type AdPlatform,\n type PlatformConfig,\n} from './platform/config.js';\nimport { generateAIContextDoc } from '../generators/ai-context.js';\nimport { writeFile, readFile, mkdir } from 'fs/promises';\nimport { join, dirname, resolve } from 'path';\nimport { existsSync } from 'fs';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { glob } from 'glob';\n\nconst execAsync = promisify(exec);\n\nconst LLM_GATEWAY_URL = process.env.DATALYR_LLM_GATEWAY || 'https://wizard.datalyr.com';\n\nexport interface WizardAgentOptions {\n cwd?: string;\n apiKey?: string;\n debug?: boolean;\n framework?: Framework;\n skipVerification?: boolean;\n enableContainer?: boolean;\n}\n\ninterface WorkspaceInfo {\n id: string;\n name: string;\n timezone: string | null;\n domain: string | null;\n}\n\ninterface WorkspaceOption {\n id: string;\n name: string;\n public_id: string;\n domain: string | null;\n}\n\n/**\n * Run the agent-powered wizard\n */\nexport async function runAgentWizard(\n _config: FrameworkConfig, // Reserved for future use (e.g., default config overrides)\n options: WizardAgentOptions = {},\n): Promise<AgentResult> {\n const cwd = options.cwd || process.cwd();\n\n // Welcome message\n p.intro(chalk.cyan('Datalyr AI Wizard'));\n\n // Step 1: Confirm AI usage\n const useAI = await p.confirm({\n message: 'This wizard uses AI to analyze your project and install Datalyr. Continue?',\n initialValue: true,\n });\n\n if (p.isCancel(useAI) || !useAI) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n // Step 2: Get and validate API key (with retry loop)\n let apiKey = options.apiKey;\n let workspace: WorkspaceInfo | null = null;\n let keyAttempts = 0;\n const maxAttempts = 3;\n\n while (!workspace && keyAttempts < maxAttempts) {\n keyAttempts++;\n\n if (!apiKey) {\n // Show help on first attempt or after failed attempts\n if (keyAttempts === 1) {\n p.note(\n `To get your API key:\\n` +\n ` 1. Go to ${chalk.cyan('https://app.datalyr.com')}\\n` +\n ` 2. Open your workspace settings\\n` +\n ` 3. Copy your API key and paste it below`,\n 'API Key Required'\n );\n }\n\n const keyInput = await p.text({\n message: 'Enter your Datalyr API key (starts with dk_):',\n placeholder: 'dk_live_...',\n validate: (value) => {\n if (!value) return 'API key is required';\n if (!value.startsWith('dk_')) return 'API key must start with dk_';\n if (value.length < 20) return 'API key seems too short';\n return undefined;\n },\n });\n\n if (p.isCancel(keyInput)) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n apiKey = keyInput;\n }\n\n // Validate the API key\n const validateSpinner = p.spinner();\n validateSpinner.start('Validating API key...');\n\n try {\n // First validate the key and get default workspace\n const defaultWorkspace = await validateApiKey(apiKey);\n\n // Fetch all workspaces the user has access to\n const allWorkspaces = await fetchWorkspaces(apiKey);\n\n if (allWorkspaces.length > 1) {\n // Multiple workspaces - prompt user to select one\n validateSpinner.stop('API key validated');\n\n const workspaceChoice = await p.select({\n message: 'Select a workspace to configure:',\n options: allWorkspaces.map(w => ({\n value: w.id,\n label: w.name,\n hint: w.domain || undefined,\n })),\n });\n\n if (p.isCancel(workspaceChoice)) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n // Find the selected workspace\n const selectedWorkspace = allWorkspaces.find(w => w.id === workspaceChoice);\n if (selectedWorkspace) {\n workspace = {\n id: selectedWorkspace.id,\n name: selectedWorkspace.name,\n timezone: null,\n domain: selectedWorkspace.domain,\n };\n } else {\n workspace = defaultWorkspace;\n }\n\n p.log.info(`Selected workspace: ${chalk.cyan(workspace.name)}`);\n } else {\n // Single workspace or fallback\n workspace = defaultWorkspace;\n validateSpinner.stop(`Workspace: ${chalk.cyan(workspace.name)}`);\n }\n } catch (error) {\n validateSpinner.stop(chalk.red('Invalid API key'));\n\n const errorMessage = error instanceof Error ? error.message : 'Failed to validate API key';\n p.log.error(errorMessage);\n\n // Clear the invalid key so user can enter a new one\n apiKey = undefined;\n\n if (keyAttempts < maxAttempts) {\n // Offer options: retry, get new key, or exit\n const action = await p.select({\n message: 'What would you like to do?',\n options: [\n { value: 'retry', label: 'Try a different API key' },\n { value: 'signup', label: 'Create a free account', hint: 'Opens browser' },\n { value: 'exit', label: 'Exit wizard' },\n ],\n });\n\n if (p.isCancel(action) || action === 'exit') {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n if (action === 'signup') {\n const signupUrl = 'https://app.datalyr.com/signup?ref=wizard';\n p.log.info(`Opening ${chalk.cyan(signupUrl)} in your browser...`);\n\n // Try to open browser\n try {\n const { exec } = await import('child_process');\n const { promisify } = await import('util');\n const execAsync = promisify(exec);\n\n const platform = process.platform;\n const cmd = platform === 'darwin' ? 'open' :\n platform === 'win32' ? 'start' : 'xdg-open';\n\n await execAsync(`${cmd} \"${signupUrl}\"`);\n\n p.log.success('Browser opened! Create your account and come back with your API key.');\n\n // Give user time to sign up\n await p.text({\n message: 'Press Enter when you have your API key ready...',\n });\n } catch {\n p.log.warn(`Please visit: ${chalk.cyan(signupUrl)}`);\n }\n }\n // Continue loop to get new key\n }\n }\n }\n\n if (!workspace || !apiKey) {\n p.log.error(`Failed to validate API key after ${maxAttempts} attempts.`);\n p.log.info(`Get help at ${chalk.cyan('https://docs.datalyr.com/getting-started')}`);\n return { success: false, error: 'API key validation failed' };\n }\n\n // At this point we know apiKey is valid\n const validatedApiKey = apiKey;\n\n // Step 3: Detect framework\n const detectSpinner = p.spinner();\n detectSpinner.start('Analyzing your project...');\n\n let detection = await detectFramework(cwd);\n let framework = detection.framework;\n\n if (framework === 'unknown' && !options.framework) {\n detectSpinner.stop('Could not auto-detect framework');\n\n const frameworkChoice = await p.select({\n message: 'Select your framework:',\n options: [\n { value: 'nextjs', label: 'Next.js' },\n { value: 'react', label: 'React' },\n { value: 'react-vite', label: 'React (Vite)' },\n { value: 'svelte', label: 'Svelte' },\n { value: 'sveltekit', label: 'SvelteKit' },\n { value: 'react-native', label: 'React Native' },\n { value: 'expo', label: 'Expo' },\n { value: 'ios', label: 'iOS (Swift)' },\n { value: 'node', label: 'Node.js' },\n ],\n });\n\n if (p.isCancel(frameworkChoice)) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n framework = frameworkChoice as Framework;\n } else if (options.framework) {\n framework = options.framework;\n }\n\n detectSpinner.stop(`Detected: ${chalk.cyan(getFrameworkDisplayName(framework))}`);\n\n // Update SDKs if framework was manually selected\n if (detection.framework !== framework) {\n detection = { ...detection, framework, sdks: getSdksForFramework(framework) };\n }\n\n // Step 5: Platform type (web/mobile/both)\n const isMobileFramework = ['react-native', 'expo', 'ios'].includes(framework);\n const isWebFramework = ['nextjs', 'react', 'react-vite', 'svelte', 'sveltekit'].includes(framework);\n\n let platformType: PlatformType = 'web';\n if (isMobileFramework) {\n platformType = 'mobile';\n } else if (!isMobileFramework && !isWebFramework) {\n // Ask for hybrid setups\n const platformChoice = await p.select({\n message: 'What platforms are you targeting?',\n options: PLATFORM_TYPES.map(type => ({\n value: type.id,\n label: type.label,\n hint: type.hint,\n })),\n });\n\n if (p.isCancel(platformChoice)) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n platformType = platformChoice as PlatformType;\n }\n\n // Step 6: Ask about ad platforms (for attribution)\n const runningAds = await p.confirm({\n message: 'Are you running paid ads (Meta, Google, TikTok)?',\n initialValue: false,\n });\n\n let adPlatforms: AdPlatform[] = [];\n let platformConfig: PlatformConfig = {\n platformType,\n adPlatforms: [],\n enableDeepLinking: false,\n enableServerSideConversions: false,\n };\n\n if (!p.isCancel(runningAds) && runningAds) {\n const adPlatformChoices = await p.multiselect({\n message: 'Select your ad platforms:',\n options: AD_PLATFORMS.filter(p => p.id !== 'none').map(platform => ({\n value: platform.id,\n label: platform.label,\n hint: platform.description,\n })),\n required: false,\n });\n\n if (!p.isCancel(adPlatformChoices)) {\n adPlatforms = adPlatformChoices as AdPlatform[];\n\n // If using ad platforms, ask about server-side conversions\n if (adPlatforms.length > 0) {\n const serverSide = await p.confirm({\n message: 'Enable server-side conversion tracking (CAPI)?',\n initialValue: true,\n });\n\n platformConfig.enableServerSideConversions = !p.isCancel(serverSide) && serverSide;\n }\n }\n }\n\n // Ask about deep linking for mobile\n if (platformType === 'mobile' || platformType === 'both') {\n const deepLinking = await p.confirm({\n message: 'Set up deep linking / deferred deep links?',\n initialValue: adPlatforms.length > 0,\n });\n\n platformConfig.enableDeepLinking = !p.isCancel(deepLinking) && deepLinking;\n }\n\n platformConfig.adPlatforms = adPlatforms;\n\n // Ask about container scripts (managing third-party pixels through Datalyr)\n let enableContainer = options.enableContainer;\n\n if (enableContainer === undefined && platformType !== 'mobile') {\n // Only ask for web platforms - container scripts manage browser pixels\n const containerChoice = await p.confirm({\n message: 'Manage third-party pixels through Datalyr dashboard?',\n initialValue: adPlatforms.length > 0, // Default yes if using ad platforms\n });\n\n if (!p.isCancel(containerChoice)) {\n enableContainer = containerChoice;\n\n if (containerChoice) {\n p.note(\n `Container scripts let you:\\n` +\n ` ${chalk.green('•')} Add/remove Meta, Google, TikTok pixels without code\\n` +\n ` ${chalk.green('•')} Auto-fire datalyr.track() events to all pixels\\n` +\n ` ${chalk.green('•')} Inject custom scripts (Hotjar, Intercom, etc.)`,\n 'Container Scripts'\n );\n }\n }\n }\n\n // Default to enabled if not set\n const containerEnabled = enableContainer !== false;\n\n // Step 7: Ask about business type for event suggestions\n const businessTypeChoice = await p.select({\n message: 'What type of app are you building?',\n options: BUSINESS_TYPES.map(type => ({\n value: type.id,\n label: type.label,\n hint: type.hint,\n })),\n });\n\n if (p.isCancel(businessTypeChoice)) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n const selectedBusinessType = businessTypeChoice as BusinessType;\n const suggestedEvents = getEventSuggestions(selectedBusinessType);\n const attributionEvents = getAttributionEvents(platformConfig);\n\n // Show what Datalyr auto-tracks\n const autoTrackedEvents = platformType === 'mobile' || platformType === 'both'\n ? ['page_view / screen_view', 'session_start', 'app_install (mobile)', 'attribution data']\n : ['page_view', 'session_start', 'referrer', 'UTM parameters'];\n\n p.note(\n `${chalk.bold('Auto-tracked (no code needed):')}\\n` +\n autoTrackedEvents.map(e => ` ${chalk.dim('•')} ${e}`).join('\\n') +\n `\\n\\n${chalk.bold('High-value events')} are the key actions that matter for your business:\\n` +\n ` ${chalk.dim('•')} Conversions (signups, purchases, leads)\\n` +\n ` ${chalk.dim('•')} Engagement (feature usage, key interactions)\\n` +\n ` ${chalk.dim('•')} Revenue (transactions, subscriptions)`,\n 'Event Tracking'\n );\n\n // Step 8: Let user select which events to track\n const allEvents = [...suggestedEvents, ...attributionEvents.map(e => ({\n name: e.name,\n description: e.description,\n properties: e.properties,\n priority: 'high' as const,\n }))];\n\n // Remove duplicates by event name\n const uniqueEvents = allEvents.filter((event, index, self) =>\n index === self.findIndex(e => e.name === event.name)\n );\n\n // Build options with \"All recommended\" option and property descriptions\n const eventOptions = buildEventSelectOptions(uniqueEvents, true);\n\n // Show suggested events for the business type\n const businessTypeLabel = BUSINESS_TYPES.find(b => b.id === selectedBusinessType)?.label || selectedBusinessType;\n p.note(\n `Based on your ${chalk.cyan(businessTypeLabel)} app, we suggest these events:\\n\\n` +\n uniqueEvents\n .filter(e => e.priority === 'high')\n .map(e => ` ${chalk.green('•')} ${chalk.bold(e.name)}: ${formatEventDescription(e)}`)\n .join('\\n'),\n 'Suggested Events'\n );\n\n const selectedEventNames = await p.multiselect({\n message: 'Select events to track:',\n options: eventOptions,\n initialValues: ['__all_recommended__'],\n required: false,\n });\n\n let selectedEvents: EventSuggestion[] = p.isCancel(selectedEventNames)\n ? uniqueEvents.filter(e => e.priority === 'high')\n : resolveSelectedEvents(selectedEventNames as string[], uniqueEvents);\n\n // Ask if they want to add custom events\n const addCustom = await p.confirm({\n message: 'Want to add any custom events specific to your app?',\n initialValue: false,\n });\n\n if (!p.isCancel(addCustom) && addCustom) {\n const customEventInput = await p.text({\n message: 'Enter custom event names (comma-separated):',\n placeholder: 'checkout_completed, feature_clicked, ...',\n });\n\n if (!p.isCancel(customEventInput) && customEventInput) {\n const customEvents = customEventInput\n .split(',')\n .map(e => e.trim())\n .filter(e => e.length > 0)\n .map(name => ({\n name,\n description: 'Custom event',\n properties: ['value', 'context'],\n priority: 'high' as const,\n }));\n\n selectedEvents = [...selectedEvents, ...customEvents];\n }\n }\n\n // Show selected events summary\n if (selectedEvents.length > 0) {\n const eventList = selectedEvents\n .slice(0, 6)\n .map(e => ` ${chalk.green('•')} ${chalk.bold(e.name)}`)\n .join('\\n');\n\n const moreCount = selectedEvents.length > 6 ? ` (+${selectedEvents.length - 6} more)` : '';\n\n p.note(\n `Events you'll track:\\n\\n${eventList}${moreCount}`,\n 'Your Events'\n );\n }\n\n // Determine SDKs based on platform + framework + ad platforms\n const platformSdks = getSdksForPlatform(platformType, adPlatforms);\n const allSdks = [...new Set([...detection.sdks, ...platformSdks])];\n\n // Get platform-specific post-install steps\n const platformSteps = getPlatformPostInstallSteps(platformConfig);\n\n // Step 9: Show what will happen\n p.note(\n `The wizard will:\n${chalk.green('•')} Install ${chalk.cyan(allSdks.join(', '))}\n${chalk.green('•')} Create initialization code\n${chalk.green('•')} Configure environment variables\n${chalk.green('•')} Set up workspace: ${chalk.cyan(workspace.name)}\n${adPlatforms.length > 0 ? `${chalk.green('•')} Configure attribution for: ${chalk.cyan(adPlatforms.join(', '))}` : ''}\n${containerEnabled && platformType !== 'mobile' ? `${chalk.green('•')} Enable container scripts for pixel management` : ''}`,\n 'Installation Plan'\n );\n\n const proceed = await p.confirm({\n message: 'Proceed with installation?',\n initialValue: true,\n });\n\n if (p.isCancel(proceed) || !proceed) {\n p.cancel('Wizard cancelled');\n return { success: false, error: 'User cancelled' };\n }\n\n // Step 7: Run the agent\n const agentSpinner = p.spinner();\n agentSpinner.start('AI agent is working...');\n\n try {\n const result = await executeAgent({\n framework,\n apiKey: validatedApiKey,\n cwd,\n docs: getFrameworkDocs(framework, validatedApiKey),\n debug: options.debug,\n enableContainer: containerEnabled,\n workspaceId: workspace.id,\n });\n\n if (result.success) {\n agentSpinner.stop(chalk.green('Installation complete!'));\n\n // Step 8: Verification\n if (!options.skipVerification) {\n const verifyResult = await verifyInstallation(validatedApiKey, workspace.id);\n if (verifyResult.success) {\n p.log.success('SDK verified and ready to track events!');\n } else {\n p.log.warn('Could not verify SDK installation. This may be normal if events haven\\'t been sent yet.');\n p.log.info(`Check your dashboard at: ${chalk.cyan(`https://app.datalyr.com/dashboard/${workspace.id}/events`)}`);\n }\n }\n\n // Step 9: Generate AI context file for coding assistants\n try {\n const aiContextDoc = generateAIContextDoc({\n workspaceName: workspace.name,\n workspaceId: workspace.id,\n framework,\n platformType,\n adPlatforms,\n businessType: selectedBusinessType,\n selectedEvents,\n sdks: allSdks,\n enableServerSideConversions: platformConfig.enableServerSideConversions,\n enableContainer: containerEnabled,\n });\n\n await writeFile(join(cwd, '.datalyr.md'), aiContextDoc);\n p.log.success('Created .datalyr.md for AI coding assistants');\n } catch {\n // Non-critical, don't fail if we can't write the file\n }\n\n // Show next steps with selected event examples\n const eventExamples = selectedEvents.slice(0, 3).map(e =>\n `datalyr.track('${e.name}', { ${e.properties.slice(0, 2).map(p => `${p}: '...'`).join(', ')} })`\n ).join('\\n ');\n\n // Show platform-specific steps if any\n const stepsText = platformSteps.length > 0\n ? `\\n\\n${chalk.bold('Next steps:')}\\n${platformSteps.map(s => ` ${chalk.yellow('→')} ${s}`).join('\\n')}`\n : '';\n\n p.note(\n `Your workspace \"${workspace.name}\" is ready!\n\n${chalk.bold('Start tracking events:')}\n ${eventExamples || \"datalyr.track('event_name', { property: 'value' })\"}\n\n${chalk.bold('View your data:')}\n ${chalk.cyan(`https://app.datalyr.com/dashboard/${workspace.id}/events`)}${stepsText}`,\n 'Success!'\n );\n\n p.outro(chalk.green('Datalyr is ready to use!'));\n } else {\n agentSpinner.stop(chalk.red('Installation failed'));\n p.log.error(result.error || 'Unknown error');\n }\n\n return result;\n } catch (error) {\n agentSpinner.stop(chalk.red('Agent error'));\n\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n p.log.error(errorMessage);\n\n return { success: false, error: errorMessage };\n }\n}\n\ninterface ExecuteAgentParams {\n framework: Framework;\n apiKey: string;\n cwd: string;\n docs: string;\n debug?: boolean;\n enableContainer?: boolean;\n workspaceId: string;\n}\n\n// Claude API response types\ninterface ToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\ninterface TextBlock {\n type: 'text';\n text: string;\n}\n\ntype ContentBlock = ToolUseBlock | TextBlock;\n\ninterface ClaudeResponse {\n id: string;\n type: 'message';\n role: 'assistant';\n content: ContentBlock[];\n stop_reason: 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence';\n usage: { input_tokens: number; output_tokens: number };\n}\n\ninterface ToolResult {\n type: 'tool_result';\n tool_use_id: string;\n content: string;\n is_error?: boolean;\n}\n\n/**\n * Execute the agent via the LLM gateway with tool use\n */\nasync function executeAgent(params: ExecuteAgentParams): Promise<AgentResult> {\n const { framework, apiKey, cwd, docs, debug, enableContainer = true, workspaceId } = params;\n\n // Build the initial user message\n const initialMessage = buildIntegrationPrompt(framework, apiKey, docs, enableContainer, workspaceId);\n\n // Conversation messages\n const messages: Array<{ role: string; content: unknown }> = [\n { role: 'user', content: initialMessage },\n ];\n\n // Track modified files\n const filesModified: string[] = [];\n\n // Agent loop - max 20 iterations to prevent runaway\n const maxIterations = 20;\n let iterations = 0;\n\n while (iterations < maxIterations) {\n iterations++;\n\n if (debug) {\n console.log(`[DEBUG] Agent iteration ${iterations}`);\n }\n\n try {\n // Call the LLM gateway with timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 60000); // 60 second timeout\n\n const response = await fetch(`${LLM_GATEWAY_URL}/agent`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n messages,\n system: buildSystemPrompt(),\n }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.text();\n return { success: false, error: `Gateway error: ${error}` };\n }\n\n const claudeResponse = await response.json() as ClaudeResponse;\n\n if (debug) {\n console.log('[DEBUG] Response:', JSON.stringify(claudeResponse, null, 2));\n }\n\n // Add assistant message to conversation\n messages.push({ role: 'assistant', content: claudeResponse.content });\n\n // Check if we're done (end_turn or no tool use)\n if (claudeResponse.stop_reason === 'end_turn') {\n // Check if task_complete was called\n const taskComplete = claudeResponse.content.find(\n (block): block is ToolUseBlock =>\n block.type === 'tool_use' && block.name === 'task_complete'\n );\n\n if (taskComplete) {\n const input = taskComplete.input as { success: boolean; summary: string; files_modified?: string[] };\n return {\n success: input.success,\n message: input.summary,\n filesModified: input.files_modified || filesModified,\n };\n }\n\n // No task_complete but end_turn - agent stopped without explicit completion\n // This is unexpected behavior, mark as incomplete even if files were modified\n if (filesModified.length > 0) {\n return {\n success: false,\n message: 'Agent stopped unexpectedly. Files were modified but installation may be incomplete.',\n error: 'Agent did not call task_complete. Please verify the installation manually.',\n filesModified,\n };\n }\n\n return {\n success: false,\n error: 'Agent stopped without completing the installation task.',\n };\n }\n\n // Process tool use blocks\n if (claudeResponse.stop_reason === 'tool_use') {\n const toolUseBlocks = claudeResponse.content.filter(\n (block): block is ToolUseBlock => block.type === 'tool_use'\n );\n\n const toolResults: ToolResult[] = [];\n\n for (const toolUse of toolUseBlocks) {\n // Check for task_complete\n if (toolUse.name === 'task_complete') {\n const input = toolUse.input as { success: boolean; summary: string; files_modified?: string[] };\n return {\n success: input.success,\n message: input.summary,\n filesModified: input.files_modified || filesModified,\n };\n }\n\n // Execute the tool locally\n const result = await executeTool(toolUse, cwd, debug);\n\n // Track file modifications\n if (toolUse.name === 'write_file' && !result.is_error) {\n const path = toolUse.input.path as string;\n if (!filesModified.includes(path)) {\n filesModified.push(path);\n }\n }\n\n toolResults.push({\n type: 'tool_result',\n tool_use_id: toolUse.id,\n content: result.content,\n is_error: result.is_error,\n });\n }\n\n // Add tool results to conversation\n messages.push({ role: 'user', content: toolResults });\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n if (debug) {\n console.error('[DEBUG] Agent error:', error);\n }\n return { success: false, error: `Agent error: ${errorMessage}` };\n }\n }\n\n return { success: false, error: 'Agent exceeded maximum iterations' };\n}\n\n/**\n * Validate that a path stays within the project directory (prevent path traversal)\n */\nfunction isPathSafe(basePath: string, targetPath: string): boolean {\n const resolvedBase = resolve(basePath);\n const resolvedTarget = resolve(basePath, targetPath);\n return resolvedTarget.startsWith(resolvedBase + '/') || resolvedTarget === resolvedBase;\n}\n\n/**\n * Execute a tool locally\n */\nasync function executeTool(\n toolUse: ToolUseBlock,\n cwd: string,\n debug?: boolean,\n): Promise<{ content: string; is_error?: boolean }> {\n const { name, input } = toolUse;\n\n if (debug) {\n console.log(`[DEBUG] Executing tool: ${name}`, input);\n }\n\n try {\n switch (name) {\n case 'read_file': {\n // Input validation\n if (typeof input.path !== 'string' || !input.path.trim()) {\n return { content: 'Error: path must be a non-empty string', is_error: true };\n }\n const path = input.path.trim();\n\n // Path traversal protection\n if (!isPathSafe(cwd, path)) {\n return { content: 'Error: path traversal detected - access denied', is_error: true };\n }\n\n const fullPath = join(cwd, path);\n const content = await readFile(fullPath, 'utf-8');\n return { content };\n }\n\n case 'write_file': {\n // Input validation\n if (typeof input.path !== 'string' || !input.path.trim()) {\n return { content: 'Error: path must be a non-empty string', is_error: true };\n }\n if (typeof input.content !== 'string') {\n return { content: 'Error: content must be a string', is_error: true };\n }\n const path = input.path.trim();\n const content = input.content;\n\n // Path traversal protection\n if (!isPathSafe(cwd, path)) {\n return { content: 'Error: path traversal detected - access denied', is_error: true };\n }\n\n const fullPath = join(cwd, path);\n\n // Ensure directory exists\n const dir = dirname(fullPath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n\n await writeFile(fullPath, content, 'utf-8');\n return { content: `Successfully wrote ${path}` };\n }\n\n case 'run_command': {\n // Input validation\n if (typeof input.command !== 'string' || !input.command.trim()) {\n return { content: 'Error: command must be a non-empty string', is_error: true };\n }\n const command = input.command.trim();\n\n // Security: use validateBashCommand for full validation\n const validation = validateBashCommand(command);\n if (!validation.allowed) {\n return {\n content: `Command blocked: ${validation.reason}`,\n is_error: true,\n };\n }\n\n const { stdout, stderr } = await execAsync(command, { cwd, timeout: 120000 });\n return { content: stdout || stderr || 'Command completed successfully' };\n }\n\n case 'list_files': {\n // Input validation\n if (typeof input.path !== 'string') {\n return { content: 'Error: path must be a string', is_error: true };\n }\n const path = input.path.trim() || '.';\n const pattern = typeof input.pattern === 'string' ? input.pattern : '*';\n\n // Path traversal protection\n if (!isPathSafe(cwd, path)) {\n return { content: 'Error: path traversal detected - access denied', is_error: true };\n }\n\n const fullPath = join(cwd, path);\n\n const files = await glob(pattern, {\n cwd: fullPath,\n nodir: false,\n maxDepth: 3,\n });\n\n return { content: files.slice(0, 100).join('\\n') };\n }\n\n default:\n return { content: `Unknown tool: ${name}`, is_error: true };\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n return { content: `Error: ${errorMessage}`, is_error: true };\n }\n}\n\n/**\n * Build the integration prompt for the agent\n */\nfunction buildIntegrationPrompt(\n framework: Framework,\n apiKey: string,\n docs: string,\n enableContainer: boolean,\n workspaceId: string,\n): string {\n const containerConfig = enableContainer\n ? ' enableContainer: true, // Load third-party pixels from Datalyr dashboard'\n : ' enableContainer: false, // Container scripts disabled';\n\n const envVarName = framework === 'nextjs' ? 'NEXT_PUBLIC_DATALYR_WORKSPACE_ID' :\n framework === 'sveltekit' ? 'PUBLIC_DATALYR_WORKSPACE_ID' :\n framework.startsWith('react') && framework !== 'react-native' ? 'VITE_DATALYR_WORKSPACE_ID' :\n 'DATALYR_WORKSPACE_ID';\n\n return `Install Datalyr analytics into this ${getFrameworkDisplayName(framework)} project.\n\n## Workspace ID\n${workspaceId}\n\n## API Key (for server-side only)\n${apiKey}\n\n## Integration Documentation\n${docs}\n\n## SDK Configuration\nWhen initializing the SDK, use these options:\n\\`\\`\\`typescript\ndatalyr.init({\n workspaceId: process.env.${envVarName},\n${containerConfig}\n});\n\\`\\`\\`\n\n## Environment Variable\nAdd to .env.local (or .env):\n${envVarName}=${workspaceId}\n\n## Your Task\n\n1. Read package.json to understand the project\n2. Install the SDK: run the appropriate install command\n3. Create initialization code following the documentation\n4. Add the environment variable to .env.local or .env\n5. Call task_complete when done\n\nStart by reading package.json.`;\n}\n\n/**\n * Validate API key and get workspace info\n */\nasync function validateApiKey(apiKey: string): Promise<WorkspaceInfo> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 second timeout\n\n const response = await fetch(`${LLM_GATEWAY_URL}/validate-key`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ apiKey }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const error = await response.json() as { error?: string };\n throw new Error(error.error || 'Failed to validate API key');\n }\n\n const result = await response.json() as {\n success: boolean;\n workspace?: WorkspaceInfo;\n error?: string;\n };\n\n if (!result.success || !result.workspace) {\n throw new Error(result.error || 'Invalid API key');\n }\n\n return result.workspace;\n}\n\n/**\n * Fetch all workspaces the user has access to\n */\nasync function fetchWorkspaces(apiKey: string): Promise<WorkspaceOption[]> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 second timeout\n\n const response = await fetch(`${LLM_GATEWAY_URL}/workspaces`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ apiKey }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n // Fallback: if /workspaces endpoint fails, return empty array\n // The caller will use the single workspace from validateApiKey\n return [];\n }\n\n const result = await response.json() as {\n success: boolean;\n workspaces?: WorkspaceOption[];\n error?: string;\n };\n\n if (!result.success || !result.workspaces) {\n return [];\n }\n\n return result.workspaces;\n}\n\n/**\n * Verify installation by checking SDK connection\n */\nasync function verifyInstallation(apiKey: string, workspaceId: string): Promise<{ success: boolean; message?: string }> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 15000); // 15 second timeout\n\n const response = await fetch(`${LLM_GATEWAY_URL}/verify`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ apiKey, workspaceId }),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n return { success: false };\n }\n\n const result = await response.json() as {\n success: boolean;\n message?: string;\n };\n\n return result;\n } catch {\n // Verification is optional, don't fail if it doesn't work\n return { success: false };\n }\n}\n","/**\n * Agent Interface\n * Handles agent signals and security hooks for the wizard\n */\n\n// Agent signals for communication\nexport const AGENT_SIGNALS = {\n STATUS: '[STATUS]',\n ERROR_MISSING_KEY: '[ERROR_MISSING_KEY]',\n ERROR_FAILED: '[ERROR_FAILED]',\n SUCCESS: '[SUCCESS]',\n} as const;\n\n// Allowed bash commands for security\nconst ALLOWED_COMMANDS = [\n // Package managers\n 'npm',\n 'yarn',\n 'pnpm',\n 'bun',\n 'npx',\n // Build tools\n 'tsc',\n 'node',\n // iOS\n 'pod',\n 'xcodebuild',\n // File operations (read-only)\n 'cat',\n 'ls',\n 'find',\n 'grep',\n 'head',\n 'tail',\n 'wc',\n // Git (read-only)\n 'git status',\n 'git log',\n 'git diff',\n 'git branch',\n];\n\n// Dangerous patterns to block\nconst BLOCKED_PATTERNS = [\n /;/, // Command chaining\n /`/, // Backticks\n /\\$\\(/, // Command substitution\n /\\$\\w/, // Variable expansion (could contain malicious code)\n /\\|\\s*sh/, // Piping to shell\n /\\|\\s*bash/, // Piping to bash\n /\\|\\s*zsh/, // Piping to zsh\n /\\|\\|/, // Or operator (allows fallback commands)\n /\\s&\\s/, // Background execution mid-command\n /\\s&$/, // Background execution at end\n /rm\\s+-rf/, // Dangerous rm\n /rm\\s+-r/, // Recursive rm\n />\\s*\\//, // Overwriting system files\n /&&\\s*rm/, // rm after &&\n /\\|\\s*rm/, // rm after pipe\n];\n\n/**\n * Security hook to validate bash commands\n */\nexport function validateBashCommand(command: string): { allowed: boolean; reason?: string } {\n // Check for blocked patterns\n for (const pattern of BLOCKED_PATTERNS) {\n if (pattern.test(command)) {\n return { allowed: false, reason: `Blocked pattern detected: ${pattern}` };\n }\n }\n\n // Extract the base command\n const baseCommand = command.trim().split(/\\s+/)[0];\n\n // Check if command starts with an allowed command\n const isAllowed = ALLOWED_COMMANDS.some(allowed => {\n if (allowed.includes(' ')) {\n return command.startsWith(allowed);\n }\n return baseCommand === allowed;\n });\n\n if (!isAllowed) {\n return { allowed: false, reason: `Command not in allowlist: ${baseCommand}` };\n }\n\n return { allowed: true };\n}\n\nexport interface AgentConfig {\n apiKey: string;\n model?: string;\n maxTokens?: number;\n debug?: boolean;\n}\n\nexport interface AgentResult {\n success: boolean;\n message?: string;\n error?: string;\n filesModified?: string[];\n}\n\n/**\n * Build the system prompt for the agent\n * Uses Anthropic prompting best practices: role prompting, XML structure, examples\n */\nexport function buildSystemPrompt(): string {\n return `<role>\nYou are a senior developer specializing in SDK integrations. You have 10+ years of experience integrating analytics tools into React, Next.js, Svelte, React Native, and iOS projects. You are meticulous, always read code before modifying it, and preserve existing functionality.\n</role>\n\n<task>\nInstall and configure the Datalyr analytics SDK in the user's project. Complete this task by:\n1. Detecting the framework and understanding the project structure\n2. Installing the correct SDK packages\n3. Creating initialization code in the appropriate entry point\n4. Configuring environment variables\n</task>\n\n<sdks>\n| SDK | Use Case | Install Command |\n|-----|----------|-----------------|\n| @datalyr/web | Browser apps (React, Vue, Svelte, Next.js client) | npm install @datalyr/web |\n| @datalyr/api | Server-side (Next.js API routes, Express, Node) | npm install @datalyr/api |\n| @datalyr/react-native | React Native & Expo mobile apps | npm install @datalyr/react-native |\n| DatalyrSDK | Native iOS Swift apps | Swift Package Manager |\n</sdks>\n\n<rules>\n1. ALWAYS read files before modifying them - never edit blind\n2. PRESERVE existing code - only add Datalyr, never remove functionality\n3. MATCH the project's code style (indentation, quotes, semicolons)\n4. USE TypeScript if the project uses TypeScript\n5. PLACE initialization in the correct entry point for the framework\n6. UPDATE .env or .env.local with NEXT_PUBLIC_DATALYR_WORKSPACE_ID\n7. CHECK for existing Datalyr setup first - don't duplicate\n</rules>\n\n<workflow>\nStep 1: Read package.json to detect framework and package manager\nStep 2: List files to find entry points (app/layout.tsx, src/main.tsx, App.tsx, etc.)\nStep 3: Read entry point files to understand current structure\nStep 4: Install SDK packages using detected package manager\nStep 5: Create initialization file (lib/datalyr.ts or similar)\nStep 6: Update entry point to import and initialize Datalyr\nStep 7: Update or create .env.local with workspace ID placeholder\nStep 8: Call task_complete with summary of changes\n</workflow>\n\n<examples>\n<example name=\"nextjs-app-router\">\nFor Next.js 13+ with App Router, create app/providers.tsx:\n\\`\\`\\`tsx\n'use client';\nimport datalyr from '@datalyr/web';\nimport { useEffect } from 'react';\n\nexport function DatalyrProvider({ children }: { children: React.ReactNode }) {\n useEffect(() => {\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID!,\n debug: process.env.NODE_ENV === 'development',\n });\n }, []);\n return <>{children}</>;\n}\n\\`\\`\\`\nThen wrap children in app/layout.tsx with <DatalyrProvider>.\n</example>\n\n<example name=\"react-vite\">\nFor React + Vite, create src/lib/datalyr.ts:\n\\`\\`\\`ts\nimport datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized) return;\n datalyr.init({\n workspaceId: import.meta.env.VITE_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n });\n initialized = true;\n}\n\nexport { datalyr };\n\\`\\`\\`\nThen call initDatalyr() at the top of src/main.tsx.\n</example>\n\n<example name=\"react-native\">\nFor React Native, create src/utils/datalyr.ts:\n\\`\\`\\`ts\nimport { Datalyr } from '@datalyr/react-native';\n\nexport async function initDatalyr(apiKey: string) {\n await Datalyr.initialize({\n apiKey,\n enableAutoEvents: true,\n debug: __DEV__,\n });\n}\n\nexport { Datalyr };\n\\`\\`\\`\nThen call initDatalyr() in App.tsx useEffect.\n</example>\n</examples>\n\n<signals>\nWhen complete: ${AGENT_SIGNALS.SUCCESS}\nOn error: ${AGENT_SIGNALS.ERROR_FAILED}\nStatus updates: ${AGENT_SIGNALS.STATUS} <message>\n</signals>`;\n}\n","/**\n * Framework Documentation\n * These docs are passed to the agent to guide SDK installation\n */\n\nimport type { Framework } from '../../types.js';\n\nexport function getFrameworkDocs(framework: Framework, apiKey: string): string {\n switch (framework) {\n case 'nextjs':\n return getNextjsDocs(apiKey);\n case 'react':\n case 'react-vite':\n return getReactDocs(apiKey);\n case 'sveltekit':\n return getSvelteKitDocs(apiKey);\n case 'svelte':\n return getSvelteDocs(apiKey);\n case 'react-native':\n case 'expo':\n return getReactNativeDocs(apiKey, framework === 'expo');\n case 'ios':\n return getIOSDocs(apiKey);\n case 'node':\n return getNodeDocs(apiKey);\n default:\n return getGenericWebDocs(apiKey);\n }\n}\n\nfunction getNextjsDocs(apiKey: string): string {\n return `\n# Datalyr Next.js Integration\n\n## Packages to Install\n- @datalyr/web (client-side tracking)\n- @datalyr/api (server-side tracking)\n\n## Environment Variables\nAdd to .env.local:\n\\`\\`\\`\nNEXT_PUBLIC_DATALYR_WORKSPACE_ID=your_workspace_id\nDATALYR_API_KEY=${apiKey}\n\\`\\`\\`\n\n## App Router Setup (Next.js 13+)\n\n### 1. Create Provider Component\nCreate \\`app/providers.tsx\\`:\n\\`\\`\\`tsx\n'use client';\n\nimport datalyr from '@datalyr/web';\nimport { useEffect } from 'react';\n\nexport function DatalyrProvider({ children }: { children: React.ReactNode }) {\n useEffect(() => {\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID!,\n debug: process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n }, []);\n\n return <>{children}</>;\n}\n\\`\\`\\`\n\n### 2. Wrap Layout\nUpdate \\`app/layout.tsx\\` to wrap children with the provider:\n\\`\\`\\`tsx\nimport { DatalyrProvider } from './providers';\n\nexport default function RootLayout({ children }) {\n return (\n <html>\n <body>\n <DatalyrProvider>\n {children}\n </DatalyrProvider>\n </body>\n </html>\n );\n}\n\\`\\`\\`\n\n### 3. Server-Side Instance (Optional)\nCreate \\`lib/datalyr.ts\\` for server-side tracking:\n\\`\\`\\`ts\nimport Datalyr from '@datalyr/api';\n\nexport const datalyr = new Datalyr(process.env.DATALYR_API_KEY!);\n\\`\\`\\`\n\n## Pages Router Setup (Legacy)\n\n### 1. Create Hook\nCreate \\`lib/datalyr.ts\\`:\n\\`\\`\\`ts\nimport datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID!,\n debug: process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n\\`\\`\\`\n\n### 2. Initialize in _app.tsx\n\\`\\`\\`tsx\nimport { useEffect } from 'react';\nimport { initDatalyr } from '../lib/datalyr';\n\nfunction MyApp({ Component, pageProps }) {\n useEffect(() => {\n initDatalyr();\n }, []);\n\n return <Component {...pageProps} />;\n}\n\\`\\`\\`\n`;\n}\n\nfunction getReactDocs(apiKey: string): string {\n return `\n# Datalyr React Integration\n\n## Package to Install\n- @datalyr/web\n\n## Environment Variables\nAdd to .env (or .env.local for Vite):\n\\`\\`\\`\nVITE_DATALYR_WORKSPACE_ID=your_workspace_id\n# Or for Create React App:\nREACT_APP_DATALYR_WORKSPACE_ID=your_workspace_id\n\\`\\`\\`\n\n## Setup\n\n### 1. Create Initialization Module\nCreate \\`src/lib/datalyr.ts\\`:\n\\`\\`\\`ts\nimport datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n // Vite uses import.meta.env, CRA uses process.env\n workspaceId: import.meta.env?.VITE_DATALYR_WORKSPACE_ID ||\n process.env.REACT_APP_DATALYR_WORKSPACE_ID,\n debug: import.meta.env?.DEV || process.env.NODE_ENV === 'development',\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n\\`\\`\\`\n\n### 2. Initialize in Entry Point\nUpdate \\`src/main.tsx\\` (Vite) or \\`src/index.tsx\\` (CRA):\n\\`\\`\\`tsx\nimport { initDatalyr } from './lib/datalyr';\n\n// Initialize before rendering\ninitDatalyr();\n\n// ... rest of your app setup\n\\`\\`\\`\n\n## Tracking Events\n\\`\\`\\`ts\nimport { datalyr } from './lib/datalyr';\n\n// Track an event\ndatalyr.track('button_clicked', { button_id: 'signup' });\n\n// Identify a user\ndatalyr.identify('user_123', { email: 'user@example.com' });\n\\`\\`\\`\n`;\n}\n\nfunction getSvelteKitDocs(apiKey: string): string {\n return `\n# Datalyr SvelteKit Integration\n\n## Packages to Install\n- @datalyr/web (client-side)\n- @datalyr/api (server-side)\n\n## Environment Variables\nAdd to .env:\n\\`\\`\\`\nPUBLIC_DATALYR_WORKSPACE_ID=your_workspace_id\nDATALYR_API_KEY=${apiKey}\n\\`\\`\\`\n\n## Setup\n\n### 1. Client-Side Initialization\nCreate \\`src/lib/datalyr.ts\\`:\n\\`\\`\\`ts\nimport datalyr from '@datalyr/web';\nimport { browser } from '$app/environment';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized || !browser) return;\n\n datalyr.init({\n workspaceId: import.meta.env.PUBLIC_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n\\`\\`\\`\n\n### 2. Initialize in Layout\nUpdate \\`src/routes/+layout.svelte\\`:\n\\`\\`\\`svelte\n<script>\n import { onMount } from 'svelte';\n import { initDatalyr } from '$lib/datalyr';\n\n onMount(() => {\n initDatalyr();\n });\n</script>\n\n<slot />\n\\`\\`\\`\n\n### 3. Server-Side Instance\nCreate \\`src/lib/server/datalyr.ts\\`:\n\\`\\`\\`ts\nimport Datalyr from '@datalyr/api';\nimport { DATALYR_API_KEY } from '$env/static/private';\n\nexport const datalyr = new Datalyr(DATALYR_API_KEY);\n\\`\\`\\`\n`;\n}\n\nfunction getSvelteDocs(apiKey: string): string {\n return `\n# Datalyr Svelte Integration\n\n## Package to Install\n- @datalyr/web\n\n## Environment Variables\nAdd to .env:\n\\`\\`\\`\nVITE_DATALYR_WORKSPACE_ID=your_workspace_id\n\\`\\`\\`\n\n## Setup\n\n### 1. Create Initialization Module\nCreate \\`src/lib/datalyr.ts\\`:\n\\`\\`\\`ts\nimport datalyr from '@datalyr/web';\n\nlet initialized = false;\n\nexport function initDatalyr() {\n if (initialized || typeof window === 'undefined') return;\n\n datalyr.init({\n workspaceId: import.meta.env.VITE_DATALYR_WORKSPACE_ID,\n debug: import.meta.env.DEV,\n trackSPA: true,\n });\n\n initialized = true;\n}\n\nexport { datalyr };\n\\`\\`\\`\n\n### 2. Initialize in App\nUpdate \\`src/App.svelte\\`:\n\\`\\`\\`svelte\n<script>\n import { onMount } from 'svelte';\n import { initDatalyr } from './lib/datalyr';\n\n onMount(() => {\n initDatalyr();\n });\n</script>\n\n<!-- Your app content -->\n\\`\\`\\`\n`;\n}\n\nfunction getReactNativeDocs(_apiKey: string, isExpo: boolean): string {\n const importPath = isExpo ? '@datalyr/react-native/expo' : '@datalyr/react-native';\n const configImport = isExpo ? \"import Constants from 'expo-constants';\" : '';\n const configAccess = isExpo\n ? \"Constants.expoConfig?.extra?.datalyrApiKey || ''\"\n : \"process.env.DATALYR_API_KEY || ''\";\n\n return `\n# Datalyr React Native Integration${isExpo ? ' (Expo)' : ''}\n\n## Package to Install\n- @datalyr/react-native\n${isExpo ? '- expo-constants (for config access)' : ''}\n\n## Post-Install (iOS)\nAfter installing, run:\n\\`\\`\\`bash\ncd ios && pod install\n\\`\\`\\`\n\n## Environment Configuration\n${isExpo ? `\n### For Expo\nAdd to \\`app.config.js\\` or \\`app.json\\`:\n\\`\\`\\`js\nexport default {\n expo: {\n extra: {\n datalyrApiKey: process.env.DATALYR_API_KEY,\n datalyrWorkspaceId: process.env.DATALYR_WORKSPACE_ID,\n },\n },\n};\n\\`\\`\\`\n\nCreate \\`.env\\` file:\n\\`\\`\\`\nDATALYR_API_KEY=your_api_key\nDATALYR_WORKSPACE_ID=your_workspace_id\n\\`\\`\\`\n` : `\n### For React Native CLI\nCreate \\`.env\\` file and use react-native-config:\n\\`\\`\\`\nDATALYR_API_KEY=your_api_key\nDATALYR_WORKSPACE_ID=your_workspace_id\n\\`\\`\\`\n`}\n**Security Note**: Never commit API keys to source control. Use environment variables or secrets management.\n\n## Setup\n\n### 1. Create Initialization Module\nCreate \\`src/utils/datalyr.ts\\`:\n\\`\\`\\`ts\nimport { Datalyr } from '${importPath}';\n${configImport}\n\nlet initialized = false;\n\nexport async function initDatalyr() {\n if (initialized) return;\n\n const apiKey = ${configAccess};\n\n if (!apiKey) {\n console.warn('[Datalyr] API key not configured');\n return;\n }\n\n await Datalyr.initialize({\n apiKey,\n enableAutoEvents: true,\n enableAttribution: true,\n debug: __DEV__,\n });\n\n initialized = true;\n}\n\nexport { Datalyr };\n\\`\\`\\`\n\n### 2. Initialize in App\nUpdate \\`App.tsx\\`:\n\\`\\`\\`tsx\nimport { useEffect } from 'react';\nimport { initDatalyr } from './src/utils/datalyr';\n\nexport default function App() {\n useEffect(() => {\n initDatalyr();\n }, []);\n\n return (\n // Your app content\n );\n}\n\\`\\`\\`\n\n## Tracking Events\n\\`\\`\\`ts\nimport { Datalyr } from './src/utils/datalyr';\n\n// Track an event\nDatalyr.track('purchase_completed', { amount: 99.99 });\n\n// Identify a user\nDatalyr.identify('user_123', { email: 'user@example.com' });\n\\`\\`\\`\n`;\n}\n\nfunction getNodeDocs(apiKey: string): string {\n return `\n# Datalyr Node.js Integration\n\n## Package to Install\n- @datalyr/api\n\n## Environment Variables\nAdd to .env:\n\\`\\`\\`\nDATALYR_API_KEY=${apiKey}\n\\`\\`\\`\n\n## Setup\n\n### 1. Create Datalyr Instance\nCreate \\`src/lib/datalyr.ts\\`:\n\\`\\`\\`ts\nimport Datalyr from '@datalyr/api';\n\nconst apiKey = process.env.DATALYR_API_KEY;\nif (!apiKey) {\n throw new Error('DATALYR_API_KEY is required');\n}\n\nexport const datalyr = new Datalyr(apiKey);\n\\`\\`\\`\n\n### 2. Track Events\n\\`\\`\\`ts\nimport { datalyr } from './lib/datalyr';\n\n// Track server-side events\nawait datalyr.track({\n event: 'order_completed',\n userId: 'user_123',\n properties: {\n orderId: 'order_456',\n amount: 99.99,\n },\n});\n\n// Identify a user\nawait datalyr.identify({\n userId: 'user_123',\n traits: {\n email: 'user@example.com',\n plan: 'premium',\n },\n});\n\\`\\`\\`\n`;\n}\n\nfunction getIOSDocs(_apiKey: string): string {\n return `\n# Datalyr iOS (Swift) Integration\n\n## Package to Install\nAdd via Swift Package Manager:\n- https://github.com/datalyr/datalyr-ios-sdk\n\n## Setup\n\n### 1. Add Keys to Info.plist\nAdd both keys to your Info.plist (or use xcconfig for different environments):\n\\`\\`\\`xml\n<key>DATALYR_WORKSPACE_ID</key>\n<string>YOUR_WORKSPACE_ID</string>\n<key>DATALYR_API_KEY</key>\n<string>YOUR_API_KEY</string>\n\\`\\`\\`\n\n**Security Note**: For production apps, consider using xcconfig files or build-time environment variables to inject these values, keeping them out of source control.\n\n### 2. Add Configuration File\nCreate \\`DatalyrConfig.swift\\`:\n\\`\\`\\`swift\nimport DatalyrSDK\nimport Foundation\n\nstruct DatalyrConfig {\n static func initialize() {\n guard let workspaceId = Bundle.main.object(forInfoDictionaryKey: \"DATALYR_WORKSPACE_ID\") as? String,\n let apiKey = Bundle.main.object(forInfoDictionaryKey: \"DATALYR_API_KEY\") as? String else {\n #if DEBUG\n fatalError(\"DATALYR_WORKSPACE_ID or DATALYR_API_KEY not found in Info.plist\")\n #else\n print(\"[Datalyr] Warning: SDK not configured - missing Info.plist keys\")\n return\n #endif\n }\n\n Datalyr.shared.configure(\n apiKey: apiKey,\n workspaceId: workspaceId,\n options: DatalyrOptions(\n debug: false,\n enableAutoEvents: true,\n enableAttribution: true\n )\n )\n }\n}\n\\`\\`\\`\n\n### 3. Initialize in App\nFor SwiftUI (\\`@main App\\`):\n\\`\\`\\`swift\n@main\nstruct MyApp: App {\n init() {\n DatalyrConfig.initialize()\n }\n\n var body: some Scene {\n WindowGroup {\n ContentView()\n }\n }\n}\n\\`\\`\\`\n\nFor UIKit (AppDelegate):\n\\`\\`\\`swift\nfunc application(_ application: UIApplication, didFinishLaunchingWithOptions...) -> Bool {\n DatalyrConfig.initialize()\n return true\n}\n\\`\\`\\`\n\n## Tracking Events\n\\`\\`\\`swift\nimport DatalyrSDK\n\n// Track an event\nDatalyr.shared.track(\"purchase_completed\", properties: [\n \"amount\": 99.99,\n \"currency\": \"USD\"\n])\n\n// Identify a user\nDatalyr.shared.identify(\"user_123\", traits: [\n \"email\": \"user@example.com\",\n \"plan\": \"premium\"\n])\n\\`\\`\\`\n`;\n}\n\nfunction getGenericWebDocs(apiKey: string): string {\n return `\n# Datalyr Web Integration\n\n## Package to Install\n- @datalyr/web\n\n## Setup\n\n### Via NPM\n\\`\\`\\`ts\nimport datalyr from '@datalyr/web';\n\ndatalyr.init({\n workspaceId: 'YOUR_WORKSPACE_ID',\n debug: true,\n});\n\n// Track events\ndatalyr.track('page_viewed', { page: '/home' });\n\\`\\`\\`\n\n### Via Script Tag\n\\`\\`\\`html\n<script src=\"https://track.datalyr.com/dl.js\"\n data-workspace-id=\"YOUR_WORKSPACE_ID\">\n</script>\n\\`\\`\\`\n`;\n}\n","/**\n * Framework Configuration Types\n * Defines SDK mappings and setup instructions for each supported framework\n */\n\nimport type { Framework, SDK } from '../../types.js';\n\nexport interface FrameworkConfig {\n /** Framework identifier */\n id: Framework;\n\n /** Display name */\n name: string;\n\n /** Package to detect in package.json */\n detectPackage: string;\n\n /** SDKs to install */\n sdks: SDK[];\n\n /** Environment variables */\n envVars: {\n key: string;\n description: string;\n isPublic: boolean;\n }[];\n\n /** Estimated setup time in minutes */\n estimatedTime: number;\n\n /** Documentation URL */\n docsUrl: string;\n\n /** Post-installation steps */\n postInstallSteps: string[];\n\n /** Files to look for to detect router type (Next.js specific) */\n routerDetection?: {\n appRouter: string[];\n pagesRouter: string[];\n };\n}\n\nexport const NEXTJS_CONFIG: FrameworkConfig = {\n id: 'nextjs',\n name: 'Next.js',\n detectPackage: 'next',\n sdks: ['@datalyr/web', '@datalyr/api'],\n envVars: [\n {\n key: 'NEXT_PUBLIC_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n {\n key: 'DATALYR_API_KEY',\n description: 'Server-side API key',\n isPublic: false,\n },\n ],\n estimatedTime: 3,\n docsUrl: 'https://docs.datalyr.com/sdks/nextjs',\n postInstallSteps: [\n 'Add your workspace ID to .env.local',\n 'Wrap your layout with DatalyrProvider',\n 'Start tracking events with datalyr.track()',\n ],\n routerDetection: {\n appRouter: ['app/layout.tsx', 'app/layout.jsx', 'app/layout.ts', 'app/layout.js'],\n pagesRouter: ['pages/_app.tsx', 'pages/_app.jsx', 'pages/_app.ts', 'pages/_app.js'],\n },\n};\n\nexport const REACT_CONFIG: FrameworkConfig = {\n id: 'react',\n name: 'React',\n detectPackage: 'react',\n sdks: ['@datalyr/web'],\n envVars: [\n {\n key: 'VITE_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n ],\n estimatedTime: 2,\n docsUrl: 'https://docs.datalyr.com/sdks/react',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Call initDatalyr() in your main file',\n ],\n};\n\nexport const REACT_NATIVE_CONFIG: FrameworkConfig = {\n id: 'react-native',\n name: 'React Native',\n detectPackage: 'react-native',\n sdks: ['@datalyr/react-native'],\n envVars: [],\n estimatedTime: 5,\n docsUrl: 'https://docs.datalyr.com/sdks/react-native',\n postInstallSteps: [\n 'Run: cd ios && pod install',\n 'Call initDatalyr() in App.tsx',\n 'For attribution, configure Meta/TikTok app IDs',\n ],\n};\n\nexport const EXPO_CONFIG: FrameworkConfig = {\n id: 'expo',\n name: 'Expo',\n detectPackage: 'expo',\n sdks: ['@datalyr/react-native'],\n envVars: [],\n estimatedTime: 3,\n docsUrl: 'https://docs.datalyr.com/sdks/expo',\n postInstallSteps: [\n 'Call initDatalyr() in App.tsx',\n 'For attribution, configure Meta/TikTok app IDs in app.json',\n ],\n};\n\nexport const SVELTEKIT_CONFIG: FrameworkConfig = {\n id: 'sveltekit',\n name: 'SvelteKit',\n detectPackage: '@sveltejs/kit',\n sdks: ['@datalyr/web', '@datalyr/api'],\n envVars: [\n {\n key: 'PUBLIC_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n {\n key: 'DATALYR_API_KEY',\n description: 'Server-side API key',\n isPublic: false,\n },\n ],\n estimatedTime: 3,\n docsUrl: 'https://docs.datalyr.com/sdks/sveltekit',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Call initDatalyr() in +layout.svelte',\n ],\n};\n\nexport const NODE_CONFIG: FrameworkConfig = {\n id: 'node',\n name: 'Node.js',\n detectPackage: 'express',\n sdks: ['@datalyr/api'],\n envVars: [\n {\n key: 'DATALYR_API_KEY',\n description: 'Your Datalyr API key',\n isPublic: false,\n },\n ],\n estimatedTime: 2,\n docsUrl: 'https://docs.datalyr.com/sdks/node',\n postInstallSteps: [\n 'Add your API key to .env',\n 'Track events with datalyr.track()',\n ],\n};\n\nexport const VUE_CONFIG: FrameworkConfig = {\n id: 'vue',\n name: 'Vue.js',\n detectPackage: 'vue',\n sdks: ['@datalyr/web'],\n envVars: [\n {\n key: 'VITE_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n ],\n estimatedTime: 2,\n docsUrl: 'https://docs.datalyr.com/sdks/vue',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Call datalyr.init() in main.ts',\n 'Track events with datalyr.track()',\n ],\n};\n\nexport const NUXT_CONFIG: FrameworkConfig = {\n id: 'nuxt',\n name: 'Nuxt',\n detectPackage: 'nuxt',\n sdks: ['@datalyr/web', '@datalyr/api'],\n envVars: [\n {\n key: 'NUXT_PUBLIC_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n {\n key: 'DATALYR_API_KEY',\n description: 'Server-side API key',\n isPublic: false,\n },\n ],\n estimatedTime: 3,\n docsUrl: 'https://docs.datalyr.com/sdks/nuxt',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Create a Nuxt plugin for initialization',\n 'Track events with datalyr.track()',\n ],\n};\n\nexport const REMIX_CONFIG: FrameworkConfig = {\n id: 'remix',\n name: 'Remix',\n detectPackage: '@remix-run/react',\n sdks: ['@datalyr/web', '@datalyr/api'],\n envVars: [\n {\n key: 'DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n {\n key: 'DATALYR_API_KEY',\n description: 'Server-side API key',\n isPublic: false,\n },\n ],\n estimatedTime: 3,\n docsUrl: 'https://docs.datalyr.com/sdks/remix',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Initialize in root.tsx',\n 'Track events with datalyr.track()',\n ],\n};\n\nexport const ASTRO_CONFIG: FrameworkConfig = {\n id: 'astro',\n name: 'Astro',\n detectPackage: 'astro',\n sdks: ['@datalyr/web'],\n envVars: [\n {\n key: 'PUBLIC_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n ],\n estimatedTime: 2,\n docsUrl: 'https://docs.datalyr.com/sdks/astro',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Add script to Layout component',\n 'Track events with datalyr.track()',\n ],\n};\n\nexport const IOS_CONFIG: FrameworkConfig = {\n id: 'ios',\n name: 'iOS (Swift)',\n detectPackage: '', // Detected by Package.swift or .xcodeproj\n sdks: ['DatalyrSDK'],\n envVars: [\n {\n key: 'DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID (in Info.plist)',\n isPublic: false,\n },\n {\n key: 'DATALYR_API_KEY',\n description: 'Your Datalyr API key (in Info.plist)',\n isPublic: false,\n },\n ],\n estimatedTime: 5,\n docsUrl: 'https://docs.datalyr.com/sdks/ios',\n postInstallSteps: [\n 'Add DatalyrSDK via Swift Package Manager',\n 'Add keys to Info.plist',\n 'Call DatalyrConfig.initialize() in App init',\n ],\n};\n\nexport const SVELTE_CONFIG: FrameworkConfig = {\n id: 'svelte',\n name: 'Svelte',\n detectPackage: 'svelte',\n sdks: ['@datalyr/web'],\n envVars: [\n {\n key: 'VITE_DATALYR_WORKSPACE_ID',\n description: 'Your Datalyr workspace ID',\n isPublic: true,\n },\n ],\n estimatedTime: 2,\n docsUrl: 'https://docs.datalyr.com/sdks/svelte',\n postInstallSteps: [\n 'Add your workspace ID to .env',\n 'Call initDatalyr() in App.svelte',\n ],\n};\n\nexport const FRAMEWORK_CONFIGS: Record<Framework, FrameworkConfig | undefined> = {\n nextjs: NEXTJS_CONFIG,\n react: REACT_CONFIG,\n 'react-vite': REACT_CONFIG,\n svelte: SVELTE_CONFIG,\n sveltekit: SVELTEKIT_CONFIG,\n vue: VUE_CONFIG,\n nuxt: NUXT_CONFIG,\n remix: REMIX_CONFIG,\n astro: ASTRO_CONFIG,\n 'react-native': REACT_NATIVE_CONFIG,\n expo: EXPO_CONFIG,\n ios: IOS_CONFIG,\n node: NODE_CONFIG,\n unknown: undefined,\n};\n\nexport function getFrameworkConfig(framework: Framework): FrameworkConfig | undefined {\n return FRAMEWORK_CONFIGS[framework];\n}\n\nexport function getSdksForFramework(framework: Framework): SDK[] {\n const config = FRAMEWORK_CONFIGS[framework];\n if (!config) {\n // Default SDKs for unknown frameworks\n return ['@datalyr/web'];\n }\n return config.sdks;\n}\n","/**\n * Event Tracking Suggestions\n * Provides recommended events based on business type\n */\n\nexport type BusinessType = 'saas' | 'mobile_app' | 'lead_gen' | 'b2b' | 'agency';\n\n// Keep AppType as alias for backward compatibility\nexport type AppType = BusinessType;\n\nexport interface BusinessTypeInfo {\n id: BusinessType;\n label: string;\n description: string;\n hint: string;\n}\n\n// Backward compatibility alias\nexport type AppTypeInfo = BusinessTypeInfo;\n\nexport interface EventSuggestion {\n name: string;\n description: string;\n properties: string[];\n priority: 'high' | 'medium' | 'low';\n}\n\nexport const BUSINESS_TYPES: BusinessTypeInfo[] = [\n {\n id: 'saas',\n label: 'SaaS / Web App',\n description: 'Subscription or freemium product',\n hint: 'Trials, signups, features, upgrades',\n },\n {\n id: 'mobile_app',\n label: 'Mobile App',\n description: 'Consumer or B2B mobile app',\n hint: 'Installs, in-app events, attribution',\n },\n {\n id: 'lead_gen',\n label: 'Lead Gen / Marketing',\n description: 'Capture leads and conversions',\n hint: 'Funnels, forms, demos, signups',\n },\n {\n id: 'b2b',\n label: 'B2B Product',\n description: 'Business software',\n hint: 'Demos, trials, team invites, usage',\n },\n {\n id: 'agency',\n label: 'Agency / Client Work',\n description: 'Building for clients',\n hint: 'Multi-site, white-label tracking',\n },\n];\n\n// Backward compatibility\nexport const APP_TYPES = BUSINESS_TYPES;\n\nconst EVENT_SUGGESTIONS: Record<BusinessType, EventSuggestion[]> = {\n saas: [\n {\n name: 'signed_up',\n description: 'User created an account',\n properties: ['method', 'referrer'],\n priority: 'high',\n },\n {\n name: 'trial_started',\n description: 'User started a free trial',\n properties: ['plan'],\n priority: 'high',\n },\n {\n name: 'subscription_started',\n description: 'User converted to paid',\n properties: ['plan', 'value', 'currency'],\n priority: 'high',\n },\n {\n name: 'onboarding_completed',\n description: 'User finished onboarding',\n properties: ['steps_completed'],\n priority: 'medium',\n },\n ],\n\n mobile_app: [\n {\n name: 'signed_up',\n description: 'User created an account',\n properties: ['method', 'referrer'],\n priority: 'high',\n },\n {\n name: 'onboarding_started',\n description: 'User started onboarding flow',\n properties: ['source'],\n priority: 'high',\n },\n {\n name: 'onboarding_completed',\n description: 'User finished onboarding',\n properties: ['steps_completed'],\n priority: 'high',\n },\n {\n name: 'paywall_viewed',\n description: 'User saw the paywall/pricing',\n properties: ['source', 'paywall_id'],\n priority: 'high',\n },\n {\n name: 'trial_started',\n description: 'User started a free trial',\n properties: ['plan'],\n priority: 'high',\n },\n {\n name: 'subscription_started',\n description: 'User converted to paid subscription',\n properties: ['plan', 'value', 'currency'],\n priority: 'high',\n },\n {\n name: 'purchase',\n description: 'User made in-app purchase',\n properties: ['product_id', 'value', 'currency'],\n priority: 'medium',\n },\n ],\n\n lead_gen: [\n {\n name: 'lead',\n description: 'User submitted their info',\n properties: ['form_name', 'source'],\n priority: 'high',\n },\n {\n name: 'signed_up',\n description: 'User signed up / joined waitlist',\n properties: ['method', 'referrer'],\n priority: 'high',\n },\n {\n name: 'demo_requested',\n description: 'User requested a demo',\n properties: ['product'],\n priority: 'high',\n },\n {\n name: 'cta_clicked',\n description: 'User clicked a CTA',\n properties: ['button_name', 'page'],\n priority: 'medium',\n },\n ],\n\n b2b: [\n {\n name: 'signed_up',\n description: 'User created an account',\n properties: ['method', 'company_size'],\n priority: 'high',\n },\n {\n name: 'demo_requested',\n description: 'User requested a demo',\n properties: ['product', 'company_size'],\n priority: 'high',\n },\n {\n name: 'trial_started',\n description: 'User started a trial',\n properties: ['plan'],\n priority: 'high',\n },\n {\n name: 'lead',\n description: 'Lead captured',\n properties: ['source', 'company_size'],\n priority: 'high',\n },\n ],\n\n agency: [\n {\n name: 'lead',\n description: 'Lead captured',\n properties: ['form_name', 'client_id'],\n priority: 'high',\n },\n {\n name: 'conversion',\n description: 'Conversion event',\n properties: ['conversion_type', 'value', 'client_id'],\n priority: 'high',\n },\n {\n name: 'form_submitted',\n description: 'User submitted a form',\n properties: ['form_name', 'client_id'],\n priority: 'high',\n },\n {\n name: 'cta_clicked',\n description: 'User clicked a CTA',\n properties: ['button_name', 'client_id'],\n priority: 'medium',\n },\n ],\n};\n\n/**\n * Get event suggestions for a business type\n */\nexport function getEventSuggestions(businessType: BusinessType): EventSuggestion[] {\n return EVENT_SUGGESTIONS[businessType] || EVENT_SUGGESTIONS.saas;\n}\n\n/**\n * Get high priority events for a business type\n */\nexport function getHighPriorityEvents(businessType: BusinessType): EventSuggestion[] {\n return getEventSuggestions(businessType).filter(e => e.priority === 'high');\n}\n\n/**\n * Generate example tracking code for an event\n */\nexport function generateEventCode(event: EventSuggestion): string {\n const propsObj = event.properties\n .slice(0, 3)\n .map(p => `${p}: '...'`)\n .join(', ');\n\n return `datalyr.track('${event.name}', { ${propsObj} });`;\n}\n\n/**\n * Format event description with properties for display in UI\n */\nexport function formatEventDescription(event: EventSuggestion): string {\n const propsDisplay = event.properties.length > 0\n ? ` (${event.properties.join(', ')})`\n : '';\n return `${event.description}${propsDisplay}`;\n}\n\n/**\n * Build multiselect options for event selection with \"All recommended\" option\n */\nexport interface EventSelectOption {\n value: string;\n label: string;\n hint: string;\n}\n\nexport function buildEventSelectOptions(\n events: EventSuggestion[],\n includeAllOption: boolean = true\n): EventSelectOption[] {\n const options: EventSelectOption[] = [];\n\n // Add \"All recommended\" option at the top\n if (includeAllOption) {\n const highPriorityCount = events.filter(e => e.priority === 'high').length;\n options.push({\n value: '__all_recommended__',\n label: 'All recommended events',\n hint: `Select all ${highPriorityCount} high-priority events`,\n });\n }\n\n // Add individual events\n for (const event of events) {\n const priorityBadge = event.priority === 'high' ? '[recommended] ' : '';\n options.push({\n value: event.name,\n label: event.name,\n hint: `${priorityBadge}${formatEventDescription(event)}`,\n });\n }\n\n return options;\n}\n\n/**\n * Resolve selected event values, handling the \"All recommended\" option\n */\nexport function resolveSelectedEvents(\n selectedValues: string[],\n allEvents: EventSuggestion[]\n): EventSuggestion[] {\n // If \"All recommended\" is selected, return all high-priority events\n if (selectedValues.includes('__all_recommended__')) {\n return allEvents.filter(e => e.priority === 'high');\n }\n\n // Filter selected events by name\n return allEvents.filter(e => selectedValues.includes(e.name));\n}\n","/**\n * Platform Configuration\n * Handles platform type, ad platforms, and attribution setup\n */\n\nexport type PlatformType = 'web' | 'mobile' | 'both';\n\nexport type AdPlatform = 'meta' | 'google' | 'tiktok' | 'apple_search_ads' | 'none';\n\nexport interface PlatformConfig {\n /** Web, Mobile, or Both */\n platformType: PlatformType;\n\n /** Ad platforms for attribution */\n adPlatforms: AdPlatform[];\n\n /** Whether to set up deep linking (mobile) */\n enableDeepLinking: boolean;\n\n /** Whether to set up server-side conversions (CAPI) */\n enableServerSideConversions: boolean;\n}\n\nexport interface PlatformTypeInfo {\n id: PlatformType;\n label: string;\n description: string;\n hint: string;\n}\n\nexport interface AdPlatformInfo {\n id: AdPlatform;\n label: string;\n description: string;\n requiresServerSide: boolean;\n configKeys: string[];\n}\n\nexport const PLATFORM_TYPES: PlatformTypeInfo[] = [\n {\n id: 'web',\n label: 'Web Only',\n description: 'Website or web application',\n hint: 'React, Next.js, Svelte, etc.',\n },\n {\n id: 'mobile',\n label: 'Mobile Only',\n description: 'iOS or Android app',\n hint: 'React Native, Expo, Swift',\n },\n {\n id: 'both',\n label: 'Web + Mobile',\n description: 'Both web and mobile apps',\n hint: 'Full cross-platform attribution',\n },\n];\n\nexport const AD_PLATFORMS: AdPlatformInfo[] = [\n {\n id: 'meta',\n label: 'Meta Ads (Facebook/Instagram)',\n description: 'Track conversions from Meta campaigns',\n requiresServerSide: true,\n configKeys: ['META_PIXEL_ID', 'META_ACCESS_TOKEN', 'META_APP_ID'],\n },\n {\n id: 'google',\n label: 'Google Ads',\n description: 'Track conversions from Google campaigns',\n requiresServerSide: true,\n configKeys: ['GOOGLE_ADS_CUSTOMER_ID', 'GOOGLE_ADS_CONVERSION_ID'],\n },\n {\n id: 'tiktok',\n label: 'TikTok Ads',\n description: 'Track conversions from TikTok campaigns',\n requiresServerSide: true,\n configKeys: ['TIKTOK_PIXEL_ID', 'TIKTOK_ACCESS_TOKEN', 'TIKTOK_APP_ID'],\n },\n {\n id: 'apple_search_ads',\n label: 'Apple Search Ads',\n description: 'Track iOS app install attribution',\n requiresServerSide: false,\n configKeys: [],\n },\n {\n id: 'none',\n label: 'No ad platforms',\n description: 'Skip ad platform setup',\n requiresServerSide: false,\n configKeys: [],\n },\n];\n\n/**\n * Determine which SDKs are needed based on platform config\n */\nexport function getSdksForPlatform(\n platformType: PlatformType,\n adPlatforms: AdPlatform[],\n): string[] {\n const sdks: string[] = [];\n\n // Base SDKs based on platform\n if (platformType === 'web' || platformType === 'both') {\n sdks.push('@datalyr/web');\n }\n\n if (platformType === 'mobile' || platformType === 'both') {\n sdks.push('@datalyr/react-native');\n }\n\n // Server-side SDK if using ad platforms with CAPI\n const needsServerSide = adPlatforms.some(\n p => AD_PLATFORMS.find(ap => ap.id === p)?.requiresServerSide\n );\n\n if (needsServerSide) {\n sdks.push('@datalyr/api');\n }\n\n return sdks;\n}\n\n/**\n * Get environment variables needed for ad platform setup\n */\nexport function getAdPlatformEnvVars(adPlatforms: AdPlatform[]): {\n key: string;\n description: string;\n platform: AdPlatform;\n}[] {\n const envVars: { key: string; description: string; platform: AdPlatform }[] = [];\n\n for (const platformId of adPlatforms) {\n const platform = AD_PLATFORMS.find(p => p.id === platformId);\n if (!platform) continue;\n\n for (const key of platform.configKeys) {\n envVars.push({\n key,\n description: `${platform.label} - ${key.replace(/_/g, ' ').toLowerCase()}`,\n platform: platformId,\n });\n }\n }\n\n return envVars;\n}\n\n/**\n * Get attribution-related events based on platform and ad config\n */\nexport function getAttributionEvents(config: PlatformConfig): {\n name: string;\n description: string;\n properties: string[];\n serverSide: boolean;\n}[] {\n const events: {\n name: string;\n description: string;\n properties: string[];\n serverSide: boolean;\n }[] = [];\n\n // App install (mobile only)\n if (config.platformType === 'mobile' || config.platformType === 'both') {\n events.push({\n name: 'app_install',\n description: 'User installed the app (auto-tracked)',\n properties: ['attribution_source', 'campaign_id', 'ad_group_id'],\n serverSide: false,\n });\n\n events.push({\n name: 'app_open',\n description: 'User opened the app',\n properties: ['source', 'deep_link_url', 'is_first_open'],\n serverSide: false,\n });\n }\n\n // Deep link events\n if (config.enableDeepLinking) {\n events.push({\n name: 'deep_link_opened',\n description: 'User opened a deep link',\n properties: ['url', 'source', 'campaign'],\n serverSide: false,\n });\n\n events.push({\n name: 'deferred_deep_link',\n description: 'User installed via deferred deep link',\n properties: ['original_url', 'install_time', 'open_time'],\n serverSide: false,\n });\n }\n\n // Server-side conversion events\n if (config.enableServerSideConversions) {\n // Meta CAPI events\n if (config.adPlatforms.includes('meta')) {\n events.push({\n name: 'purchase',\n description: 'Purchase event for Meta CAPI',\n properties: ['value', 'currency', 'email', 'phone', 'fbc', 'fbp'],\n serverSide: true,\n });\n\n events.push({\n name: 'lead',\n description: 'Lead event for Meta CAPI',\n properties: ['email', 'phone', 'fbc', 'fbp'],\n serverSide: true,\n });\n }\n\n // TikTok Events API\n if (config.adPlatforms.includes('tiktok')) {\n events.push({\n name: 'complete_payment',\n description: 'Purchase event for TikTok Events API',\n properties: ['value', 'currency', 'email', 'phone', 'ttclid'],\n serverSide: true,\n });\n }\n\n // Google Ads\n if (config.adPlatforms.includes('google')) {\n events.push({\n name: 'conversion',\n description: 'Conversion event for Google Ads',\n properties: ['value', 'currency', 'email', 'phone', 'gclid'],\n serverSide: true,\n });\n }\n }\n\n return events;\n}\n\n/**\n * Get post-install steps based on platform configuration\n */\nexport function getPlatformPostInstallSteps(config: PlatformConfig): string[] {\n const steps: string[] = [];\n\n // Mobile-specific steps\n if (config.platformType === 'mobile' || config.platformType === 'both') {\n steps.push('Run `cd ios && pod install` to install native dependencies');\n\n if (config.enableDeepLinking) {\n steps.push('Configure URL schemes in Xcode/Android manifest for deep linking');\n steps.push('Set up Associated Domains (iOS) or App Links (Android)');\n }\n }\n\n // Ad platform steps\n for (const platformId of config.adPlatforms) {\n const platform = AD_PLATFORMS.find(p => p.id === platformId);\n if (!platform || platformId === 'none') continue;\n\n steps.push(`Add ${platform.label} credentials to your environment variables`);\n\n if (platform.requiresServerSide) {\n steps.push(`Set up server-side endpoint for ${platform.label} conversions`);\n }\n\n // Mobile-specific ad platform steps\n if (config.platformType !== 'web') {\n if (platformId === 'meta') {\n steps.push('Add Meta App ID to Info.plist (iOS) and AndroidManifest.xml');\n }\n if (platformId === 'tiktok') {\n steps.push('Add TikTok App ID to Info.plist (iOS) and AndroidManifest.xml');\n }\n if (platformId === 'apple_search_ads') {\n steps.push('Enable AdServices.framework in Xcode');\n }\n }\n }\n\n return steps;\n}\n\n/**\n * Generate code snippet for tracking attribution events\n */\nexport function generateAttributionCode(\n event: { name: string; properties: string[]; serverSide: boolean },\n language: 'typescript' | 'javascript' = 'typescript',\n): string {\n const propsObj = event.properties\n .slice(0, 3)\n .map(p => `${p}: '...'`)\n .join(', ');\n\n if (event.serverSide) {\n return language === 'typescript'\n ? `await datalyr.track('${event.name}', { ${propsObj} }, { userId: user.id });`\n : `await datalyr.track('${event.name}', { ${propsObj} }, { userId: user.id });`;\n }\n\n return `datalyr.track('${event.name}', { ${propsObj} });`;\n}\n","/**\n * Generate AI context file for coding assistants\n * This file helps Cursor, Bolt, Claude etc understand the Datalyr setup\n */\n\nimport type { Framework } from '../types.js';\nimport type { BusinessType, EventSuggestion } from '../agent/events/suggestions.js';\nimport type { AdPlatform, PlatformType } from '../agent/platform/config.js';\n\n/**\n * Infer TypeScript type from property name\n */\nfunction inferPropertyType(propName: string): string {\n const lowerName = propName.toLowerCase();\n\n // Numeric types\n if (['value', 'price', 'amount', 'total', 'quantity', 'count', 'steps_completed'].some(n => lowerName.includes(n))) {\n return 'number';\n }\n\n // Boolean types\n if (['is_', 'has_', 'enable', 'disable'].some(n => lowerName.startsWith(n) || lowerName.includes(n))) {\n return 'boolean';\n }\n\n // Currency is typically a 3-letter code\n if (lowerName === 'currency') {\n return 'string; // ISO 4217 code (e.g., \"USD\", \"EUR\")';\n }\n\n // Email/phone are common identifiers\n if (lowerName === 'email') {\n return 'string; // User email for attribution matching';\n }\n if (lowerName === 'phone') {\n return 'string; // User phone for attribution matching';\n }\n\n // IDs\n if (lowerName.endsWith('_id') || lowerName === 'id') {\n return 'string';\n }\n\n // Default to string\n return 'string';\n}\n\nexport interface AIContextParams {\n workspaceName: string;\n workspaceId: string;\n framework: Framework;\n platformType: PlatformType;\n adPlatforms: AdPlatform[];\n businessType: BusinessType;\n selectedEvents: EventSuggestion[];\n sdks: string[];\n enableServerSideConversions: boolean;\n enableContainer?: boolean;\n}\n\nexport function generateAIContextDoc(params: AIContextParams): string {\n const {\n workspaceName,\n workspaceId,\n framework,\n platformType,\n adPlatforms,\n businessType,\n selectedEvents,\n sdks,\n enableServerSideConversions,\n enableContainer = true,\n } = params;\n\n // Build detailed event list with TypeScript interface-style property docs\n const eventsList = selectedEvents\n .map(e => {\n const propsWithTypes = e.properties.map(p => {\n // Infer likely types from property names\n const type = inferPropertyType(p);\n return ` ${p}: ${type};`;\n }).join('\\n');\n return `### \\`${e.name}\\`\\n${e.description}\\n\\n\\`\\`\\`typescript\\ndatalyr.track('${e.name}', {\\n${propsWithTypes}\\n});\\n\\`\\`\\``;\n })\n .join('\\n\\n');\n\n const trackingExamples = selectedEvents.slice(0, 3).map(e => {\n const props = e.properties.slice(0, 2).map(p => `${p}: '...'`).join(', ');\n return `datalyr.track('${e.name}', { ${props} });`;\n }).join('\\n');\n\n const serverSideExample = enableServerSideConversions ? `\n## Server-Side Tracking (CAPI)\n\nFor conversion events that need server-side tracking:\n\n\\`\\`\\`typescript\n// In your API route or server action\nimport { datalyr } from '@/lib/datalyr.server';\n\nawait datalyr.track({\n event: 'purchase',\n userId: user.id,\n properties: {\n value: 99.00,\n currency: 'USD',\n email: user.email, // Required for ad platform matching\n phone: user.phone, // Optional, improves match rate\n },\n});\n\\`\\`\\`\n` : '';\n\n const adPlatformsSection = adPlatforms.length > 0 ? `\n## Attribution Setup\n\nAd platforms configured: ${adPlatforms.join(', ')}\n\nFor proper attribution matching, include user data in conversion events:\n- \\`email\\`: User's email (hashed automatically)\n- \\`phone\\`: User's phone number (hashed automatically)\n${adPlatforms.includes('meta') ? '- `fbc`, `fbp`: Meta click/browser IDs (from cookies)' : ''}\n${adPlatforms.includes('google') ? '- `gclid`: Google click ID (from URL params)' : ''}\n${adPlatforms.includes('tiktok') ? '- `ttclid`: TikTok click ID (from URL params)' : ''}\n` : '';\n\n const containerSection = enableContainer ? `\n## Container Scripts\n\nContainer scripts are **enabled**. Third-party pixels (Meta Pixel, Google Tag, TikTok Pixel)\nare managed through the Datalyr dashboard, not in code.\n\nConfigure pixels at: https://app.datalyr.com/dashboard/${workspaceId}/settings/pixels\n\nBenefits:\n- Add/remove pixels without code changes\n- Events tracked with \\`datalyr.track()\\` auto-fire to all configured pixels\n- Server-side fallback for ad blockers\n` : '';\n\n return `# Datalyr Analytics Setup\n\nThis file documents the Datalyr analytics configuration for AI coding assistants.\n\n## Project Info\n\n- **Workspace**: ${workspaceName}\n- **Workspace ID**: \\`${workspaceId}\\`\n- **Framework**: ${framework}\n- **Platform**: ${platformType}\n- **Business Type**: ${businessType}\n- **SDKs**: ${sdks.join(', ')}\n\n## Quick Start\n\n${framework === 'ios' ? `\\`\\`\\`swift\nimport DatalyrSDK\n\n// Track an event\nDatalyr.shared.track(\"event_name\", properties: [\"key\": \"value\"])\n\\`\\`\\`` : `\\`\\`\\`typescript\nimport datalyr from '@datalyr/web';\n\n// Track an event\n${trackingExamples}\n\\`\\`\\``}\n\n## Events to Track\n\n${eventsList}\n\n## Usage Patterns\n\n### Identify Users\n\n\\`\\`\\`typescript\n// After user signs in\ndatalyr.identify(user.id, {\n email: user.email,\n name: user.name,\n plan: user.plan,\n});\n\\`\\`\\`\n\n### Track Events\n\n\\`\\`\\`typescript\n// Track any event with properties\ndatalyr.track('event_name', {\n property: 'value',\n value: 100,\n});\n\\`\\`\\`\n${serverSideExample}${adPlatformsSection}${containerSection}\n## Dashboard\n\nView your analytics at:\nhttps://app.datalyr.com/dashboard/${workspaceId}/events\n\n## Documentation\n\n- SDK Docs: https://docs.datalyr.com/sdks/${framework}\n- API Reference: https://docs.datalyr.com/api\n`;\n}\n"],"mappings":"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","names":["import_path","import_path","fs","path","path","path","import_path","path","import_path","text","ora","chalk","path","spinner","p","spinner","import_chalk","import_chalk","chalk","import_chalk","p","p","p","import_path","import_fs","import_glob","chalk","exec","promisify","execAsync","p","input","path","spinner","path"]}