using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using MarketAlly.AIPlugin; namespace Test.Context; /// /// Console application demonstrating the Context Management Suite /// Shows how to maintain conversation continuity across chat sessions /// class Program { static async Task Main(string[] args) { var host = CreateHost(); var service = host.Services.GetRequiredService(); try { ShowWelcome(); // If command line arguments provided, execute them first if (args.Length > 0) { await ExecuteCommand(args, service); Console.WriteLine(); } // Start interactive loop while (true) { try { Console.Write("Context> "); var input = Console.ReadLine(); if (string.IsNullOrWhiteSpace(input)) continue; if (input.Trim() == "/exit" || input.Trim() == "exit") { Console.WriteLine("[INFO] Ending session..."); await service.EndSessionAsync("Interactive context management session completed"); Console.WriteLine("[INFO] Goodbye!"); break; } if (input.Trim() == "/help" || input.Trim() == "help") { ShowHelp(); continue; } var commandArgs = ParseInput(input); if (commandArgs.Length == 0) continue; await ExecuteCommand(commandArgs, service); Console.WriteLine(); } catch (Exception ex) { Console.WriteLine($"[ERROR] Command error: {ex.Message}"); Console.WriteLine(); } } return 0; } catch (Exception ex) { Console.WriteLine($"[ERROR] Application error: {ex.Message}"); var logger = host.Services.GetRequiredService>(); logger.LogError(ex, "Application failed"); return 1; } } private static async Task ExecuteCommand(string[] args, ContextExampleService service) { if (args.Length == 0) { ShowHelp(); return; } var command = args[0].ToLower(); switch (command) { case "init": case "initialize": await HandleInitializeCommand(args, service); break; case "store": await HandleStoreCommand(args, service); break; case "search": case "find": await HandleSearchCommand(args, service); break; case "retrieve": case "context": await HandleRetrieveCommand(args, service); break; case "summary": case "summarize": await HandleSummaryCommand(args, service); break; case "project": await HandleProjectContextCommand(args, service); break; case "demo": await service.RunContextDemoAsync(); break; case "test": await service.TestAllContextPluginsAsync(); break; case "claude": case "chat": await HandleClaudeChatCommand(args, service); break; case "claude-start": await HandleClaudeStartCommand(args, service); break; case "claude-interactive": await service.StartInteractiveClaudeChatAsync(); break; case "clear": await service.ClearContextAsync(); break; case "list": await service.ListStoredContextAsync(); break; case "help": ShowHelp(); break; default: Console.WriteLine($"[ERROR] Unknown command: {command}"); ShowHelp(); break; } } private static async Task HandleInitializeCommand(string[] args, ContextExampleService service) { string topic = GetValueFromArgs(args, "--topic", null); string projectPath = GetValueFromArgs(args, "--project", null); if (string.IsNullOrEmpty(topic)) { Console.Write("Enter session topic: "); topic = Console.ReadLine()?.Trim(); } if (string.IsNullOrEmpty(projectPath)) { Console.Write("Enter project path (or press Enter for current directory): "); projectPath = Console.ReadLine()?.Trim(); if (string.IsNullOrEmpty(projectPath)) projectPath = Directory.GetCurrentDirectory(); } await service.InitializeSessionAsync(topic, projectPath); } private static async Task HandleStoreCommand(string[] args, ContextExampleService service) { string type = GetValueFromArgs(args, "--type", "conversation"); string summary = GetValueFromArgs(args, "--summary", null); string content = GetValueFromArgs(args, "--content", null); string priority = GetValueFromArgs(args, "--priority", "medium"); string tags = GetValueFromArgs(args, "--tags", null); if (string.IsNullOrEmpty(summary)) { Console.Write("Enter summary: "); summary = Console.ReadLine()?.Trim(); } if (string.IsNullOrEmpty(content)) { Console.Write("Enter content to store: "); content = Console.ReadLine()?.Trim(); } if (string.IsNullOrEmpty(summary) || string.IsNullOrEmpty(content)) { Console.WriteLine("[ERROR] Both summary and content are required"); return; } await service.StoreDecisionAsync(type, summary, content, priority, tags); } private static async Task HandleSearchCommand(string[] args, ContextExampleService service) { string query = GetValueFromArgs(args, "--query", null); string contextType = GetValueFromArgs(args, "--type", "all"); int maxResults = int.Parse(GetValueFromArgs(args, "--max", "5")); if (string.IsNullOrEmpty(query)) { Console.Write("Enter search query: "); query = Console.ReadLine()?.Trim(); } if (string.IsNullOrEmpty(query)) { Console.WriteLine("[ERROR] Search query is required"); return; } await service.SearchContextAsync(query, contextType, maxResults); } private static async Task HandleRetrieveCommand(string[] args, ContextExampleService service) { string contextType = GetValueFromArgs(args, "--type", "all"); string projectPath = GetValueFromArgs(args, "--project", null); await service.RetrieveContextAsync(contextType, projectPath); } private static async Task HandleSummaryCommand(string[] args, ContextExampleService service) { string summary = GetValueFromArgs(args, "--summary", null); string topic = GetValueFromArgs(args, "--topic", null); if (string.IsNullOrEmpty(summary)) { Console.Write("Enter session summary: "); summary = Console.ReadLine()?.Trim(); } if (string.IsNullOrEmpty(summary)) { Console.WriteLine("[ERROR] Session summary is required"); return; } await service.SummarizeSessionAsync(summary, topic); } private static async Task HandleProjectContextCommand(string[] args, ContextExampleService service) { string projectPath = GetValueFromArgs(args, "--project", null); if (string.IsNullOrEmpty(projectPath)) { Console.Write("Enter project path (or press Enter for current directory): "); projectPath = Console.ReadLine()?.Trim(); if (string.IsNullOrEmpty(projectPath)) projectPath = Directory.GetCurrentDirectory(); } await service.GetProjectContextAsync(projectPath); } private static async Task HandleClaudeChatCommand(string[] args, ContextExampleService service) { string topic = GetValueFromArgs(args, "--topic", null); string projectPath = GetValueFromArgs(args, "--project", null); if (string.IsNullOrEmpty(topic)) { Console.Write("Enter conversation topic: "); topic = Console.ReadLine()?.Trim(); } if (string.IsNullOrEmpty(projectPath)) { Console.Write("Enter project path (or press Enter for current directory): "); projectPath = Console.ReadLine()?.Trim(); if (string.IsNullOrEmpty(projectPath)) projectPath = Directory.GetCurrentDirectory(); } await service.StartClaudeConversationAsync(topic, projectPath); } private static async Task HandleClaudeStartCommand(string[] args, ContextExampleService service) { string topic = GetValueFromArgs(args, "--topic", "General development discussion"); string projectPath = GetValueFromArgs(args, "--project", Directory.GetCurrentDirectory()); await service.StartClaudeConversationAsync(topic, projectPath); } private static string GetValueFromArgs(string[] args, string flag, string defaultValue) { var index = Array.IndexOf(args, flag); return (index >= 0 && index + 1 < args.Length) ? args[index + 1] : defaultValue; } private static string[] ParseInput(string input) { var parts = new List(); var current = new System.Text.StringBuilder(); bool inQuotes = false; foreach (char c in input) { if (c == '"') { inQuotes = !inQuotes; continue; } if (char.IsWhiteSpace(c) && !inQuotes) { if (current.Length > 0) { parts.Add(current.ToString()); current.Clear(); } } else { current.Append(c); } } if (current.Length > 0) { parts.Add(current.ToString()); } return parts.ToArray(); } private static void ShowWelcome() { Console.WriteLine("MarketAlly AI Plugin - Context Management Suite"); Console.WriteLine("=" + new string('=', 49)); Console.WriteLine(); Console.WriteLine("Maintain conversation continuity across chat sessions"); Console.WriteLine("Type 'help' for commands or 'exit' to quit"); Console.WriteLine(); } private static void ShowHelp() { Console.WriteLine(); Console.WriteLine("Context Management Commands:"); Console.WriteLine(" init [--topic ] [--project ] Initialize conversation session"); Console.WriteLine(" store [--type ] [--summary ] Store important information"); Console.WriteLine(" [--content ] [--priority ]"); Console.WriteLine(" [--tags ]"); Console.WriteLine(" search [--query ] [--type ] Search stored context"); Console.WriteLine(" [--max ]"); Console.WriteLine(" retrieve [--type ] [--project ] Retrieve existing context"); Console.WriteLine(" project [--project ] Get comprehensive project context"); Console.WriteLine(" summary [--summary ] [--topic ] End session with summary"); Console.WriteLine(" demo Run comprehensive demo"); Console.WriteLine(" test Test all context plugins"); Console.WriteLine(" claude-interactive Start interactive Claude chat"); Console.WriteLine(" claude [--topic ] [--project ] Start Claude conversation with context"); Console.WriteLine(" list List all stored context"); Console.WriteLine(" clear Clear context storage"); Console.WriteLine(" help Show this help"); Console.WriteLine(" exit Exit application"); Console.WriteLine(); Console.WriteLine("Context Types:"); Console.WriteLine(" conversation General conversation notes"); Console.WriteLine(" decision Important decisions made"); Console.WriteLine(" codechange Code modifications and refactoring"); Console.WriteLine(" insight Key insights and discoveries"); Console.WriteLine(" milestone Session markers and summaries"); Console.WriteLine(); Console.WriteLine("Priority Levels:"); Console.WriteLine(" low, medium, high, critical"); Console.WriteLine(); Console.WriteLine("Examples:"); Console.WriteLine(" init --topic \"API refactoring\" --project \".\""); Console.WriteLine(" store --type decision --summary \"Use JWT auth\" --content \"Decided to implement JWT...\""); Console.WriteLine(" search --query \"authentication security\" --type decision"); Console.WriteLine(" claude-interactive (Full Claude chat with context)"); Console.WriteLine(" claude --topic \"Database optimization\" (Start Claude conversation)"); Console.WriteLine(" retrieve --type all"); Console.WriteLine(" summary --summary \"Completed API security review\""); Console.WriteLine(); } private static IHost CreateHost() { var builder = Host.CreateDefaultBuilder() .ConfigureAppConfiguration((context, config) => { config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); config.AddUserSecrets(); config.AddEnvironmentVariables(); }) .ConfigureServices((context, services) => { services.AddHttpClient(); services.AddLogging(builder => { builder.AddConsole(); builder.SetMinimumLevel(LogLevel.Information); }); services.AddSingleton(); services.AddTransient(); services.AddTransient(); services.Configure( context.Configuration.GetSection("ClaudeSettings")); }); return builder.Build(); } }