using ViewEngine.Client; using ViewEngine.Client.Models; namespace ViewEngine.Console; /// /// Demo console application showing how to use the ViewEngine.Client library /// class Program { static async Task Main(string[] args) { System.Console.WriteLine("╔══════════════════════════════════════════════════════════╗"); System.Console.WriteLine("║ ViewEngine Client Library Demo ║"); System.Console.WriteLine("║ Demonstrates using ViewEngine.Client NuGet package ║"); System.Console.WriteLine("╚══════════════════════════════════════════════════════════╝"); System.Console.WriteLine(); // Get API key from command line or prompt string? apiKey; if (args.Length > 0) { apiKey = args[0]; } else { System.Console.Write("Enter your API key: "); apiKey = System.Console.ReadLine(); } if (string.IsNullOrWhiteSpace(apiKey)) { System.Console.WriteLine("❌ Error: API key is required"); System.Console.WriteLine(); System.Console.WriteLine("Usage:"); System.Console.WriteLine(" dotnet run "); System.Console.WriteLine(" OR"); System.Console.WriteLine(" dotnet run (you'll be prompted for the API key)"); return; } try { await RunDemoAsync(apiKey); } catch (Exception ex) { System.Console.WriteLine($"❌ Error: {ex.Message}"); System.Console.WriteLine(); System.Console.WriteLine("Stack trace:"); System.Console.WriteLine(ex.StackTrace); } System.Console.WriteLine(); System.Console.WriteLine("Press any key to exit..."); System.Console.ReadKey(); } static async Task RunDemoAsync(string apiKey) { // Create the ViewEngine client using var client = new ViewEngineClient(apiKey); System.Console.WriteLine("🔍 Step 1: Discovering available MCP tools..."); System.Console.WriteLine(); try { var tools = await client.ListToolsAsync(); System.Console.WriteLine($"✅ Tools response received"); System.Console.WriteLine($" {tools}"); } catch (Exception ex) { System.Console.WriteLine($"⚠️ Could not list tools: {ex.Message}"); } System.Console.WriteLine(); System.Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); System.Console.WriteLine(); // Get URL to retrieve System.Console.Write("Enter a URL to retrieve (or press Enter for example.com): "); var url = System.Console.ReadLine(); if (string.IsNullOrWhiteSpace(url)) { url = "https://example.com"; } System.Console.WriteLine(); System.Console.Write("Force fresh retrieval? (y/n, default: n - use cache if available): "); var forceRefreshInput = System.Console.ReadLine()?.ToLower(); var forceRefresh = forceRefreshInput == "y"; System.Console.WriteLine(); System.Console.Write("Generate AI summary? (y/n, default: n): "); var summaryInput = System.Console.ReadLine()?.ToLower(); var generateSummary = summaryInput == "y"; System.Console.WriteLine(); System.Console.WriteLine($"🌐 Step 2: Submitting retrieval request for {url}..."); if (forceRefresh) { System.Console.WriteLine(" (Forcing fresh retrieval, bypassing cache)"); } if (generateSummary) { System.Console.WriteLine(" (AI summary will be generated)"); } System.Console.WriteLine(); // Submit the retrieval request var request = new SubmitRetrievalRequest { Url = url, ForceRefresh = forceRefresh, GenerateSummary = generateSummary, TimeoutSeconds = 60, Priority = 5 }; var submitResponse = await client.SubmitRetrievalAsync(request); System.Console.WriteLine($"✅ Request submitted successfully!"); System.Console.WriteLine($" Request ID: {submitResponse.RequestId}"); System.Console.WriteLine($" Status: {submitResponse.Status}"); System.Console.WriteLine($" Estimated wait: {submitResponse.EstimatedWaitTimeSeconds}s"); System.Console.WriteLine(); System.Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); System.Console.WriteLine(); System.Console.WriteLine("⏳ Step 3: Polling for results..."); System.Console.WriteLine(); // Poll for completion RetrievalStatusResponse status; int attempt = 0; const int maxAttempts = 60; do { attempt++; await Task.Delay(2000); status = await client.GetRetrievalStatusAsync(submitResponse.RequestId); System.Console.WriteLine($" [{attempt}/{maxAttempts}] Status: {status.Status} - {status.Message}"); if (status.Status == "failed" || status.Status == "canceled") { System.Console.WriteLine($" Error: {status.Error}"); return; } } while (status.Status != "complete" && attempt < maxAttempts); if (status.Status != "complete") { System.Console.WriteLine("⚠️ Timeout: Maximum polling attempts reached"); return; } System.Console.WriteLine(); System.Console.WriteLine($"✅ Retrieval completed!"); System.Console.WriteLine($" URL: {status.Url}"); System.Console.WriteLine($" Completed at: {status.CompletedAt}"); // Download the page content System.Console.WriteLine(); System.Console.WriteLine("⬇️ Step 4: Downloading page content..."); var pageData = await client.GetPageContentAsync(submitResponse.RequestId); System.Console.WriteLine(); System.Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); System.Console.WriteLine("📄 Page Content:"); System.Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); System.Console.WriteLine($" Title: {pageData.Title}"); System.Console.WriteLine($" URL: {pageData.Url}"); System.Console.WriteLine($" Meta Description: {pageData.MetaDescription ?? "(none)"}"); System.Console.WriteLine($" Favicon: {pageData.FaviconUrl ?? "(none)"}"); System.Console.WriteLine($" Routes: {pageData.Routes?.Count ?? 0} links"); System.Console.WriteLine($" Body Routes: {pageData.BodyRoutes?.Count ?? 0} links"); // Display HTTP status code (new feature!) if (pageData.HttpStatusCode.HasValue) { System.Console.WriteLine($" HTTP Status: {pageData.HttpStatusCode}"); if (!pageData.IsSuccess) { System.Console.WriteLine($" ⚠️ Warning: Page returned error status"); System.Console.WriteLine($" IsClientError (4xx): {pageData.IsClientError}"); System.Console.WriteLine($" IsServerError (5xx): {pageData.IsServerError}"); } } if (!string.IsNullOrEmpty(pageData.Summary)) { System.Console.WriteLine(); System.Console.WriteLine("🤖 AI Summary:"); System.Console.WriteLine($" {pageData.Summary}"); } System.Console.WriteLine(); System.Console.WriteLine("📝 Body preview (first 300 chars):"); var bodyPreview = pageData.Body?.Length > 300 ? pageData.Body.Substring(0, 300) + "..." : pageData.Body ?? "(empty)"; System.Console.WriteLine($" {bodyPreview}"); if (pageData.Routes?.Count > 0) { System.Console.WriteLine(); System.Console.WriteLine("🔗 Top 5 Routes:"); foreach (var route in pageData.Routes.Take(5)) { var adFlag = route.IsPotentialAd ? " [AD]" : ""; System.Console.WriteLine($" • {route.Text}: {route.Url}{adFlag}"); } } System.Console.WriteLine(); System.Console.WriteLine("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); System.Console.WriteLine(); System.Console.WriteLine("✅ Demo completed successfully!"); } }