humanbehavior-js
Version:
SDK for HumanBehavior session and event recording
897 lines (787 loc) • 30.6 kB
text/typescript
/**
* AI-Enhanced HumanBehavior SDK Auto-Installation Wizard
*
* This wizard uses AI to intelligently detect frameworks, analyze code patterns,
* and generate optimal integration code that's both future-proof and backward-compatible.
*
* 🚀 KEY FEATURES:
* - AI-powered framework detection beyond package.json
* - Intelligent code pattern analysis
* - Future-proof integration strategies
* - Backward compatibility with legacy frameworks
* - Adaptive code generation for new frameworks
* - Smart conflict resolution
* - Learning from user feedback
* - Centralized AI service (no user API keys required)
*/
import * as fs from 'fs';
import * as path from 'path';
import { AutoInstallationWizard, FrameworkInfo, CodeModification, InstallationResult } from '../core/install-wizard';
export interface AICodeAnalysis {
framework: FrameworkInfo;
confidence: number;
patterns: string[];
conflicts: string[];
recommendations: string[];
integrationStrategy: 'provider' | 'plugin' | 'module' | 'script' | 'standalone';
compatibilityMode: 'modern' | 'legacy' | 'hybrid';
}
export interface AIInstallationResult extends InstallationResult {
aiAnalysis: AICodeAnalysis;
learningData: {
patterns: string[];
framework: string;
success: boolean;
userFeedback?: string;
};
}
/**
* Centralized AI Service Interface
* This runs on your backend infrastructure, not in the user's environment
*/
interface CentralizedAIService {
analyzeCodePatterns(codeSamples: string[]): Promise<AICodeAnalysis>;
resolveConflicts(conflicts: string[], framework: FrameworkInfo): Promise<string[]>;
generateOptimizations(framework: FrameworkInfo, patterns: string[]): Promise<string[]>;
}
/**
* Default AI Service Implementation
* Uses heuristic analysis when centralized service is not available
*/
class DefaultAIService implements CentralizedAIService {
async analyzeCodePatterns(codeSamples: string[]): Promise<AICodeAnalysis> {
return this.analyzeWithHeuristics(codeSamples);
}
async resolveConflicts(conflicts: string[], framework: FrameworkInfo): Promise<string[]> {
// Default conflict resolution strategies
const resolutions: string[] = [];
for (const conflict of conflicts) {
switch (conflict) {
case 'existing_humanbehavior_code':
resolutions.push('update_existing_integration');
break;
case 'existing_provider':
resolutions.push('merge_providers');
break;
case 'module_system_conflict':
resolutions.push('hybrid_module_support');
break;
default:
resolutions.push('skip_conflict');
}
}
return resolutions;
}
async generateOptimizations(framework: FrameworkInfo, patterns: string[]): Promise<string[]> {
const optimizations: string[] = [];
// Framework-specific optimizations
switch (framework.type) {
case 'react':
optimizations.push('Use React.memo for performance optimization');
optimizations.push('Implement error boundaries for better error tracking');
optimizations.push('Consider using React.lazy for code splitting');
break;
case 'vue':
optimizations.push('Use Vue 3 Composition API for better performance');
optimizations.push('Implement proper error handling in components');
optimizations.push('Consider using Vue Router for navigation tracking');
break;
case 'angular':
optimizations.push('Use Angular standalone components for better tree-shaking');
optimizations.push('Implement proper error handling with ErrorHandler');
optimizations.push('Consider using Angular signals for state management');
break;
default:
optimizations.push('Enable performance tracking');
optimizations.push('Implement error tracking');
optimizations.push('Consider progressive enhancement');
}
return optimizations;
}
private analyzeWithHeuristics(codeSamples: string[]): AICodeAnalysis {
const patterns = codeSamples.join(' ').toLowerCase();
// Framework detection
let framework: FrameworkInfo = { name: 'vanilla', type: 'vanilla' };
let confidence = 0.5;
if (patterns.includes('nuxt') || patterns.includes('nuxtjs') || patterns.includes('defineNuxtConfig') || patterns.includes('nuxt.config') || patterns.includes('@nuxt/') || patterns.includes('useNuxtApp') || patterns.includes('useRuntimeConfig') || patterns.includes('useSeoMeta') || patterns.includes('useHead') || patterns.includes('useLazyFetch') || patterns.includes('useFetch') || patterns.includes('useAsyncData') || patterns.includes('#app')) {
framework = { name: 'nuxt', type: 'nuxt' };
confidence = 0.95;
} else if (patterns.includes('next') || patterns.includes('nextjs') || patterns.includes('next/link') || patterns.includes('next/image') || patterns.includes('next/navigation') || patterns.includes('next/router') || patterns.includes('getserverSideProps') || patterns.includes('getstaticProps') || patterns.includes('getstaticPaths') || patterns.includes('app/layout') || patterns.includes('app/page') || patterns.includes('pages/')) {
framework = { name: 'nextjs', type: 'nextjs' };
confidence = 0.95;
} else if (patterns.includes('gatsby') || patterns.includes('gatsby-browser') || patterns.includes('gatsby-ssr') || patterns.includes('gatsby-node') || patterns.includes('gatsby-config') || patterns.includes('useStaticQuery') || patterns.includes('graphql')) {
framework = { name: 'gatsby', type: 'gatsby' };
confidence = 0.95;
} else if (patterns.includes('react')) {
framework = { name: 'react', type: 'react' };
confidence = 0.9;
} else if (patterns.includes('vue')) {
framework = { name: 'vue', type: 'vue' };
confidence = 0.9;
} else if (patterns.includes('angular')) {
framework = { name: 'angular', type: 'angular' };
confidence = 0.9;
} else if (patterns.includes('svelte')) {
framework = { name: 'svelte', type: 'svelte' };
confidence = 0.9;
}
// Integration strategy
let integrationStrategy: 'provider' | 'plugin' | 'module' | 'script' | 'standalone' = 'script';
if (framework.type === 'react' || framework.type === 'nextjs' || framework.type === 'gatsby') {
integrationStrategy = 'provider';
} else if (framework.type === 'vue') {
integrationStrategy = 'plugin';
} else if (framework.type === 'angular') {
integrationStrategy = 'module';
}
// Compatibility mode
let compatibilityMode: 'modern' | 'legacy' | 'hybrid' = 'modern';
if (patterns.includes('require(') || patterns.includes('var ')) {
compatibilityMode = 'legacy';
}
return {
framework,
confidence,
patterns: codeSamples,
conflicts: [],
recommendations: [],
integrationStrategy,
compatibilityMode
};
}
}
export class AIEnhancedInstallationWizard extends AutoInstallationWizard {
private aiService: CentralizedAIService;
private learningCache: Map<string, any> = new Map();
private patternDatabase: Map<string, any[]> = new Map();
constructor(apiKey: string, projectRoot: string = process.cwd(), aiService?: CentralizedAIService) {
super(apiKey, projectRoot);
this.aiService = aiService || new DefaultAIService();
this.loadLearningData();
}
/**
* AI-enhanced installation with intelligent analysis
*/
async install(): Promise<AIInstallationResult> {
try {
// Step 1: AI-powered framework detection
const aiAnalysis = await this.performAICodeAnalysis();
// Step 2: Smart framework detection with AI validation
this.framework = await this.detectFrameworkWithAI(aiAnalysis);
// Step 3: Generate AI-optimized modifications
const modifications = await this.generateAIOptimizedModifications(aiAnalysis);
// Step 4: Apply modifications with conflict resolution
await this.applyModificationsWithAI(modifications, aiAnalysis);
// Step 5: Generate intelligent next steps
const nextSteps = this.generateAINextSteps(aiAnalysis);
// Step 6: Learn from this installation
await this.learnFromInstallation(aiAnalysis, modifications);
return {
success: true,
framework: this.framework,
modifications,
errors: [],
nextSteps,
aiAnalysis,
learningData: {
patterns: aiAnalysis.patterns,
framework: this.framework.name,
success: true
}
};
} catch (error) {
return {
success: false,
framework: this.framework || { name: 'unknown', type: 'vanilla' },
modifications: [],
errors: [error instanceof Error ? error.message : 'Unknown error'],
nextSteps: [],
aiAnalysis: {
framework: { name: 'unknown', type: 'vanilla' },
confidence: 0,
patterns: [],
conflicts: [],
recommendations: [],
integrationStrategy: 'script',
compatibilityMode: 'legacy'
},
learningData: {
patterns: [],
framework: 'unknown',
success: false
}
};
}
}
/**
* AI-powered code analysis using centralized service
*/
public async performAICodeAnalysis(): Promise<AICodeAnalysis> {
const projectFiles = await this.scanProjectFiles();
const codeSamples = await this.extractCodeSamples(projectFiles);
// Use centralized AI service (no user API key required)
return await this.aiService.analyzeCodePatterns(codeSamples);
}
/**
* Scan project files for analysis
*/
private async scanProjectFiles(): Promise<string[]> {
const files: string[] = [];
const scanDir = (dir: string, depth: number = 0) => {
if (depth > 3) return; // Limit depth
try {
const items = fs.readdirSync(dir);
for (const item of items) {
const fullPath = path.join(dir, item);
const stat = fs.statSync(fullPath);
if (stat.isDirectory() && !item.startsWith('.') && item !== 'node_modules') {
scanDir(fullPath, depth + 1);
} else if (stat.isFile() && this.isRelevantFile(item)) {
files.push(fullPath);
}
}
} catch (error) {
// Skip inaccessible directories
}
};
scanDir(this.projectRoot);
return files;
}
/**
* Check if file is relevant for analysis
*/
private isRelevantFile(filename: string): boolean {
const relevantExtensions = [
'.js', '.jsx', '.ts', '.tsx', '.vue', '.svelte', '.html',
'.json', '.config.js', '.config.ts', '.babelrc', '.eslintrc'
];
const relevantNames = [
'package.json', 'tsconfig.json', 'vite.config', 'webpack.config',
'next.config', 'nuxt.config', 'angular.json', 'svelte.config',
'app/layout', 'app/page', 'pages/index', 'pages/_app', 'pages/_document'
];
return relevantExtensions.some(ext => filename.endsWith(ext)) ||
relevantNames.some(name => filename.includes(name));
}
/**
* Extract code samples for AI analysis
*/
private async extractCodeSamples(files: string[]): Promise<string[]> {
const samples: string[] = [];
for (const file of files.slice(0, 20)) { // Limit to 20 files
try {
const content = fs.readFileSync(file, 'utf8');
const relativePath = path.relative(this.projectRoot, file);
// Extract relevant code patterns
const patterns = this.extractCodePatterns(content);
if (patterns.length > 0) {
samples.push(`File: ${relativePath}\n${patterns.join('\n')}`);
}
} catch (error) {
// Skip unreadable files
}
}
return samples;
}
/**
* Extract relevant code patterns
*/
private extractCodePatterns(content: string): string[] {
const patterns: string[] = [];
// Framework-specific patterns
const frameworkPatterns = {
react: [
/import\s+React\s+from\s+['"]react['"]/gi,
/from\s+['"]react['"]/gi,
/function\s+\w+\s*\(\s*\)\s*{/gi,
/const\s+\w+\s*=\s*\(\s*\)\s*=>\s*{/gi
],
vue: [
/import\s+{\s*createApp\s*}\s+from\s+['"]vue['"]/gi,
/from\s+['"]vue['"]/gi,
/<template>/gi,
/<script\s+setup>/gi
],
angular: [
/import\s+{\s*Component\s*}\s+from\s+['"]@angular\/core['"]/gi,
/@Component\s*\(\s*{/gi,
/from\s+['"]@angular/gi
],
svelte: [
/<script>/gi,
/import\s+.*\s+from\s+['"]svelte/gi,
/from\s+['"]svelte/gi
],
nextjs: [
/import\s+.*\s+from\s+['"]next/gi,
/from\s+['"]next/gi,
/export\s+default\s+function\s+Page/gi,
/export\s+default\s+function\s+Layout/gi,
/export\s+default\s+function\s+Loading/gi,
/export\s+default\s+function\s+Error/gi,
/export\s+default\s+function\s+Not-found/gi,
/useRouter\s+from\s+['"]next\/navigation['"]/gi,
/useRouter\s+from\s+['"]next\/router['"]/gi,
/Link\s+from\s+['"]next\/link['"]/gi,
/Image\s+from\s+['"]next\/image['"]/gi,
/getServerSideProps/gi,
/getStaticProps/gi,
/getStaticPaths/gi,
/next\.config/gi,
/app\/layout\.tsx/gi,
/app\/page\.tsx/gi,
/pages\/.*\.tsx/gi,
/pages\/.*\.jsx/gi,
/pages\/.*\.ts/gi,
/pages\/.*\.js/gi
],
nuxt: [
/import\s+.*\s+from\s+['"]nuxt/gi,
/from\s+['"]nuxt/gi,
/export\s+default\s+defineNuxtConfig/gi,
/defineNuxtConfig/gi,
/nuxt\.config\.ts/gi,
/nuxt\.config\.js/gi,
/@nuxt\//gi,
/#app/gi,
/useNuxtApp/gi,
/useRuntimeConfig/gi,
/useSeoMeta/gi,
/useHead/gi,
/useLazyFetch/gi,
/useFetch/gi,
/useAsyncData/gi,
/<NuxtLayout/gi,
/<NuxtPage/gi,
/NuxtLayout/gi,
/NuxtPage/gi,
/pages\/.*\.vue/gi,
/layouts\/.*\.vue/gi,
/components\/.*\.vue/gi,
/composables\/.*\.ts/gi,
/middleware\/.*\.ts/gi,
/server\/.*\.ts/gi,
/plugins\/.*\.ts/gi,
/public\//gi,
/assets\//gi,
/content\//gi
]
};
// Extract patterns for each framework
for (const [framework, regexes] of Object.entries(frameworkPatterns)) {
for (const regex of regexes) {
const matches = content.match(regex);
if (matches) {
// Add raw patterns for heuristic analysis
patterns.push(...matches.slice(0, 3));
// Also add formatted patterns for debugging
patterns.push(`${framework.toUpperCase()}: ${matches.slice(0, 3).join(', ')}`);
}
}
}
// Extract import patterns
const importMatches = content.match(/import\s+.*\s+from\s+['"][^'"]+['"]/gi);
if (importMatches) {
patterns.push(`IMPORTS: ${importMatches.slice(0, 5).join(', ')}`);
}
// Extract export patterns
const exportMatches = content.match(/export\s+.*/gi);
if (exportMatches) {
patterns.push(`EXPORTS: ${exportMatches.slice(0, 3).join(', ')}`);
}
return patterns;
}
/**
* AI-enhanced framework detection
*/
private async detectFrameworkWithAI(aiAnalysis: AICodeAnalysis): Promise<FrameworkInfo> {
// Combine AI analysis with traditional detection
const traditionalFramework = await super.detectFramework();
// Use AI analysis if confidence is high, but preserve bundler info
if (aiAnalysis.confidence > 0.8) {
return {
...aiAnalysis.framework,
bundler: traditionalFramework.bundler, // Preserve bundler detection
packageManager: traditionalFramework.packageManager, // Preserve package manager
hasTypeScript: traditionalFramework.hasTypeScript, // Preserve TypeScript detection
hasRouter: traditionalFramework.hasRouter, // Preserve router detection
projectRoot: this.projectRoot
};
}
// Merge AI insights with traditional detection
return {
...traditionalFramework,
// Override with AI insights if available
...(aiAnalysis.framework.type !== 'vanilla' && {
type: aiAnalysis.framework.type,
name: aiAnalysis.framework.name
})
};
}
/**
* Generate AI-optimized modifications
*/
private async generateAIOptimizedModifications(aiAnalysis: AICodeAnalysis): Promise<CodeModification[]> {
const baseModifications = await super.generateModifications();
// Enhance with AI recommendations
const enhancedModifications = baseModifications.map(mod => {
return this.enhanceModificationWithAI(mod, aiAnalysis);
});
// Add AI-specific optimizations
const aiOptimizations = this.generateAIOptimizations(aiAnalysis);
enhancedModifications.push(...aiOptimizations);
return enhancedModifications;
}
/**
* Enhance modification with AI insights
*/
private enhanceModificationWithAI(mod: CodeModification, aiAnalysis: AICodeAnalysis): CodeModification {
let enhancedContent = mod.content;
// Add compatibility comments
if (aiAnalysis.compatibilityMode === 'legacy') {
enhancedContent = `// HumanBehavior SDK - Legacy Compatibility Mode\n${enhancedContent}`;
}
// Add future-proofing comments
if (aiAnalysis.integrationStrategy === 'provider') {
enhancedContent = `// HumanBehavior SDK - Provider Pattern (Future-proof)\n${enhancedContent}`;
}
// Add conflict resolution
if (aiAnalysis.conflicts.length > 0) {
enhancedContent = `// Conflict Resolution: ${aiAnalysis.conflicts.join(', ')}\n${enhancedContent}`;
}
return {
...mod,
content: enhancedContent,
description: `${mod.description} (AI-optimized)`
};
}
/**
* Generate AI-specific optimizations
*/
private generateAIOptimizations(aiAnalysis: AICodeAnalysis): CodeModification[] {
const optimizations: CodeModification[] = [];
// AI optimizations are now handled through environment variables and code injection
// No separate config file needed - everything is integrated into the existing codebase
return optimizations;
}
/**
* Apply modifications with AI conflict resolution
*/
private async applyModificationsWithAI(modifications: CodeModification[], aiAnalysis: AICodeAnalysis): Promise<void> {
for (const modification of modifications) {
try {
// Check for conflicts
const conflicts = await this.detectConflicts(modification);
if (conflicts.length > 0) {
// Resolve conflicts using centralized AI service
const resolutions = await this.aiService.resolveConflicts(conflicts, aiAnalysis.framework);
const resolvedModification = await this.resolveConflicts(modification, conflicts, resolutions, aiAnalysis);
await this.applyModification(resolvedModification);
} else {
await this.applyModification(modification);
}
} catch (error) {
throw new Error(`Failed to apply AI-optimized modification to ${modification.filePath}: ${error}`);
}
}
}
/**
* Detect potential conflicts
*/
private async detectConflicts(modification: CodeModification): Promise<string[]> {
const conflicts: string[] = [];
if (fs.existsSync(modification.filePath)) {
const existingContent = fs.readFileSync(modification.filePath, 'utf8');
// Check for existing HumanBehavior code
if (existingContent.includes('HumanBehavior') || existingContent.includes('humanbehavior')) {
conflicts.push('existing_humanbehavior_code');
}
// Check for conflicting providers/plugins
if (modification.content.includes('Provider') && existingContent.includes('Provider')) {
conflicts.push('existing_provider');
}
// Check for TypeScript conflicts
if (modification.content.includes('import') && existingContent.includes('require(')) {
conflicts.push('module_system_conflict');
}
}
return conflicts;
}
/**
* Resolve conflicts with AI
*/
private async resolveConflicts(modification: CodeModification, conflicts: string[], resolutions: string[], aiAnalysis: AICodeAnalysis): Promise<CodeModification> {
let resolvedContent = modification.content;
for (let i = 0; i < conflicts.length; i++) {
const conflict = conflicts[i];
const resolution = resolutions[i];
switch (resolution) {
case 'update_existing_integration':
resolvedContent = `// Updated HumanBehavior Integration\n${resolvedContent}`;
break;
case 'merge_providers':
resolvedContent = resolvedContent.replace(/<HumanBehaviorProvider/g, '<HumanBehaviorProvider key="updated"');
break;
case 'hybrid_module_support':
resolvedContent = `// Hybrid module system support\n${resolvedContent}`;
break;
case 'skip_conflict':
// Skip this modification
return { ...modification, content: '', description: `${modification.description} (skipped due to conflict)` };
default:
// Default resolution
resolvedContent = `// Conflict resolved: ${conflict}\n${resolvedContent}`;
}
}
return {
...modification,
content: resolvedContent,
description: `${modification.description} (conflict-resolved)`
};
}
/**
* Apply single modification
*/
private async applyModification(modification: CodeModification): Promise<void> {
if (!modification.content) return; // Skip empty modifications
const dir = path.dirname(modification.filePath);
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
switch (modification.action) {
case 'create':
fs.writeFileSync(modification.filePath, modification.content);
break;
case 'modify':
fs.writeFileSync(modification.filePath, modification.content);
break;
case 'append':
fs.appendFileSync(modification.filePath, '\n' + modification.content);
break;
}
}
/**
* Generate AI-enhanced next steps
*/
private generateAINextSteps(aiAnalysis: AICodeAnalysis): string[] {
const steps = [
'✅ AI-optimized SDK installation completed!',
`🎯 Framework detected: ${aiAnalysis.framework.name} (confidence: ${Math.round(aiAnalysis.confidence * 100)}%)`,
`🔧 Integration strategy: ${aiAnalysis.integrationStrategy}`,
`🔄 Compatibility mode: ${aiAnalysis.compatibilityMode}`,
'🚀 Your app is now tracking user behavior with AI-optimized configuration'
];
if (aiAnalysis.recommendations.length > 0) {
steps.push('💡 AI Recommendations:');
aiAnalysis.recommendations.forEach(rec => steps.push(` • ${rec}`));
}
return steps;
}
/**
* Learn from installation for future improvements
*/
private async learnFromInstallation(aiAnalysis: AICodeAnalysis, modifications: CodeModification[]): Promise<void> {
const learningData = {
timestamp: new Date().toISOString(),
framework: aiAnalysis.framework.name,
patterns: aiAnalysis.patterns,
integrationStrategy: aiAnalysis.integrationStrategy,
compatibilityMode: aiAnalysis.compatibilityMode,
modifications: modifications.length,
success: true
};
// Store learning data
this.learningCache.set(`${aiAnalysis.framework.name}_${Date.now()}`, learningData);
// Update pattern database
if (!this.patternDatabase.has(aiAnalysis.framework.name)) {
this.patternDatabase.set(aiAnalysis.framework.name, []);
}
this.patternDatabase.get(aiAnalysis.framework.name)!.push(learningData);
// Save to disk
await this.saveLearningData();
}
/**
* Load learning data from disk
*/
private loadLearningData(): void {
// Don't load learning data from user's project - keep it in memory only
// This prevents cluttering the user's project with internal files
}
/**
* Save learning data to disk
*/
private async saveLearningData(): Promise<void> {
// Don't save learning data to user's project - keep it in memory only
// This prevents cluttering the user's project with internal files
}
/**
* Get AI insights for a specific framework
*/
public getAIInsights(frameworkName: string): any[] {
return this.patternDatabase.get(frameworkName) || [];
}
/**
* Get learning statistics
*/
public getLearningStats(): any {
const stats = {
totalInstallations: this.learningCache.size,
frameworks: {} as any,
patterns: {} as any
};
for (const [framework, data] of this.patternDatabase.entries()) {
stats.frameworks[framework] = data.length;
}
return stats;
}
}
/**
* Browser-based AI installation wizard
*/
export class AIBrowserInstallationWizard {
private apiKey: string;
private aiService: CentralizedAIService;
constructor(apiKey: string, aiService?: CentralizedAIService) {
this.apiKey = apiKey;
this.aiService = aiService || new DefaultAIService();
}
async install(): Promise<AIInstallationResult> {
try {
// AI-powered browser detection
const aiAnalysis = await this.performBrowserAIAnalysis();
// Generate AI-optimized browser modifications
const modifications = this.generateAIBrowserModifications(aiAnalysis);
return {
success: true,
framework: aiAnalysis.framework,
modifications,
errors: [],
nextSteps: [
'✅ AI-optimized browser integration ready!',
`🎯 Framework detected: ${aiAnalysis.framework.name}`,
`🔧 Integration strategy: ${aiAnalysis.integrationStrategy}`,
'📋 Copy the generated code to your project',
'🚀 Your app will be ready to track user behavior'
],
aiAnalysis,
learningData: {
patterns: aiAnalysis.patterns,
framework: aiAnalysis.framework.name,
success: true
}
};
} catch (error) {
return {
success: false,
framework: { name: 'unknown', type: 'vanilla' },
modifications: [],
errors: [error instanceof Error ? error.message : 'Unknown error'],
nextSteps: [],
aiAnalysis: {
framework: { name: 'unknown', type: 'vanilla' },
confidence: 0,
patterns: [],
conflicts: [],
recommendations: [],
integrationStrategy: 'script',
compatibilityMode: 'legacy'
},
learningData: {
patterns: [],
framework: 'unknown',
success: false
}
};
}
}
private async performBrowserAIAnalysis(): Promise<AICodeAnalysis> {
// Browser-based framework detection
const framework = this.detectBrowserFramework();
// Analyze browser environment
const patterns = this.analyzeBrowserPatterns();
// Use centralized AI service for analysis
const codeSamples = [`Browser Environment: ${patterns.join(', ')}`];
return await this.aiService.analyzeCodePatterns(codeSamples);
}
private detectBrowserFramework(): FrameworkInfo {
if (typeof window !== 'undefined') {
if ((window as any).React) {
return { name: 'react', type: 'react' };
}
if ((window as any).Vue) {
return { name: 'vue', type: 'vue' };
}
if ((window as any).angular) {
return { name: 'angular', type: 'angular' };
}
}
return { name: 'vanilla', type: 'vanilla' };
}
private analyzeBrowserPatterns(): string[] {
const patterns: string[] = [];
if (typeof window !== 'undefined') {
// Analyze global objects
if ((window as any).React) patterns.push('React global detected');
if ((window as any).Vue) patterns.push('Vue global detected');
if ((window as any).angular) patterns.push('Angular global detected');
// Analyze DOM patterns
if (document.querySelector('[data-reactroot]')) patterns.push('React DOM detected');
if (document.querySelector('[data-vue]')) patterns.push('Vue DOM detected');
// Analyze script patterns
const scripts = document.querySelectorAll('script');
scripts.forEach(script => {
if (script.src.includes('react')) patterns.push('React script detected');
if (script.src.includes('vue')) patterns.push('Vue script detected');
});
}
return patterns;
}
private generateAIBrowserModifications(aiAnalysis: AICodeAnalysis): CodeModification[] {
const modifications: CodeModification[] = [];
switch (aiAnalysis.framework.type) {
case 'react':
modifications.push({
filePath: 'App.jsx',
action: 'create',
content: `// AI-Optimized React Integration
import { HumanBehaviorProvider } from 'humanbehavior-js/react';
function App() {
return (
<HumanBehaviorProvider
apiKey="${this.apiKey}"
config={{
// AI-generated optimizations
enablePerformanceTracking: true,
enableErrorTracking: true,
framework: '${aiAnalysis.framework.name}',
integrationStrategy: '${aiAnalysis.integrationStrategy}'
}}
>
{/* Your app components */}
</HumanBehaviorProvider>
);
}
export default App;`,
description: 'AI-optimized React component with HumanBehaviorProvider'
});
break;
default:
modifications.push({
filePath: 'humanbehavior-init.js',
action: 'create',
content: `// AI-Optimized Vanilla JS Integration
import { HumanBehaviorTracker } from 'humanbehavior-js';
const tracker = HumanBehaviorTracker.init('${this.apiKey}', {
// AI-generated configuration
framework: '${aiAnalysis.framework.name}',
integrationStrategy: '${aiAnalysis.integrationStrategy}',
compatibilityMode: '${aiAnalysis.compatibilityMode}',
enablePerformanceTracking: true,
enableErrorTracking: true
});`,
description: 'AI-optimized vanilla JS initialization'
});
}
return modifications;
}
}