Architecture: Intelligent Site Exploration¶
This document describes the architecture of LooK's intelligent site exploration system.
System Overview¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Demo Orchestrator β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Pipeline Coordinator ββ
β β explore() β plan() β execute() β finalize() ββ
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β State β β Element β β Navigation β β Content β β
β β Detector β β Discovery β β Graph β β Analyzer β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β β β β β
β ββββββββ΄βββββββββββββββββ΄βββββββββββββββββ΄βββββββββββββββββ΄βββββββ β
β β Demo Engine β β
β β Browser Control β Cursor Tracking β Recording β FFmpeg β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββ
β Playwright β
β Browser β
βββββββββββββββββββ
Component Architecture¶
1. Demo Orchestrator¶
The central coordinator that manages the entire demo generation pipeline.
DemoOrchestrator
βββ explore(url) # Phase 1: Site exploration
βββ plan() # Phase 2: Demo planning
βββ execute() # Phase 3: Demo execution
βββ finalize() # Phase 4: Video finalization
Dependencies:
βββ StateDetector
βββ ElementDiscovery
βββ NavigationGraph
βββ ContentAnalyzer
βββ DemoEngine
βββ DemoPlan
βββ PacingController
βββ ErrorRecovery
βββ TransitionManager
2. State Detector¶
Understands and tracks UI state.
StateDetector
βββ detectCurrentState()
β βββ Check for modals
β βββ Check for loading indicators
β βββ Check for cookie banners
β βββ Return UIState
β
βββ dismissBlockingElements()
β βββ Find all blocking elements
β βββ Try dismiss strategies:
β β βββ Click close button
β β βββ Click backdrop
β β βββ Press Escape
β βββ Verify dismissed
β
βββ waitForContentReady()
βββ Wait for network idle
βββ Wait for loading indicators gone
βββ Wait for DOM stable
3. Element Discovery¶
Finds and categorizes interactive elements.
ElementDiscovery
βββ discoverAll()
β βββ findTabs()
β β βββ Match TAB_PATTERNS
β βββ findAccordions()
β β βββ Match ACCORDION_PATTERNS
β βββ findDropdowns()
β β βββ Match DROPDOWN_PATTERNS
β βββ findCarousels()
β β βββ Match CAROUSEL_PATTERNS
β βββ findHoverElements()
β βββ Check hover states/tooltips
β
βββ rankByDemoValue()
βββ Calculate base score
βββ Apply positive modifiers
βββ Apply negative modifiers
βββ Sort by score
4. Navigation Graph¶
Maps website structure.
NavigationGraph
βββ Nodes (Pages)
β βββ id: unique identifier
β βββ url: page URL
β βββ stateHash: for SPA detection
β βββ children: linked pages
β βββ unexploredLinks: links not clicked
β
βββ Edges (Transitions)
β βββ from: source node
β βββ to: target node
β βββ via: link used
β
βββ Operations
βββ addNode/addEdge
βββ getPath(from, to)
βββ bfs/dfs traversal
βββ findBestNextNode (AI)
5. Content Analyzer¶
Semantic understanding of page content.
ContentAnalyzer
βββ analyzeStructure()
β βββ Take screenshot
β βββ Send to GPT-4o Vision
β βββ Parse sections:
β β βββ hero
β β βββ features
β β βββ pricing
β β βββ testimonials
β β βββ cta
β βββ Return PageContent
β
βββ extractProductStory()
β βββ Identify problem β solution β features β CTA
β
βββ findDemoMoments()
βββ Identify animations, interactions
Data Flow¶
Demo Generation Pipeline¶
1. EXPLORE
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
β URL β StateDetector.init() β
β β dismissBlockingElements() β
β β NavigationGraph.explore() β
β βββ Visit page β
β βββ ElementDiscovery.discoverAll() β
β βββ ContentAnalyzer.analyzeStructure() β
β βββ ExplorationStrategy.selectNextAction() β
β βββ Repeat for each page β
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
2. PLAN
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
β NavigationGraph + Analyses β DemoPlan β
β βββ optimizeOrder() β
β βββ allocateTime() β
β βββ Generate timeline β
β βββ Generate narrative β
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
3. EXECUTE
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DemoPlan β DemoEngine.startRecording() β
β FOR each page in plan: β
β βββ TransitionManager.transitionToPage() β
β βββ FOR each action in timeline: β
β β βββ PacingController.getAdjustedDurationβ
β β βββ Execute action (scroll/click/hover) β
β β βββ ErrorRecovery if needed β
β β βββ Update pacing β
β βββ TransitionManager.transitionToSection() β
β DemoEngine.stopRecording() β
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
4. FINALIZE
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Raw recording β Post-processing β
β βββ Add cursor overlay β
β βββ Add click effects β
β βββ Generate voiceover (TTS) β
β βββ Mix audio β
β βββ Export final video β
βββββββββββββββββββββββββββββββββββββββββββββββββββββ
State Detection Flow¶
Page Load
β
βΌ
detectCurrentState()
β
ββββ Normal βββββββββββββββββββββββββββΊ Continue demo
β
ββββ Modal ββββββββΊ dismissBlockingElements()
β β
β ββββ Success βββΊ Continue demo
β β
β ββββ Failed ββββΊ Skip/Fallback
β
ββββ Loading ββββββΊ waitForContentReady()
β β
β ββββ Ready βββββΊ Continue demo
β
ββββ Cookie βββββββΊ acceptCookies()
β
ββββ Accepted ββΊ Continue demo
Element Discovery Flow¶
discoverAll()
β
βββ Query DOM for patterns
β βββ Tab patterns
β βββ Accordion patterns
β βββ Dropdown patterns
β βββ Carousel patterns
β βββ Hover elements
β
βββ Create InteractiveElement objects
β βββ Extract position
β βββ Extract text
β βββ Determine visibility
β
βββ Calculate demo scores
β βββ Type bonus (tabs +20, carousel +15)
β βββ Text analysis (feature +15, demo +15)
β βββ Position (above fold +10)
β βββ Penalties (login -30, legal -40)
β
βββ Return sorted list
Navigation Graph Flow¶
explore(startUrl)
β
βββ Create root node
β
βββ Visit page
β βββ Wait for content ready
β βββ Extract links
β βββ Store in node.unexploredLinks
β
βββ While unexplored links exist:
β β
β βββ ExplorationStrategy.selectNextAction()
β β β
β β βββ 'click' βββΊ Click link
β β β βββ Create child node
β β β βββ Add edge
β β β βββ Recursively explore
β β β βββ Navigate back
β β β
β β βββ 'back' ββββΊ Navigate to parent
β β β
β β βββ 'done' ββββΊ Stop exploring this node
β β
β βββ Mark link as explored
β
βββ Return NavigationGraph
Error Handling¶
Error Classification¶
Error
β
βββ Navigation Failed
β βββ Strategy: Reload page, retry
β
βββ Element Not Found
β βββ Strategy: Find alternatives or skip
β
βββ Modal Blocked
β βββ Strategy: Dismiss modal, retry
β
βββ Timeout
β βββ Strategy: Skip action
β
βββ Unknown
βββ Strategy: Log and skip
Recovery Flow¶
Error occurs
β
βΌ
ErrorRecovery.recover(error, context)
β
βββ Classify error
β
βββ Get strategy for error type
β
βββ Execute strategy (up to maxRetries)
β β
β βββ 'retry' βββΊ Return to action
β β
β βββ 'skip' ββββΊ Continue to next action
β β
β βββ 'abort' βββΊ Fallback demo
β
βββ Return result
AI Integration Points¶
GPT-4o Vision (Content Analysis)¶
Screenshot (base64)
β
βΌ
Compress to 1024px, JPEG 80%
β
βΌ
OpenAI GPT-4o Chat Completion
β
βββ System prompt: Analysis instructions
β
βββ User prompt: Image + context
β
βΌ
Parse JSON response
β
βΌ
PageContent object
GPT-4o Mini (Decision Making)¶
Context (current state, options)
β
βΌ
OpenAI GPT-4o-mini Chat Completion
β
βββ System: Decision criteria
β
βββ User: Current situation + options
β
βΌ
Parse JSON response
β
βΌ
Action decision
Groq (Script Generation)¶
Analysis results
β
βΌ
Groq API (llama-3.3-70b)
β
βββ System: Script writing instructions
β
βββ User: Product info + style + duration
β
βΌ
Voiceover script text
Performance Considerations¶
Caching Strategy¶
βββββββββββββββββββββββββββββββββββββββββββ
β Cache Layers β
βββββββββββββββββββββββββββββββββββββββββββ€
β L1: In-memory (current session) β
β - Page analyses β
β - Element discoveries β
β - Navigation graph β
βββββββββββββββββββββββββββββββββββββββββββ€
β L2: File-based (cross-session) β
β - Content fingerprints β
β - Deduplication hashes β
βββββββββββββββββββββββββββββββββββββββββββ
API Call Optimization¶
βββββββββββββββββββββββββββββββββββββββββββ
β API Call Strategy β
βββββββββββββββββββββββββββββββββββββββββββ€
β Vision (GPT-4o): β
β - 1 call per page (expensive) β
β - Use 'low' detail when possible β
β - Compress images aggressively β
βββββββββββββββββββββββββββββββββββββββββββ€
β Decisions (GPT-4o-mini): β
β - Batch decisions when possible β
β - Use heuristics first, AI fallback β
βββββββββββββββββββββββββββββββββββββββββββ€
β Scripts (Groq): β
β - 1 call per demo (free tier) β
β - Fall back to OpenAI if needed β
βββββββββββββββββββββββββββββββββββββββββββ
File Structure¶
src/v2/
βββ demo-orchestrator.js # Main orchestrator
βββ demo-plan.js # Demo planning
βββ pacing-controller.js # Adaptive timing
βββ error-recovery.js # Error handling
βββ transition-manager.js # Page/section transitions
βββ state-detector.js # UI state detection
βββ page-state-machine.js # State machine
βββ element-discovery.js # Element discovery
βββ navigation-graph.js # Site graph
βββ spa-detector.js # SPA handling
βββ exploration-strategy.js # Navigation strategies
βββ content-analyzer.js # Content understanding
βββ site-explorer.js # (existing, enhanced)
βββ demo-engine.js # (existing, enhanced)
βββ ai.js # (existing, enhanced)
βββ interactions.js # (existing, enhanced)
tests/
βββ unit/
β βββ state-detector.test.js
β βββ element-discovery.test.js
β βββ navigation-graph.test.js
β βββ content-analyzer.test.js
β βββ demo-orchestrator.test.js
βββ integration/
βββ full-demo.test.js
Extension Points¶
Custom Element Patterns¶
// Add custom tab pattern
elementDiscovery.addPattern('tab', {
container: '.my-tabs',
tab: '.my-tab',
panel: '.my-panel'
});
Custom Exploration Strategy¶
// Create custom strategy
class MyStrategy extends ExplorationStrategy {
async selectNextAction(node, links) {
// Custom logic
}
}
orchestrator.setStrategy(new MyStrategy());
Custom State Handlers¶
// Add custom modal selector
stateDetector.addModalSelector('.my-custom-modal');
// Add custom dismiss method
stateDetector.addDismissMethod('my-modal', async (page, selector) => {
await page.click(`${selector} .custom-close`);
});