@horneross/cli 0.5.1 → 0.5.2

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 CHANGED
@@ -573,172 +573,171 @@ function createInteractiveCommand() {
573
573
  let messageCount = 0;
574
574
  let totalToolsUsed = 0;
575
575
  const sessionStartTime = Date.now();
576
- const rl = readline2.createInterface({
577
- input: process.stdin,
578
- output: process.stdout,
579
- prompt: chalk7.green("> ")
580
- });
581
- rl.prompt();
582
- rl.on("line", async (input) => {
583
- const trimmed = input.trim();
584
- if (trimmed.startsWith("/")) {
585
- const [command, ...args] = trimmed.slice(1).split(" ");
586
- switch (command.toLowerCase()) {
587
- case "exit":
588
- case "quit":
589
- console.log(chalk7.gray("\nGoodbye! \u{1F44B}\n"));
590
- rl.close();
591
- process.exit(0);
592
- break;
593
- case "help":
594
- console.log(chalk7.cyan("\n\u{1F4DA} Available Commands:\n"));
595
- console.log(chalk7.gray(" /exit Exit the chat"));
596
- console.log(chalk7.gray(" /clear Clear the screen"));
597
- console.log(chalk7.gray(" /config Show current configuration"));
598
- console.log(chalk7.gray(" /agent <name> Switch to a different agent"));
599
- console.log(chalk7.gray(" /help Show this help message\n"));
600
- rl.prompt();
601
- return;
602
- case "clear":
603
- console.clear();
604
- showBanner();
605
- console.log(chalk7.bold.cyan(`\u{1F916} Chatting with ${agent.name}`));
606
- console.log(chalk7.gray("Commands: /help /exit /clear /agent /config\n"));
607
- rl.prompt();
608
- return;
609
- case "config":
610
- console.log(chalk7.cyan("\n\u2699\uFE0F Current Configuration:\n"));
611
- console.log(chalk7.gray(` Agent: ${agent.name} (${agent.id})`));
612
- console.log(chalk7.gray(` Base URL: ${config.base_url}`));
613
- console.log(chalk7.gray(` Conversation ID: ${conversationId}
576
+ await new Promise((resolve) => {
577
+ const rl = readline2.createInterface({
578
+ input: process.stdin,
579
+ output: process.stdout,
580
+ prompt: chalk7.green("> ")
581
+ });
582
+ rl.prompt();
583
+ rl.on("line", async (input) => {
584
+ const trimmed = input.trim();
585
+ if (trimmed.startsWith("/")) {
586
+ const [command, ...args] = trimmed.slice(1).split(" ");
587
+ switch (command.toLowerCase()) {
588
+ case "exit":
589
+ case "quit":
590
+ rl.close();
591
+ return;
592
+ case "help":
593
+ console.log(chalk7.cyan("\n\u{1F4DA} Available Commands:\n"));
594
+ console.log(chalk7.gray(" /exit Exit the chat"));
595
+ console.log(chalk7.gray(" /clear Clear the screen"));
596
+ console.log(chalk7.gray(" /config Show current configuration"));
597
+ console.log(chalk7.gray(" /agent <name> Switch to a different agent"));
598
+ console.log(chalk7.gray(" /help Show this help message\n"));
599
+ rl.prompt();
600
+ return;
601
+ case "clear":
602
+ console.clear();
603
+ showBanner();
604
+ console.log(chalk7.bold.cyan(`\u{1F916} Chatting with ${agent.name}`));
605
+ console.log(chalk7.gray("Commands: /help /exit /clear /agent /config\n"));
606
+ rl.prompt();
607
+ return;
608
+ case "config":
609
+ console.log(chalk7.cyan("\n\u2699\uFE0F Current Configuration:\n"));
610
+ console.log(chalk7.gray(` Agent: ${agent.name} (${agent.id})`));
611
+ console.log(chalk7.gray(` Base URL: ${config.base_url}`));
612
+ console.log(chalk7.gray(` Conversation ID: ${conversationId}
614
613
  `));
615
- rl.prompt();
616
- return;
617
- case "agent":
618
- if (!args[0]) {
619
- console.log(chalk7.red("\n\u2716 Please specify an agent name"));
620
- console.log(chalk7.yellow("Available agents:"));
621
- Object.keys(config.agents).forEach((name) => {
622
- console.log(chalk7.gray(` - ${name}`));
623
- });
624
- console.log("");
625
614
  rl.prompt();
626
615
  return;
627
- }
628
- console.log(chalk7.yellow("\n\u26A0\uFE0F Agent switching not yet implemented\n"));
629
- rl.prompt();
630
- return;
631
- default:
632
- console.log(chalk7.red(`
616
+ case "agent":
617
+ if (!args[0]) {
618
+ console.log(chalk7.red("\n\u2716 Please specify an agent name"));
619
+ console.log(chalk7.yellow("Available agents:"));
620
+ Object.keys(config.agents).forEach((name) => {
621
+ console.log(chalk7.gray(` - ${name}`));
622
+ });
623
+ console.log("");
624
+ rl.prompt();
625
+ return;
626
+ }
627
+ console.log(chalk7.yellow("\n\u26A0\uFE0F Agent switching not yet implemented\n"));
628
+ rl.prompt();
629
+ return;
630
+ default:
631
+ console.log(chalk7.red(`
633
632
  \u2716 Unknown command: /${command}`));
634
- console.log(chalk7.yellow("Type /help for available commands\n"));
633
+ console.log(chalk7.yellow("Type /help for available commands\n"));
634
+ rl.prompt();
635
+ return;
636
+ }
637
+ }
638
+ if (trimmed === "exit" || trimmed === "quit") {
639
+ rl.close();
640
+ return;
641
+ }
642
+ if (!trimmed) {
643
+ rl.prompt();
644
+ return;
645
+ }
646
+ try {
647
+ messageCount++;
648
+ console.log("");
649
+ const startSpinner = ora2({
650
+ text: chalk7.gray("Starting..."),
651
+ color: "gray"
652
+ }).start();
653
+ const response = await fetch(
654
+ `${config.base_url}/api/v2/agent/${agent.id}/chat`,
655
+ {
656
+ method: "POST",
657
+ headers: {
658
+ "Content-Type": "application/json",
659
+ Authorization: `Bearer ${agent.api_key}`
660
+ },
661
+ body: JSON.stringify({
662
+ query: trimmed,
663
+ streaming: true,
664
+ executionMode: "chat",
665
+ conversationId
666
+ })
667
+ }
668
+ );
669
+ startSpinner.stop();
670
+ if (!response.ok) {
671
+ let errorMessage = `Request failed (${response.status})`;
672
+ try {
673
+ const errorData = await response.json();
674
+ errorMessage = errorData.error || errorData.message || errorMessage;
675
+ } catch {
676
+ const errorText = await response.text();
677
+ errorMessage = errorText || errorMessage;
678
+ }
679
+ console.error(chalk7.red("\n\u2716 Error:"), errorMessage);
680
+ if (response.status === 401) {
681
+ console.log(chalk7.yellow(" Hint: Check your API key configuration"));
682
+ } else if (response.status === 429) {
683
+ console.log(chalk7.yellow(" Hint: Rate limit exceeded, please wait a moment"));
684
+ } else if (response.status === 500) {
685
+ console.log(chalk7.yellow(" Hint: Server error, please try again later"));
686
+ }
687
+ console.log("");
635
688
  rl.prompt();
636
689
  return;
637
- }
638
- }
639
- if (trimmed === "exit" || trimmed === "quit") {
640
- console.log(chalk7.gray("\nGoodbye! \u{1F44B}\n"));
641
- rl.close();
642
- process.exit(0);
643
- }
644
- if (!trimmed) {
645
- rl.prompt();
646
- return;
647
- }
648
- try {
649
- messageCount++;
650
- console.log("");
651
- const startSpinner = ora2({
652
- text: chalk7.gray("Starting..."),
653
- color: "gray"
654
- }).start();
655
- const response = await fetch(
656
- `${config.base_url}/api/v2/agent/${agent.id}/chat`,
657
- {
658
- method: "POST",
659
- headers: {
660
- "Content-Type": "application/json",
661
- Authorization: `Bearer ${agent.api_key}`
662
- },
663
- body: JSON.stringify({
664
- query: trimmed,
665
- streaming: true,
666
- executionMode: "chat",
667
- conversationId
668
- })
669
690
  }
670
- );
671
- startSpinner.stop();
672
- if (!response.ok) {
673
- let errorMessage = `Request failed (${response.status})`;
674
- try {
675
- const errorData = await response.json();
676
- errorMessage = errorData.error || errorData.message || errorMessage;
677
- } catch {
678
- const errorText = await response.text();
679
- errorMessage = errorText || errorMessage;
691
+ const adapter = new StreamAdapter();
692
+ await adapter.processStream(response);
693
+ const summary = adapter.getSessionSummary();
694
+ totalToolsUsed += summary.toolsUsed;
695
+ console.log("\n");
696
+ rl.prompt();
697
+ } catch (error) {
698
+ let message = "Unknown error";
699
+ let hint = "";
700
+ if (error instanceof Error) {
701
+ message = error.message;
702
+ if (message.includes("ECONNREFUSED")) {
703
+ hint = "Cannot connect to server. Is the Horneross backend running?";
704
+ } else if (message.includes("ENOTFOUND")) {
705
+ hint = "Cannot resolve hostname. Check your base_url configuration.";
706
+ } else if (message.includes("ETIMEDOUT")) {
707
+ hint = "Connection timed out. Check your network connection.";
708
+ } else if (message.includes("certificate") || message.includes("SSL")) {
709
+ hint = "SSL/TLS error. Check your certificates or try http:// instead of https://.";
710
+ } else if (message.includes("fetch failed")) {
711
+ hint = "Network request failed. Check your internet connection and base_url.";
712
+ }
680
713
  }
681
- console.error(chalk7.red("\n\u2716 Error:"), errorMessage);
682
- if (response.status === 401) {
683
- console.log(chalk7.yellow(" Hint: Check your API key configuration"));
684
- } else if (response.status === 429) {
685
- console.log(chalk7.yellow(" Hint: Rate limit exceeded, please wait a moment"));
686
- } else if (response.status === 500) {
687
- console.log(chalk7.yellow(" Hint: Server error, please try again later"));
714
+ console.error(chalk7.red("\n\u2716 Error:"), message);
715
+ if (hint) {
716
+ console.log(chalk7.yellow(` Hint: ${hint}`));
688
717
  }
689
718
  console.log("");
690
719
  rl.prompt();
691
- return;
692
- }
693
- const adapter = new StreamAdapter();
694
- await adapter.processStream(response);
695
- const summary = adapter.getSessionSummary();
696
- totalToolsUsed += summary.toolsUsed;
697
- console.log("\n");
698
- rl.prompt();
699
- } catch (error) {
700
- let message = "Unknown error";
701
- let hint = "";
702
- if (error instanceof Error) {
703
- message = error.message;
704
- if (message.includes("ECONNREFUSED")) {
705
- hint = "Cannot connect to server. Is the Horneross backend running?";
706
- } else if (message.includes("ENOTFOUND")) {
707
- hint = "Cannot resolve hostname. Check your base_url configuration.";
708
- } else if (message.includes("ETIMEDOUT")) {
709
- hint = "Connection timed out. Check your network connection.";
710
- } else if (message.includes("certificate") || message.includes("SSL")) {
711
- hint = "SSL/TLS error. Check your certificates or try http:// instead of https://.";
712
- } else if (message.includes("fetch failed")) {
713
- hint = "Network request failed. Check your internet connection and base_url.";
714
- }
715
- }
716
- console.error(chalk7.red("\n\u2716 Error:"), message);
717
- if (hint) {
718
- console.log(chalk7.yellow(` Hint: ${hint}`));
719
720
  }
721
+ });
722
+ rl.on("close", () => {
723
+ const sessionDuration = Date.now() - sessionStartTime;
724
+ const durationMinutes = Math.floor(sessionDuration / 6e4);
725
+ const durationSeconds = Math.floor(sessionDuration % 6e4 / 1e3);
720
726
  console.log("");
721
- rl.prompt();
722
- }
723
- });
724
- rl.on("close", () => {
725
- const sessionDuration = Date.now() - sessionStartTime;
726
- const durationMinutes = Math.floor(sessionDuration / 6e4);
727
- const durationSeconds = Math.floor(sessionDuration % 6e4 / 1e3);
728
- console.log("");
729
- console.log(chalk7.blue("\u2501".repeat(50)));
730
- console.log(chalk7.bold.cyan("\n\u{1F4CA} Session Summary"));
731
- console.log(chalk7.gray(` Messages: ${messageCount}`));
732
- console.log(chalk7.gray(` Tools used: ${totalToolsUsed}`));
733
- console.log(chalk7.gray(` Duration: ${durationMinutes}m ${durationSeconds}s`));
734
- console.log(chalk7.gray(` Conversation ID: ${conversationId}`));
735
- if (messageCount > 0) {
736
- console.log(chalk7.blue("\n\u{1F4A1} Resume this conversation:"));
737
- console.log(chalk7.yellow(` horneross --resume ${conversationId.slice(0, 8)}`));
738
- }
739
- console.log(chalk7.blue("\n\u2501".repeat(50)));
740
- console.log(chalk7.gray("\nGoodbye! \u{1F44B}\n"));
741
- process.exit(0);
727
+ console.log(chalk7.blue("\u2501".repeat(50)));
728
+ console.log(chalk7.bold.cyan("\n\u{1F4CA} Session Summary"));
729
+ console.log(chalk7.gray(` Messages: ${messageCount}`));
730
+ console.log(chalk7.gray(` Tools used: ${totalToolsUsed}`));
731
+ console.log(chalk7.gray(` Duration: ${durationMinutes}m ${durationSeconds}s`));
732
+ console.log(chalk7.gray(` Conversation ID: ${conversationId}`));
733
+ if (messageCount > 0) {
734
+ console.log(chalk7.blue("\n\u{1F4A1} Resume this conversation:"));
735
+ console.log(chalk7.yellow(` horneross --resume ${conversationId.slice(0, 8)}`));
736
+ }
737
+ console.log(chalk7.blue("\n\u2501".repeat(50)));
738
+ console.log(chalk7.gray("\nGoodbye! \u{1F44B}\n"));
739
+ resolve();
740
+ });
742
741
  });
743
742
  } catch (error) {
744
743
  const message = error instanceof Error ? error.message : "Unknown error";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/chat.ts","../src/config/config-manager.ts","../src/adapters/stream-adapter.ts","../src/utils/markdown.ts","../src/commands/config.ts","../src/auth/auth-manager.ts","../src/commands/interactive.ts","../src/utils/banner.ts","../src/utils/auto-start.ts"],"sourcesContent":["import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createChatCommand } from './commands/chat.js';\nimport { createConfigCommand } from './commands/config.js';\nimport { createInteractiveCommand } from './commands/interactive.js';\nimport { autoStart } from './utils/auto-start.js';\n\nconst program = new Command();\n\nprogram\n .name('horneross')\n .description('Terminal interface for Horneross AI agents')\n .version('0.1.0');\n\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createConfigCommand());\nprogram.addCommand(createInteractiveCommand());\n\nprogram.on('command:*', () => {\n console.error(chalk.red('\\n✖ Invalid command'));\n console.log(chalk.yellow('\\nAvailable commands:'));\n console.log(chalk.gray(' horneross chat <message> Send a one-shot message'));\n console.log(chalk.gray(' horneross interactive Start interactive session'));\n console.log(chalk.gray(' horneross config init Initialize configuration'));\n console.log(chalk.gray(' horneross config show Show current configuration'));\n console.log(chalk.gray('\\nRun \"horneross --help\" for more details\\n'));\n process.exit(1);\n});\n\n// Main entry point - use top-level await\nasync function main() {\n // Auto-start interactive mode when no command is provided\n if (!process.argv.slice(2).length) {\n await autoStart();\n // If autoStart didn't exit (config is valid), start interactive mode\n process.argv.push('interactive');\n }\n\n await program.parseAsync(process.argv);\n}\n\n// Run main\nmain().catch((error) => {\n console.error(chalk.red('\\n✖ Fatal error:'), error.message);\n process.exit(1);\n});\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { StreamAdapter } from '../adapters/stream-adapter.js';\nimport type { ChatOptions } from '../types.js';\n\nexport function createChatCommand(): Command {\n const chat = new Command('chat');\n\n chat\n .description('Send a one-shot message to your agent')\n .argument('<message>', 'Message to send to the agent')\n .option('-a, --agent <name>', 'Agent to use (defaults to configured default)')\n .option('--conversation-id <id>', 'Continue an existing conversation')\n .action(async (message: string, options: ChatOptions) => {\n try {\n const config = await ConfigManager.load();\n const agentName = options.agent || config.default_agent;\n\n if (!agentName) {\n console.error(chalk.red('\\n✖ No default agent configured'));\n console.error(chalk.yellow('Run: horneross config init\\n'));\n process.exit(1);\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n console.error(chalk.red(`\\n✖ Agent \"${agentName}\" not found`));\n console.error(chalk.yellow('Available agents:'));\n for (const name of Object.keys(config.agents)) {\n console.error(chalk.gray(` - ${name}`));\n }\n console.error();\n process.exit(1);\n }\n\n const requestBody = {\n query: message,\n streaming: true,\n executionMode: 'chat' as const,\n ...(options.conversationId && { conversationId: options.conversationId }),\n };\n\n const response = await fetch(\n `${config.base_url}/api/v2/agent/${agent.id}/chat`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${agent.api_key}`,\n },\n body: JSON.stringify(requestBody),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(chalk.red(`\\n✖ Request failed (${response.status}):`), errorText);\n process.exit(1);\n }\n\n const adapter = new StreamAdapter();\n const metadata = await adapter.processStream(response);\n\n if (metadata) {\n console.log(\n chalk.gray(\n `\\n\\nConversation ID: ${metadata.conversationId}`\n )\n );\n }\n\n console.log();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error(chalk.red('\\n✖ Chat failed:'), message);\n process.exit(1);\n }\n });\n\n return chat;\n}\n","import { readFile, writeFile, mkdir } from 'fs/promises';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { parse, stringify } from 'yaml';\nimport type { CLIConfig, AgentConfig } from '../types.js';\n\nconst CONFIG_DIR = join(homedir(), '.horneross');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.yaml');\n\nconst DEFAULT_CONFIG: CLIConfig = {\n default_agent: '',\n base_url: 'http://localhost:3000',\n agents: {},\n};\n\nexport class ConfigManager {\n static async load(): Promise<CLIConfig> {\n try {\n const content = await readFile(CONFIG_PATH, 'utf-8');\n const config = parse(content) as CLIConfig;\n return { ...DEFAULT_CONFIG, ...config };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return DEFAULT_CONFIG;\n }\n throw error;\n }\n }\n\n static async save(config: CLIConfig): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n const content = stringify(config);\n await writeFile(CONFIG_PATH, content, { mode: 0o600 });\n }\n\n static async addAgent(\n name: string,\n agentConfig: AgentConfig\n ): Promise<void> {\n const config = await this.load();\n config.agents[name] = agentConfig;\n\n if (!config.default_agent) {\n config.default_agent = name;\n }\n\n await this.save(config);\n }\n\n static async getAgent(name?: string): Promise<AgentConfig> {\n const config = await this.load();\n const agentName = name || config.default_agent;\n\n if (!agentName) {\n throw new Error('No default agent configured. Run: horneross config init');\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n throw new Error(`Agent \"${agentName}\" not found in configuration`);\n }\n\n return agent;\n }\n\n static async validateAuth(\n agentConfig: AgentConfig,\n baseUrl: string\n ): Promise<boolean> {\n try {\n const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {\n headers: {\n Authorization: `Bearer ${agentConfig.api_key}`,\n },\n });\n\n return response.ok;\n } catch {\n return false;\n }\n }\n\n static getConfigPath(): string {\n return CONFIG_PATH;\n }\n}\n","import { createParser } from 'eventsource-parser';\nimport ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\nimport { renderMarkdown } from '../utils/markdown.js';\nimport type { SSEEvent, StreamMetadata } from '../types.js';\n\nexport class StreamAdapter {\n private activeSpinner: Ora | null = null;\n private toolCallStack: Map<string, { name: string; startTime: number }> =\n new Map();\n private metadata: StreamMetadata | null = null;\n private isThinking = false;\n private hasOutputText = false;\n private toolsExecuted: Array<{ name: string; duration: number }> = [];\n private sessionStartTime = Date.now();\n\n async processStream(response: Response): Promise<StreamMetadata | null> {\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n // Show initial thinking indicator\n this.isThinking = true;\n process.stdout.write(chalk.gray('🤔 Thinking...\\n'));\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n return new Promise((resolve, reject) => {\n const parser = createParser((event) => {\n if (event.type === 'event') {\n // Ignore [DONE] marker\n if (event.data === '[DONE]') {\n return;\n }\n\n try {\n const data = JSON.parse(event.data);\n this.handleEvent(data);\n } catch (error) {\n // Silently ignore parse errors (they happen with [DONE] and other markers)\n if (event.data !== '[DONE]') {\n console.error(chalk.red('Failed to parse SSE event:'), error);\n }\n }\n }\n });\n\n const processChunk = async (): Promise<void> => {\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n this.cleanup();\n resolve(this.metadata);\n return;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n parser.feed(chunk);\n\n await processChunk();\n } catch (error) {\n this.cleanup();\n reject(error);\n }\n };\n\n processChunk();\n });\n }\n\n private handleEvent(event: SSEEvent): void {\n switch (event.type) {\n case 'text-delta':\n this.handleTextDelta(event);\n break;\n case 'tool-call':\n this.handleToolCall(event);\n break;\n case 'tool-result':\n this.handleToolResult(event);\n break;\n case 'data-message-ids':\n this.handleMetadata(event);\n break;\n case 'data-prefetched_sources':\n this.handleSources(event);\n break;\n case 'data-suggestions':\n this.handleSuggestions(event);\n break;\n case 'data-tool-output':\n this.handleToolOutput(event);\n break;\n case 'error':\n this.handleError(event);\n break;\n }\n }\n\n private handleTextDelta(event: SSEEvent): void {\n // Stop any active spinner when text starts coming\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n this.activeSpinner = null;\n }\n\n // Clear thinking indicator on first text output\n if (this.isThinking && !this.hasOutputText) {\n // Move cursor up and clear the \"Thinking...\" line\n process.stdout.write('\\x1b[1A\\x1b[2K');\n this.isThinking = false;\n }\n\n const text = event.delta || event.content;\n if (text) {\n this.hasOutputText = true;\n // Render markdown formatting (bold, italic, code)\n const formatted = renderMarkdown(text);\n process.stdout.write(formatted);\n }\n }\n\n private handleToolCall(event: SSEEvent): void {\n const { toolName, args } = event;\n const toolCallId = `${toolName}-${Date.now()}`;\n\n this.toolCallStack.set(toolCallId, {\n name: toolName || 'unknown',\n startTime: Date.now(),\n });\n\n // Stop previous spinner if any\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n }\n\n // Clear thinking indicator if still showing\n if (this.isThinking) {\n process.stdout.write('\\x1b[1A\\x1b[2K');\n this.isThinking = false;\n }\n\n // Add newline if this is the first tool after text output\n if (this.hasOutputText) {\n process.stdout.write('\\n');\n }\n\n const argsPreview = this.formatArgs(args);\n const toolIcon = this.getToolIcon(toolName);\n this.activeSpinner = ora({\n text: chalk.cyan(`${toolIcon} ${toolName}${argsPreview}`),\n }).start();\n }\n\n private handleToolResult(event: SSEEvent): void {\n if (this.activeSpinner) {\n const { toolName } = event;\n const elapsedMs = this.getElapsedTimeMs();\n const elapsed = this.formatDuration(elapsedMs);\n const toolIcon = this.getToolIcon(toolName);\n\n // Track tool execution\n if (toolName) {\n this.toolsExecuted.push({ name: toolName, duration: elapsedMs });\n }\n\n this.activeSpinner.succeed(\n chalk.green(`${toolIcon} ${toolName} ${chalk.gray(`(${elapsed})`)}`)\n );\n this.activeSpinner = null;\n }\n\n // Show thinking indicator after tool completes\n if (!this.isThinking) {\n this.isThinking = true;\n process.stdout.write(chalk.gray('🤔 Thinking...\\n'));\n }\n }\n\n private handleToolOutput(event: SSEEvent): void {\n // Handle progress updates from tools\n if (event.data && typeof event.data === 'object') {\n const data = event.data as { status?: string; message?: string };\n if (this.activeSpinner && data.message) {\n this.activeSpinner.text = chalk.cyan(data.message);\n }\n }\n }\n\n private handleSources(event: SSEEvent): void {\n if (event.data && Array.isArray(event.data)) {\n const sources = event.data as Array<{ datastoreName: string; results: unknown[] }>;\n if (sources.length > 0) {\n console.log(chalk.blue('\\n📚 Consulting knowledge base:'));\n sources.forEach((source) => {\n console.log(chalk.gray(` • ${source.datastoreName} (${source.results.length} results)`));\n });\n console.log('');\n }\n }\n }\n\n private handleSuggestions(event: SSEEvent): void {\n if (event.data && typeof event.data === 'object') {\n const data = event.data as { suggestions?: string[] };\n if (data.suggestions && data.suggestions.length > 0) {\n console.log(chalk.blue('\\n💡 Suggestions:'));\n data.suggestions.forEach((suggestion, i) => {\n console.log(chalk.gray(` ${i + 1}. ${suggestion}`));\n });\n }\n }\n }\n\n private getToolIcon(toolName?: string): string {\n const icons: Record<string, string> = {\n web_search: '🔍',\n browser: '🌐',\n pdf_generator: '📄',\n pdf_report: '📊',\n sandbox_shell: '💻',\n sandbox_file_write: '📝',\n sandbox_file_read: '📖',\n http: '🌐',\n think: '🤔',\n analyze: '🔬',\n };\n return icons[toolName || ''] || '🔧';\n }\n\n private handleMetadata(event: SSEEvent): void {\n if (event.data && typeof event.data === 'object' && 'conversationId' in event.data) {\n this.metadata = event.data as StreamMetadata;\n }\n }\n\n private handleError(event: SSEEvent): void {\n this.cleanup();\n console.error(chalk.red('\\n✖ Error:'), event.content || 'Unknown error');\n }\n\n private formatArgs(args: unknown): string {\n if (!args || typeof args !== 'object') {\n return '';\n }\n\n const entries = Object.entries(args as Record<string, unknown>);\n if (entries.length === 0) {\n return '';\n }\n\n const preview = entries\n .slice(0, 2)\n .map(([key, value]) => {\n const valueStr = typeof value === 'string' ? value : JSON.stringify(value);\n const truncated = valueStr.length > 30 ? valueStr.slice(0, 30) + '...' : valueStr;\n return `${key}: ${truncated}`;\n })\n .join(', ');\n\n return ` ${chalk.gray(`(${preview})`)}`;\n }\n\n private getElapsedTimeMs(): number {\n const lastTool = Array.from(this.toolCallStack.values()).pop();\n if (!lastTool) {\n return 0;\n }\n return Date.now() - lastTool.startTime;\n }\n\n private formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n }\n\n getSessionSummary(): {\n duration: number;\n toolsUsed: number;\n toolsList: Array<{ name: string; duration: number }>;\n } {\n return {\n duration: Date.now() - this.sessionStartTime,\n toolsUsed: this.toolsExecuted.length,\n toolsList: this.toolsExecuted,\n };\n }\n\n private cleanup(): void {\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n this.activeSpinner = null;\n }\n this.toolCallStack.clear();\n }\n}\n","import chalk from 'chalk';\n\n/**\n * Convert basic markdown to ANSI codes for terminal display\n * Supports: **bold**, *italic*, `code`\n */\nexport function renderMarkdown(text: string): string {\n let result = text;\n\n // Bold: **text** -> chalk.bold()\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, (_, content) => chalk.bold(content));\n\n // Italic: *text* -> chalk.italic()\n result = result.replace(/\\*([^*]+)\\*/g, (_, content) => chalk.italic(content));\n\n // Code: `text` -> chalk.cyan()\n result = result.replace(/`([^`]+)`/g, (_, content) => chalk.cyan(content));\n\n return result;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as readline from 'readline/promises';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { AuthManager } from '../auth/auth-manager.js';\n\nexport function createConfigCommand(): Command {\n const config = new Command('config');\n\n config\n .command('init')\n .description('Initialize Horneross CLI configuration')\n .action(async () => {\n console.log(chalk.bold.cyan('\\n🤖 Horneross CLI Setup\\n'));\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const agentName = await rl.question(\n chalk.yellow('Agent name (e.g., \"adam\"): ')\n );\n\n if (!agentName.trim()) {\n console.error(chalk.red('\\n✖ Agent name is required'));\n process.exit(1);\n }\n\n const agentId = await rl.question(\n chalk.yellow('Agent ID: ')\n );\n\n if (!agentId.trim()) {\n console.error(chalk.red('\\n✖ Agent ID is required'));\n process.exit(1);\n }\n\n const apiKey = await rl.question(\n chalk.yellow('API Key: ')\n );\n\n if (!apiKey.trim()) {\n console.error(chalk.red('\\n✖ API Key is required'));\n process.exit(1);\n }\n\n const baseUrl = await rl.question(\n chalk.yellow('Base URL [http://localhost:3000]: ')\n );\n\n const finalBaseUrl = baseUrl.trim() || 'http://localhost:3000';\n\n rl.close();\n\n const agentConfig = {\n id: agentId.trim(),\n api_key: apiKey.trim(),\n name: agentName.trim(),\n };\n\n console.log(chalk.gray('\\n⏳ Validating connection...'));\n\n const { valid, error } = await AuthManager.validateConnection(\n agentConfig,\n finalBaseUrl\n );\n\n if (!valid) {\n AuthManager.displayAuthError(error || 'Unknown error');\n process.exit(1);\n }\n\n await ConfigManager.addAgent(agentName.trim(), agentConfig);\n\n const currentConfig = await ConfigManager.load();\n currentConfig.base_url = finalBaseUrl;\n await ConfigManager.save(currentConfig);\n\n console.log(chalk.green('\\n✓ Configuration saved successfully!'));\n console.log(chalk.gray(`\\nConfig file: ${ConfigManager.getConfigPath()}`));\n console.log(chalk.gray(`Default agent: ${agentName.trim()}`));\n console.log(chalk.cyan('\\nYou can now run: horneross chat \"Hello\"\\n'));\n } catch (error) {\n rl.close();\n console.error(chalk.red('\\n✖ Setup failed:'), error);\n process.exit(1);\n }\n });\n\n config\n .command('show')\n .description('Show current configuration')\n .action(async () => {\n try {\n const config = await ConfigManager.load();\n\n console.log(chalk.bold.cyan('\\n🔧 Current Configuration\\n'));\n console.log(chalk.yellow('Base URL:'), config.base_url);\n console.log(chalk.yellow('Default Agent:'), config.default_agent || chalk.gray('(not set)'));\n console.log(chalk.yellow('\\nConfigured Agents:'));\n\n if (Object.keys(config.agents).length === 0) {\n console.log(chalk.gray(' No agents configured'));\n } else {\n for (const [name, agent] of Object.entries(config.agents)) {\n const isDefault = name === config.default_agent;\n const marker = isDefault ? chalk.green('✓') : ' ';\n console.log(` ${marker} ${chalk.cyan(name)} (${agent.id})`);\n }\n }\n\n console.log(chalk.gray(`\\nConfig file: ${ConfigManager.getConfigPath()}\\n`));\n } catch (error) {\n console.error(chalk.red('Failed to load configuration:'), error);\n process.exit(1);\n }\n });\n\n return config;\n}\n","import chalk from 'chalk';\nimport type { AgentConfig } from '../types.js';\n\nexport class AuthManager {\n static async validateConnection(\n agentConfig: AgentConfig,\n baseUrl: string\n ): Promise<{ valid: boolean; error?: string }> {\n try {\n const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {\n headers: {\n Authorization: `Bearer ${agentConfig.api_key}`,\n },\n });\n\n if (response.ok) {\n return { valid: true };\n }\n\n if (response.status === 401) {\n return { valid: false, error: 'Invalid API key' };\n }\n\n if (response.status === 404) {\n return { valid: false, error: 'Agent not found' };\n }\n\n return { valid: false, error: `HTTP ${response.status}: ${response.statusText}` };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return { valid: false, error: `Connection failed: ${message}` };\n }\n }\n\n static displayAuthError(error: string): void {\n console.error(chalk.red('\\n✖ Authentication failed:'), error);\n console.error(chalk.yellow('\\nTroubleshooting:'));\n console.error(chalk.gray(' 1. Check your API key is correct'));\n console.error(chalk.gray(' 2. Verify the agent ID exists'));\n console.error(chalk.gray(' 3. Ensure the base URL is accessible'));\n console.error(chalk.gray('\\nRun: horneross config init'));\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as readline from 'readline';\nimport { createId } from '@paralleldrive/cuid2';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { StreamAdapter } from '../adapters/stream-adapter.js';\nimport { showBanner } from '../utils/banner.js';\n\nexport function createInteractiveCommand(): Command {\n const interactive = new Command('interactive');\n\n interactive\n .description('Start an interactive chat session')\n .option('-a, --agent <name>', 'Agent to use (defaults to configured default)')\n .action(async (options: { agent?: string }) => {\n try {\n const config = await ConfigManager.load();\n const agentName = options.agent || config.default_agent;\n\n if (!agentName) {\n console.error(chalk.red('\\n✖ No default agent configured'));\n console.error(chalk.yellow('Run: horneross config init\\n'));\n process.exit(1);\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n console.error(chalk.red(`\\n✖ Agent \"${agentName}\" not found`));\n process.exit(1);\n }\n\n // Show banner\n showBanner();\n\n console.log(chalk.bold.cyan(`🤖 Chatting with ${agent.name}`));\n console.log(chalk.gray('Commands: /help /exit /clear /agent /config\\n'));\n\n const conversationId = createId();\n let messageCount = 0;\n let totalToolsUsed = 0;\n const sessionStartTime = Date.now();\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: chalk.green('> '),\n });\n\n rl.prompt();\n\n rl.on('line', async (input) => {\n const trimmed = input.trim();\n\n // Handle slash commands\n if (trimmed.startsWith('/')) {\n const [command, ...args] = trimmed.slice(1).split(' ');\n\n switch (command.toLowerCase()) {\n case 'exit':\n case 'quit':\n console.log(chalk.gray('\\nGoodbye! 👋\\n'));\n rl.close();\n process.exit(0);\n break;\n\n case 'help':\n console.log(chalk.cyan('\\n📚 Available Commands:\\n'));\n console.log(chalk.gray(' /exit Exit the chat'));\n console.log(chalk.gray(' /clear Clear the screen'));\n console.log(chalk.gray(' /config Show current configuration'));\n console.log(chalk.gray(' /agent <name> Switch to a different agent'));\n console.log(chalk.gray(' /help Show this help message\\n'));\n rl.prompt();\n return;\n\n case 'clear':\n console.clear();\n showBanner();\n console.log(chalk.bold.cyan(`🤖 Chatting with ${agent.name}`));\n console.log(chalk.gray('Commands: /help /exit /clear /agent /config\\n'));\n rl.prompt();\n return;\n\n case 'config':\n console.log(chalk.cyan('\\n⚙️ Current Configuration:\\n'));\n console.log(chalk.gray(` Agent: ${agent.name} (${agent.id})`));\n console.log(chalk.gray(` Base URL: ${config.base_url}`));\n console.log(chalk.gray(` Conversation ID: ${conversationId}\\n`));\n rl.prompt();\n return;\n\n case 'agent':\n if (!args[0]) {\n console.log(chalk.red('\\n✖ Please specify an agent name'));\n console.log(chalk.yellow('Available agents:'));\n Object.keys(config.agents).forEach(name => {\n console.log(chalk.gray(` - ${name}`));\n });\n console.log('');\n rl.prompt();\n return;\n }\n // TODO: Implement agent switching\n console.log(chalk.yellow('\\n⚠️ Agent switching not yet implemented\\n'));\n rl.prompt();\n return;\n\n default:\n console.log(chalk.red(`\\n✖ Unknown command: /${command}`));\n console.log(chalk.yellow('Type /help for available commands\\n'));\n rl.prompt();\n return;\n }\n }\n\n // Regular exit commands without slash\n if (trimmed === 'exit' || trimmed === 'quit') {\n console.log(chalk.gray('\\nGoodbye! 👋\\n'));\n rl.close();\n process.exit(0);\n }\n\n if (!trimmed) {\n rl.prompt();\n return;\n }\n\n try {\n messageCount++;\n\n // Show immediate feedback\n console.log('');\n const startSpinner = ora({\n text: chalk.gray('Starting...'),\n color: 'gray',\n }).start();\n\n const response = await fetch(\n `${config.base_url}/api/v2/agent/${agent.id}/chat`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${agent.api_key}`,\n },\n body: JSON.stringify({\n query: trimmed,\n streaming: true,\n executionMode: 'chat',\n conversationId,\n }),\n }\n );\n\n // Stop start spinner once connected\n startSpinner.stop();\n\n if (!response.ok) {\n let errorMessage = `Request failed (${response.status})`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorData.message || errorMessage;\n } catch {\n const errorText = await response.text();\n errorMessage = errorText || errorMessage;\n }\n\n console.error(chalk.red('\\n✖ Error:'), errorMessage);\n\n // Provide helpful hints based on status code\n if (response.status === 401) {\n console.log(chalk.yellow(' Hint: Check your API key configuration'));\n } else if (response.status === 429) {\n console.log(chalk.yellow(' Hint: Rate limit exceeded, please wait a moment'));\n } else if (response.status === 500) {\n console.log(chalk.yellow(' Hint: Server error, please try again later'));\n }\n\n console.log('');\n rl.prompt();\n return;\n }\n\n const adapter = new StreamAdapter();\n await adapter.processStream(response);\n\n // Track session metrics\n const summary = adapter.getSessionSummary();\n totalToolsUsed += summary.toolsUsed;\n\n console.log('\\n');\n rl.prompt();\n } catch (error) {\n let message = 'Unknown error';\n let hint = '';\n\n if (error instanceof Error) {\n message = error.message;\n\n // Provide specific hints based on error type\n if (message.includes('ECONNREFUSED')) {\n hint = 'Cannot connect to server. Is the Horneross backend running?';\n } else if (message.includes('ENOTFOUND')) {\n hint = 'Cannot resolve hostname. Check your base_url configuration.';\n } else if (message.includes('ETIMEDOUT')) {\n hint = 'Connection timed out. Check your network connection.';\n } else if (message.includes('certificate') || message.includes('SSL')) {\n hint = 'SSL/TLS error. Check your certificates or try http:// instead of https://.';\n } else if (message.includes('fetch failed')) {\n hint = 'Network request failed. Check your internet connection and base_url.';\n }\n }\n\n console.error(chalk.red('\\n✖ Error:'), message);\n if (hint) {\n console.log(chalk.yellow(` Hint: ${hint}`));\n }\n console.log('');\n rl.prompt();\n }\n });\n\n rl.on('close', () => {\n const sessionDuration = Date.now() - sessionStartTime;\n const durationMinutes = Math.floor(sessionDuration / 60000);\n const durationSeconds = Math.floor((sessionDuration % 60000) / 1000);\n\n console.log('');\n console.log(chalk.blue('━'.repeat(50)));\n console.log(chalk.bold.cyan('\\n📊 Session Summary'));\n console.log(chalk.gray(` Messages: ${messageCount}`));\n console.log(chalk.gray(` Tools used: ${totalToolsUsed}`));\n console.log(chalk.gray(` Duration: ${durationMinutes}m ${durationSeconds}s`));\n console.log(chalk.gray(` Conversation ID: ${conversationId}`));\n\n if (messageCount > 0) {\n console.log(chalk.blue('\\n💡 Resume this conversation:'));\n console.log(chalk.yellow(` horneross --resume ${conversationId.slice(0, 8)}`));\n }\n\n console.log(chalk.blue('\\n━'.repeat(50)));\n console.log(chalk.gray('\\nGoodbye! 👋\\n'));\n process.exit(0);\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error(chalk.red('\\n✖ Interactive mode failed:'), message);\n process.exit(1);\n }\n });\n\n return interactive;\n}\n","import chalk from 'chalk';\n\nexport function showBanner(): void {\n console.log();\n console.log(chalk.hex('#FF8800').bold(`\n ╦ ╦╔═╗╦═╗╔╗╔╔═╗╦═╗╔═╗╔═╗╔═╗\n ╠═╣║ ║╠╦╝║║║║╣ ╠╦╝║ ║╚═╗╚═╗\n ╩ ╩╚═╝╩╚═╝╚╝╚═╝╩╚═╚═╝╚═╝╚═╝\n`));\n console.log(chalk.gray.bold(' Terminal AI Agent Interface'));\n console.log(chalk.gray(' https://horneross.com'));\n console.log(chalk.gray(' ─────────────────────────────'));\n console.log();\n}\n","import chalk from 'chalk';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { showBanner } from './banner.js';\n\nexport async function autoStart(): Promise<void> {\n try {\n // Try to load existing configuration\n const config = await ConfigManager.load();\n\n // Check if there's a default agent configured\n if (!config.default_agent || !config.agents[config.default_agent]) {\n // No configuration found - show welcome and exit\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Please run:\\n'));\n console.log(chalk.white(' horneross config init\\n'));\n process.exit(0);\n }\n\n // Configuration exists - return to let interactive mode run\n // (This function is called from index.ts which will then parse 'interactive' command)\n\n } catch (error) {\n // If config loading fails, assume no config exists\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Please run:\\n'));\n console.log(chalk.white(' horneross config init\\n'));\n process.exit(0);\n }\n}\n"],"mappings":"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","names":["Command","chalk","chalk","chalk","chalk","chalk","message","Command","chalk","chalk","Command","chalk","config","Command","chalk","ora","readline","chalk","Command","chalk","ora","chalk","chalk","Command","chalk"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/chat.ts","../src/config/config-manager.ts","../src/adapters/stream-adapter.ts","../src/utils/markdown.ts","../src/commands/config.ts","../src/auth/auth-manager.ts","../src/commands/interactive.ts","../src/utils/banner.ts","../src/utils/auto-start.ts"],"sourcesContent":["import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createChatCommand } from './commands/chat.js';\nimport { createConfigCommand } from './commands/config.js';\nimport { createInteractiveCommand } from './commands/interactive.js';\nimport { autoStart } from './utils/auto-start.js';\n\nconst program = new Command();\n\nprogram\n .name('horneross')\n .description('Terminal interface for Horneross AI agents')\n .version('0.1.0');\n\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createConfigCommand());\nprogram.addCommand(createInteractiveCommand());\n\nprogram.on('command:*', () => {\n console.error(chalk.red('\\n✖ Invalid command'));\n console.log(chalk.yellow('\\nAvailable commands:'));\n console.log(chalk.gray(' horneross chat <message> Send a one-shot message'));\n console.log(chalk.gray(' horneross interactive Start interactive session'));\n console.log(chalk.gray(' horneross config init Initialize configuration'));\n console.log(chalk.gray(' horneross config show Show current configuration'));\n console.log(chalk.gray('\\nRun \"horneross --help\" for more details\\n'));\n process.exit(1);\n});\n\n// Main entry point - use top-level await\nasync function main() {\n // Auto-start interactive mode when no command is provided\n if (!process.argv.slice(2).length) {\n await autoStart();\n // If autoStart didn't exit (config is valid), start interactive mode\n process.argv.push('interactive');\n }\n\n await program.parseAsync(process.argv);\n}\n\n// Run main\nmain().catch((error) => {\n console.error(chalk.red('\\n✖ Fatal error:'), error.message);\n process.exit(1);\n});\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { StreamAdapter } from '../adapters/stream-adapter.js';\nimport type { ChatOptions } from '../types.js';\n\nexport function createChatCommand(): Command {\n const chat = new Command('chat');\n\n chat\n .description('Send a one-shot message to your agent')\n .argument('<message>', 'Message to send to the agent')\n .option('-a, --agent <name>', 'Agent to use (defaults to configured default)')\n .option('--conversation-id <id>', 'Continue an existing conversation')\n .action(async (message: string, options: ChatOptions) => {\n try {\n const config = await ConfigManager.load();\n const agentName = options.agent || config.default_agent;\n\n if (!agentName) {\n console.error(chalk.red('\\n✖ No default agent configured'));\n console.error(chalk.yellow('Run: horneross config init\\n'));\n process.exit(1);\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n console.error(chalk.red(`\\n✖ Agent \"${agentName}\" not found`));\n console.error(chalk.yellow('Available agents:'));\n for (const name of Object.keys(config.agents)) {\n console.error(chalk.gray(` - ${name}`));\n }\n console.error();\n process.exit(1);\n }\n\n const requestBody = {\n query: message,\n streaming: true,\n executionMode: 'chat' as const,\n ...(options.conversationId && { conversationId: options.conversationId }),\n };\n\n const response = await fetch(\n `${config.base_url}/api/v2/agent/${agent.id}/chat`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${agent.api_key}`,\n },\n body: JSON.stringify(requestBody),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(chalk.red(`\\n✖ Request failed (${response.status}):`), errorText);\n process.exit(1);\n }\n\n const adapter = new StreamAdapter();\n const metadata = await adapter.processStream(response);\n\n if (metadata) {\n console.log(\n chalk.gray(\n `\\n\\nConversation ID: ${metadata.conversationId}`\n )\n );\n }\n\n console.log();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error(chalk.red('\\n✖ Chat failed:'), message);\n process.exit(1);\n }\n });\n\n return chat;\n}\n","import { readFile, writeFile, mkdir } from 'fs/promises';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport { parse, stringify } from 'yaml';\nimport type { CLIConfig, AgentConfig } from '../types.js';\n\nconst CONFIG_DIR = join(homedir(), '.horneross');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.yaml');\n\nconst DEFAULT_CONFIG: CLIConfig = {\n default_agent: '',\n base_url: 'http://localhost:3000',\n agents: {},\n};\n\nexport class ConfigManager {\n static async load(): Promise<CLIConfig> {\n try {\n const content = await readFile(CONFIG_PATH, 'utf-8');\n const config = parse(content) as CLIConfig;\n return { ...DEFAULT_CONFIG, ...config };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return DEFAULT_CONFIG;\n }\n throw error;\n }\n }\n\n static async save(config: CLIConfig): Promise<void> {\n await mkdir(CONFIG_DIR, { recursive: true });\n const content = stringify(config);\n await writeFile(CONFIG_PATH, content, { mode: 0o600 });\n }\n\n static async addAgent(\n name: string,\n agentConfig: AgentConfig\n ): Promise<void> {\n const config = await this.load();\n config.agents[name] = agentConfig;\n\n if (!config.default_agent) {\n config.default_agent = name;\n }\n\n await this.save(config);\n }\n\n static async getAgent(name?: string): Promise<AgentConfig> {\n const config = await this.load();\n const agentName = name || config.default_agent;\n\n if (!agentName) {\n throw new Error('No default agent configured. Run: horneross config init');\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n throw new Error(`Agent \"${agentName}\" not found in configuration`);\n }\n\n return agent;\n }\n\n static async validateAuth(\n agentConfig: AgentConfig,\n baseUrl: string\n ): Promise<boolean> {\n try {\n const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {\n headers: {\n Authorization: `Bearer ${agentConfig.api_key}`,\n },\n });\n\n return response.ok;\n } catch {\n return false;\n }\n }\n\n static getConfigPath(): string {\n return CONFIG_PATH;\n }\n}\n","import { createParser } from 'eventsource-parser';\nimport ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\nimport { renderMarkdown } from '../utils/markdown.js';\nimport type { SSEEvent, StreamMetadata } from '../types.js';\n\nexport class StreamAdapter {\n private activeSpinner: Ora | null = null;\n private toolCallStack: Map<string, { name: string; startTime: number }> =\n new Map();\n private metadata: StreamMetadata | null = null;\n private isThinking = false;\n private hasOutputText = false;\n private toolsExecuted: Array<{ name: string; duration: number }> = [];\n private sessionStartTime = Date.now();\n\n async processStream(response: Response): Promise<StreamMetadata | null> {\n if (!response.body) {\n throw new Error('Response body is null');\n }\n\n // Show initial thinking indicator\n this.isThinking = true;\n process.stdout.write(chalk.gray('🤔 Thinking...\\n'));\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n return new Promise((resolve, reject) => {\n const parser = createParser((event) => {\n if (event.type === 'event') {\n // Ignore [DONE] marker\n if (event.data === '[DONE]') {\n return;\n }\n\n try {\n const data = JSON.parse(event.data);\n this.handleEvent(data);\n } catch (error) {\n // Silently ignore parse errors (they happen with [DONE] and other markers)\n if (event.data !== '[DONE]') {\n console.error(chalk.red('Failed to parse SSE event:'), error);\n }\n }\n }\n });\n\n const processChunk = async (): Promise<void> => {\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n this.cleanup();\n resolve(this.metadata);\n return;\n }\n\n const chunk = decoder.decode(value, { stream: true });\n parser.feed(chunk);\n\n await processChunk();\n } catch (error) {\n this.cleanup();\n reject(error);\n }\n };\n\n processChunk();\n });\n }\n\n private handleEvent(event: SSEEvent): void {\n switch (event.type) {\n case 'text-delta':\n this.handleTextDelta(event);\n break;\n case 'tool-call':\n this.handleToolCall(event);\n break;\n case 'tool-result':\n this.handleToolResult(event);\n break;\n case 'data-message-ids':\n this.handleMetadata(event);\n break;\n case 'data-prefetched_sources':\n this.handleSources(event);\n break;\n case 'data-suggestions':\n this.handleSuggestions(event);\n break;\n case 'data-tool-output':\n this.handleToolOutput(event);\n break;\n case 'error':\n this.handleError(event);\n break;\n }\n }\n\n private handleTextDelta(event: SSEEvent): void {\n // Stop any active spinner when text starts coming\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n this.activeSpinner = null;\n }\n\n // Clear thinking indicator on first text output\n if (this.isThinking && !this.hasOutputText) {\n // Move cursor up and clear the \"Thinking...\" line\n process.stdout.write('\\x1b[1A\\x1b[2K');\n this.isThinking = false;\n }\n\n const text = event.delta || event.content;\n if (text) {\n this.hasOutputText = true;\n // Render markdown formatting (bold, italic, code)\n const formatted = renderMarkdown(text);\n process.stdout.write(formatted);\n }\n }\n\n private handleToolCall(event: SSEEvent): void {\n const { toolName, args } = event;\n const toolCallId = `${toolName}-${Date.now()}`;\n\n this.toolCallStack.set(toolCallId, {\n name: toolName || 'unknown',\n startTime: Date.now(),\n });\n\n // Stop previous spinner if any\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n }\n\n // Clear thinking indicator if still showing\n if (this.isThinking) {\n process.stdout.write('\\x1b[1A\\x1b[2K');\n this.isThinking = false;\n }\n\n // Add newline if this is the first tool after text output\n if (this.hasOutputText) {\n process.stdout.write('\\n');\n }\n\n const argsPreview = this.formatArgs(args);\n const toolIcon = this.getToolIcon(toolName);\n this.activeSpinner = ora({\n text: chalk.cyan(`${toolIcon} ${toolName}${argsPreview}`),\n }).start();\n }\n\n private handleToolResult(event: SSEEvent): void {\n if (this.activeSpinner) {\n const { toolName } = event;\n const elapsedMs = this.getElapsedTimeMs();\n const elapsed = this.formatDuration(elapsedMs);\n const toolIcon = this.getToolIcon(toolName);\n\n // Track tool execution\n if (toolName) {\n this.toolsExecuted.push({ name: toolName, duration: elapsedMs });\n }\n\n this.activeSpinner.succeed(\n chalk.green(`${toolIcon} ${toolName} ${chalk.gray(`(${elapsed})`)}`)\n );\n this.activeSpinner = null;\n }\n\n // Show thinking indicator after tool completes\n if (!this.isThinking) {\n this.isThinking = true;\n process.stdout.write(chalk.gray('🤔 Thinking...\\n'));\n }\n }\n\n private handleToolOutput(event: SSEEvent): void {\n // Handle progress updates from tools\n if (event.data && typeof event.data === 'object') {\n const data = event.data as { status?: string; message?: string };\n if (this.activeSpinner && data.message) {\n this.activeSpinner.text = chalk.cyan(data.message);\n }\n }\n }\n\n private handleSources(event: SSEEvent): void {\n if (event.data && Array.isArray(event.data)) {\n const sources = event.data as Array<{ datastoreName: string; results: unknown[] }>;\n if (sources.length > 0) {\n console.log(chalk.blue('\\n📚 Consulting knowledge base:'));\n sources.forEach((source) => {\n console.log(chalk.gray(` • ${source.datastoreName} (${source.results.length} results)`));\n });\n console.log('');\n }\n }\n }\n\n private handleSuggestions(event: SSEEvent): void {\n if (event.data && typeof event.data === 'object') {\n const data = event.data as { suggestions?: string[] };\n if (data.suggestions && data.suggestions.length > 0) {\n console.log(chalk.blue('\\n💡 Suggestions:'));\n data.suggestions.forEach((suggestion, i) => {\n console.log(chalk.gray(` ${i + 1}. ${suggestion}`));\n });\n }\n }\n }\n\n private getToolIcon(toolName?: string): string {\n const icons: Record<string, string> = {\n web_search: '🔍',\n browser: '🌐',\n pdf_generator: '📄',\n pdf_report: '📊',\n sandbox_shell: '💻',\n sandbox_file_write: '📝',\n sandbox_file_read: '📖',\n http: '🌐',\n think: '🤔',\n analyze: '🔬',\n };\n return icons[toolName || ''] || '🔧';\n }\n\n private handleMetadata(event: SSEEvent): void {\n if (event.data && typeof event.data === 'object' && 'conversationId' in event.data) {\n this.metadata = event.data as StreamMetadata;\n }\n }\n\n private handleError(event: SSEEvent): void {\n this.cleanup();\n console.error(chalk.red('\\n✖ Error:'), event.content || 'Unknown error');\n }\n\n private formatArgs(args: unknown): string {\n if (!args || typeof args !== 'object') {\n return '';\n }\n\n const entries = Object.entries(args as Record<string, unknown>);\n if (entries.length === 0) {\n return '';\n }\n\n const preview = entries\n .slice(0, 2)\n .map(([key, value]) => {\n const valueStr = typeof value === 'string' ? value : JSON.stringify(value);\n const truncated = valueStr.length > 30 ? valueStr.slice(0, 30) + '...' : valueStr;\n return `${key}: ${truncated}`;\n })\n .join(', ');\n\n return ` ${chalk.gray(`(${preview})`)}`;\n }\n\n private getElapsedTimeMs(): number {\n const lastTool = Array.from(this.toolCallStack.values()).pop();\n if (!lastTool) {\n return 0;\n }\n return Date.now() - lastTool.startTime;\n }\n\n private formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n }\n\n getSessionSummary(): {\n duration: number;\n toolsUsed: number;\n toolsList: Array<{ name: string; duration: number }>;\n } {\n return {\n duration: Date.now() - this.sessionStartTime,\n toolsUsed: this.toolsExecuted.length,\n toolsList: this.toolsExecuted,\n };\n }\n\n private cleanup(): void {\n if (this.activeSpinner) {\n this.activeSpinner.stop();\n this.activeSpinner = null;\n }\n this.toolCallStack.clear();\n }\n}\n","import chalk from 'chalk';\n\n/**\n * Convert basic markdown to ANSI codes for terminal display\n * Supports: **bold**, *italic*, `code`\n */\nexport function renderMarkdown(text: string): string {\n let result = text;\n\n // Bold: **text** -> chalk.bold()\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, (_, content) => chalk.bold(content));\n\n // Italic: *text* -> chalk.italic()\n result = result.replace(/\\*([^*]+)\\*/g, (_, content) => chalk.italic(content));\n\n // Code: `text` -> chalk.cyan()\n result = result.replace(/`([^`]+)`/g, (_, content) => chalk.cyan(content));\n\n return result;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport * as readline from 'readline/promises';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { AuthManager } from '../auth/auth-manager.js';\n\nexport function createConfigCommand(): Command {\n const config = new Command('config');\n\n config\n .command('init')\n .description('Initialize Horneross CLI configuration')\n .action(async () => {\n console.log(chalk.bold.cyan('\\n🤖 Horneross CLI Setup\\n'));\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const agentName = await rl.question(\n chalk.yellow('Agent name (e.g., \"adam\"): ')\n );\n\n if (!agentName.trim()) {\n console.error(chalk.red('\\n✖ Agent name is required'));\n process.exit(1);\n }\n\n const agentId = await rl.question(\n chalk.yellow('Agent ID: ')\n );\n\n if (!agentId.trim()) {\n console.error(chalk.red('\\n✖ Agent ID is required'));\n process.exit(1);\n }\n\n const apiKey = await rl.question(\n chalk.yellow('API Key: ')\n );\n\n if (!apiKey.trim()) {\n console.error(chalk.red('\\n✖ API Key is required'));\n process.exit(1);\n }\n\n const baseUrl = await rl.question(\n chalk.yellow('Base URL [http://localhost:3000]: ')\n );\n\n const finalBaseUrl = baseUrl.trim() || 'http://localhost:3000';\n\n rl.close();\n\n const agentConfig = {\n id: agentId.trim(),\n api_key: apiKey.trim(),\n name: agentName.trim(),\n };\n\n console.log(chalk.gray('\\n⏳ Validating connection...'));\n\n const { valid, error } = await AuthManager.validateConnection(\n agentConfig,\n finalBaseUrl\n );\n\n if (!valid) {\n AuthManager.displayAuthError(error || 'Unknown error');\n process.exit(1);\n }\n\n await ConfigManager.addAgent(agentName.trim(), agentConfig);\n\n const currentConfig = await ConfigManager.load();\n currentConfig.base_url = finalBaseUrl;\n await ConfigManager.save(currentConfig);\n\n console.log(chalk.green('\\n✓ Configuration saved successfully!'));\n console.log(chalk.gray(`\\nConfig file: ${ConfigManager.getConfigPath()}`));\n console.log(chalk.gray(`Default agent: ${agentName.trim()}`));\n console.log(chalk.cyan('\\nYou can now run: horneross chat \"Hello\"\\n'));\n } catch (error) {\n rl.close();\n console.error(chalk.red('\\n✖ Setup failed:'), error);\n process.exit(1);\n }\n });\n\n config\n .command('show')\n .description('Show current configuration')\n .action(async () => {\n try {\n const config = await ConfigManager.load();\n\n console.log(chalk.bold.cyan('\\n🔧 Current Configuration\\n'));\n console.log(chalk.yellow('Base URL:'), config.base_url);\n console.log(chalk.yellow('Default Agent:'), config.default_agent || chalk.gray('(not set)'));\n console.log(chalk.yellow('\\nConfigured Agents:'));\n\n if (Object.keys(config.agents).length === 0) {\n console.log(chalk.gray(' No agents configured'));\n } else {\n for (const [name, agent] of Object.entries(config.agents)) {\n const isDefault = name === config.default_agent;\n const marker = isDefault ? chalk.green('✓') : ' ';\n console.log(` ${marker} ${chalk.cyan(name)} (${agent.id})`);\n }\n }\n\n console.log(chalk.gray(`\\nConfig file: ${ConfigManager.getConfigPath()}\\n`));\n } catch (error) {\n console.error(chalk.red('Failed to load configuration:'), error);\n process.exit(1);\n }\n });\n\n return config;\n}\n","import chalk from 'chalk';\nimport type { AgentConfig } from '../types.js';\n\nexport class AuthManager {\n static async validateConnection(\n agentConfig: AgentConfig,\n baseUrl: string\n ): Promise<{ valid: boolean; error?: string }> {\n try {\n const response = await fetch(`${baseUrl}/api/v2/agent/${agentConfig.id}/config`, {\n headers: {\n Authorization: `Bearer ${agentConfig.api_key}`,\n },\n });\n\n if (response.ok) {\n return { valid: true };\n }\n\n if (response.status === 401) {\n return { valid: false, error: 'Invalid API key' };\n }\n\n if (response.status === 404) {\n return { valid: false, error: 'Agent not found' };\n }\n\n return { valid: false, error: `HTTP ${response.status}: ${response.statusText}` };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return { valid: false, error: `Connection failed: ${message}` };\n }\n }\n\n static displayAuthError(error: string): void {\n console.error(chalk.red('\\n✖ Authentication failed:'), error);\n console.error(chalk.yellow('\\nTroubleshooting:'));\n console.error(chalk.gray(' 1. Check your API key is correct'));\n console.error(chalk.gray(' 2. Verify the agent ID exists'));\n console.error(chalk.gray(' 3. Ensure the base URL is accessible'));\n console.error(chalk.gray('\\nRun: horneross config init'));\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport * as readline from 'readline';\nimport { createId } from '@paralleldrive/cuid2';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { StreamAdapter } from '../adapters/stream-adapter.js';\nimport { showBanner } from '../utils/banner.js';\n\nexport function createInteractiveCommand(): Command {\n const interactive = new Command('interactive');\n\n interactive\n .description('Start an interactive chat session')\n .option('-a, --agent <name>', 'Agent to use (defaults to configured default)')\n .action(async (options: { agent?: string }) => {\n try {\n const config = await ConfigManager.load();\n const agentName = options.agent || config.default_agent;\n\n if (!agentName) {\n console.error(chalk.red('\\n✖ No default agent configured'));\n console.error(chalk.yellow('Run: horneross config init\\n'));\n process.exit(1);\n }\n\n const agent = config.agents[agentName];\n if (!agent) {\n console.error(chalk.red(`\\n✖ Agent \"${agentName}\" not found`));\n process.exit(1);\n }\n\n // Show banner\n showBanner();\n\n console.log(chalk.bold.cyan(`🤖 Chatting with ${agent.name}`));\n console.log(chalk.gray('Commands: /help /exit /clear /agent /config\\n'));\n\n const conversationId = createId();\n let messageCount = 0;\n let totalToolsUsed = 0;\n const sessionStartTime = Date.now();\n\n // Wrap readline in a Promise to keep the async action handler alive\n await new Promise<void>((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: chalk.green('> '),\n });\n\n rl.prompt();\n\n rl.on('line', async (input) => {\n const trimmed = input.trim();\n\n // Handle slash commands\n if (trimmed.startsWith('/')) {\n const [command, ...args] = trimmed.slice(1).split(' ');\n\n switch (command.toLowerCase()) {\n case 'exit':\n case 'quit':\n rl.close();\n return;\n\n case 'help':\n console.log(chalk.cyan('\\n📚 Available Commands:\\n'));\n console.log(chalk.gray(' /exit Exit the chat'));\n console.log(chalk.gray(' /clear Clear the screen'));\n console.log(chalk.gray(' /config Show current configuration'));\n console.log(chalk.gray(' /agent <name> Switch to a different agent'));\n console.log(chalk.gray(' /help Show this help message\\n'));\n rl.prompt();\n return;\n\n case 'clear':\n console.clear();\n showBanner();\n console.log(chalk.bold.cyan(`🤖 Chatting with ${agent.name}`));\n console.log(chalk.gray('Commands: /help /exit /clear /agent /config\\n'));\n rl.prompt();\n return;\n\n case 'config':\n console.log(chalk.cyan('\\n⚙️ Current Configuration:\\n'));\n console.log(chalk.gray(` Agent: ${agent.name} (${agent.id})`));\n console.log(chalk.gray(` Base URL: ${config.base_url}`));\n console.log(chalk.gray(` Conversation ID: ${conversationId}\\n`));\n rl.prompt();\n return;\n\n case 'agent':\n if (!args[0]) {\n console.log(chalk.red('\\n✖ Please specify an agent name'));\n console.log(chalk.yellow('Available agents:'));\n Object.keys(config.agents).forEach(name => {\n console.log(chalk.gray(` - ${name}`));\n });\n console.log('');\n rl.prompt();\n return;\n }\n // TODO: Implement agent switching\n console.log(chalk.yellow('\\n⚠️ Agent switching not yet implemented\\n'));\n rl.prompt();\n return;\n\n default:\n console.log(chalk.red(`\\n✖ Unknown command: /${command}`));\n console.log(chalk.yellow('Type /help for available commands\\n'));\n rl.prompt();\n return;\n }\n }\n\n // Regular exit commands without slash\n if (trimmed === 'exit' || trimmed === 'quit') {\n rl.close();\n return;\n }\n\n if (!trimmed) {\n rl.prompt();\n return;\n }\n\n try {\n messageCount++;\n\n // Show immediate feedback\n console.log('');\n const startSpinner = ora({\n text: chalk.gray('Starting...'),\n color: 'gray',\n }).start();\n\n const response = await fetch(\n `${config.base_url}/api/v2/agent/${agent.id}/chat`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${agent.api_key}`,\n },\n body: JSON.stringify({\n query: trimmed,\n streaming: true,\n executionMode: 'chat',\n conversationId,\n }),\n }\n );\n\n // Stop start spinner once connected\n startSpinner.stop();\n\n if (!response.ok) {\n let errorMessage = `Request failed (${response.status})`;\n try {\n const errorData = await response.json();\n errorMessage = errorData.error || errorData.message || errorMessage;\n } catch {\n const errorText = await response.text();\n errorMessage = errorText || errorMessage;\n }\n\n console.error(chalk.red('\\n✖ Error:'), errorMessage);\n\n // Provide helpful hints based on status code\n if (response.status === 401) {\n console.log(chalk.yellow(' Hint: Check your API key configuration'));\n } else if (response.status === 429) {\n console.log(chalk.yellow(' Hint: Rate limit exceeded, please wait a moment'));\n } else if (response.status === 500) {\n console.log(chalk.yellow(' Hint: Server error, please try again later'));\n }\n\n console.log('');\n rl.prompt();\n return;\n }\n\n const adapter = new StreamAdapter();\n await adapter.processStream(response);\n\n // Track session metrics\n const summary = adapter.getSessionSummary();\n totalToolsUsed += summary.toolsUsed;\n\n console.log('\\n');\n rl.prompt();\n } catch (error) {\n let message = 'Unknown error';\n let hint = '';\n\n if (error instanceof Error) {\n message = error.message;\n\n // Provide specific hints based on error type\n if (message.includes('ECONNREFUSED')) {\n hint = 'Cannot connect to server. Is the Horneross backend running?';\n } else if (message.includes('ENOTFOUND')) {\n hint = 'Cannot resolve hostname. Check your base_url configuration.';\n } else if (message.includes('ETIMEDOUT')) {\n hint = 'Connection timed out. Check your network connection.';\n } else if (message.includes('certificate') || message.includes('SSL')) {\n hint = 'SSL/TLS error. Check your certificates or try http:// instead of https://.';\n } else if (message.includes('fetch failed')) {\n hint = 'Network request failed. Check your internet connection and base_url.';\n }\n }\n\n console.error(chalk.red('\\n✖ Error:'), message);\n if (hint) {\n console.log(chalk.yellow(` Hint: ${hint}`));\n }\n console.log('');\n rl.prompt();\n }\n });\n\n rl.on('close', () => {\n const sessionDuration = Date.now() - sessionStartTime;\n const durationMinutes = Math.floor(sessionDuration / 60000);\n const durationSeconds = Math.floor((sessionDuration % 60000) / 1000);\n\n console.log('');\n console.log(chalk.blue('━'.repeat(50)));\n console.log(chalk.bold.cyan('\\n📊 Session Summary'));\n console.log(chalk.gray(` Messages: ${messageCount}`));\n console.log(chalk.gray(` Tools used: ${totalToolsUsed}`));\n console.log(chalk.gray(` Duration: ${durationMinutes}m ${durationSeconds}s`));\n console.log(chalk.gray(` Conversation ID: ${conversationId}`));\n\n if (messageCount > 0) {\n console.log(chalk.blue('\\n💡 Resume this conversation:'));\n console.log(chalk.yellow(` horneross --resume ${conversationId.slice(0, 8)}`));\n }\n\n console.log(chalk.blue('\\n━'.repeat(50)));\n console.log(chalk.gray('\\nGoodbye! 👋\\n'));\n\n // Resolve the promise to allow the async action to complete\n resolve();\n });\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error(chalk.red('\\n✖ Interactive mode failed:'), message);\n process.exit(1);\n }\n });\n\n return interactive;\n}\n","import chalk from 'chalk';\n\nexport function showBanner(): void {\n console.log();\n console.log(chalk.hex('#FF8800').bold(`\n ╦ ╦╔═╗╦═╗╔╗╔╔═╗╦═╗╔═╗╔═╗╔═╗\n ╠═╣║ ║╠╦╝║║║║╣ ╠╦╝║ ║╚═╗╚═╗\n ╩ ╩╚═╝╩╚═╝╚╝╚═╝╩╚═╚═╝╚═╝╚═╝\n`));\n console.log(chalk.gray.bold(' Terminal AI Agent Interface'));\n console.log(chalk.gray(' https://horneross.com'));\n console.log(chalk.gray(' ─────────────────────────────'));\n console.log();\n}\n","import chalk from 'chalk';\nimport { ConfigManager } from '../config/config-manager.js';\nimport { showBanner } from './banner.js';\n\nexport async function autoStart(): Promise<void> {\n try {\n // Try to load existing configuration\n const config = await ConfigManager.load();\n\n // Check if there's a default agent configured\n if (!config.default_agent || !config.agents[config.default_agent]) {\n // No configuration found - show welcome and exit\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Please run:\\n'));\n console.log(chalk.white(' horneross config init\\n'));\n process.exit(0);\n }\n\n // Configuration exists - return to let interactive mode run\n // (This function is called from index.ts which will then parse 'interactive' command)\n\n } catch (error) {\n // If config loading fails, assume no config exists\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Please run:\\n'));\n console.log(chalk.white(' horneross config init\\n'));\n process.exit(0);\n }\n}\n"],"mappings":";;;AAAA,SAAS,WAAAA,gBAAe;AACxB,OAAOC,YAAW;;;ACDlB,SAAS,eAAe;AACxB,OAAOC,YAAW;;;ACDlB,SAAS,UAAU,WAAW,aAAa;AAC3C,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,OAAO,iBAAiB;AAGjC,IAAM,aAAa,KAAK,QAAQ,GAAG,YAAY;AAC/C,IAAM,cAAc,KAAK,YAAY,aAAa;AAElD,IAAM,iBAA4B;AAAA,EAChC,eAAe;AAAA,EACf,UAAU;AAAA,EACV,QAAQ,CAAC;AACX;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,aAAa,OAA2B;AACtC,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,aAAa,OAAO;AACnD,YAAM,SAAS,MAAM,OAAO;AAC5B,aAAO,EAAE,GAAG,gBAAgB,GAAG,OAAO;AAAA,IACxC,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,UAAU;AACtD,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,aAAa,KAAK,QAAkC;AAClD,UAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC3C,UAAM,UAAU,UAAU,MAAM;AAChC,UAAM,UAAU,aAAa,SAAS,EAAE,MAAM,IAAM,CAAC;AAAA,EACvD;AAAA,EAEA,aAAa,SACX,MACA,aACe;AACf,UAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,WAAO,OAAO,IAAI,IAAI;AAEtB,QAAI,CAAC,OAAO,eAAe;AACzB,aAAO,gBAAgB;AAAA,IACzB;AAEA,UAAM,KAAK,KAAK,MAAM;AAAA,EACxB;AAAA,EAEA,aAAa,SAAS,MAAqC;AACzD,UAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,UAAM,YAAY,QAAQ,OAAO;AAEjC,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AAEA,UAAM,QAAQ,OAAO,OAAO,SAAS;AACrC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,UAAU,SAAS,8BAA8B;AAAA,IACnE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,aACX,aACA,SACkB;AAClB,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,iBAAiB,YAAY,EAAE,WAAW;AAAA,QAC/E,SAAS;AAAA,UACP,eAAe,UAAU,YAAY,OAAO;AAAA,QAC9C;AAAA,MACF,CAAC;AAED,aAAO,SAAS;AAAA,IAClB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,gBAAwB;AAC7B,WAAO;AAAA,EACT;AACF;;;ACrFA,SAAS,oBAAoB;AAC7B,OAAO,SAAuB;AAC9B,OAAOC,YAAW;;;ACFlB,OAAO,WAAW;AAMX,SAAS,eAAe,MAAsB;AACnD,MAAI,SAAS;AAGb,WAAS,OAAO,QAAQ,oBAAoB,CAAC,GAAG,YAAY,MAAM,KAAK,OAAO,CAAC;AAG/E,WAAS,OAAO,QAAQ,gBAAgB,CAAC,GAAG,YAAY,MAAM,OAAO,OAAO,CAAC;AAG7E,WAAS,OAAO,QAAQ,cAAc,CAAC,GAAG,YAAY,MAAM,KAAK,OAAO,CAAC;AAEzE,SAAO;AACT;;;ADbO,IAAM,gBAAN,MAAoB;AAAA,EACjB,gBAA4B;AAAA,EAC5B,gBACN,oBAAI,IAAI;AAAA,EACF,WAAkC;AAAA,EAClC,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,gBAA2D,CAAC;AAAA,EAC5D,mBAAmB,KAAK,IAAI;AAAA,EAEpC,MAAM,cAAc,UAAoD;AACtE,QAAI,CAAC,SAAS,MAAM;AAClB,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AAGA,SAAK,aAAa;AAClB,YAAQ,OAAO,MAAMC,OAAM,KAAK,yBAAkB,CAAC;AAEnD,UAAM,SAAS,SAAS,KAAK,UAAU;AACvC,UAAM,UAAU,IAAI,YAAY;AAEhC,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,SAAS,aAAa,CAAC,UAAU;AACrC,YAAI,MAAM,SAAS,SAAS;AAE1B,cAAI,MAAM,SAAS,UAAU;AAC3B;AAAA,UACF;AAEA,cAAI;AACF,kBAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAClC,iBAAK,YAAY,IAAI;AAAA,UACvB,SAAS,OAAO;AAEd,gBAAI,MAAM,SAAS,UAAU;AAC3B,sBAAQ,MAAMA,OAAM,IAAI,4BAA4B,GAAG,KAAK;AAAA,YAC9D;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,eAAe,YAA2B;AAC9C,YAAI;AACF,gBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,cAAI,MAAM;AACR,iBAAK,QAAQ;AACb,oBAAQ,KAAK,QAAQ;AACrB;AAAA,UACF;AAEA,gBAAM,QAAQ,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AACpD,iBAAO,KAAK,KAAK;AAEjB,gBAAM,aAAa;AAAA,QACrB,SAAS,OAAO;AACd,eAAK,QAAQ;AACb,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAEA,mBAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEQ,YAAY,OAAuB;AACzC,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,aAAK,gBAAgB,KAAK;AAC1B;AAAA,MACF,KAAK;AACH,aAAK,eAAe,KAAK;AACzB;AAAA,MACF,KAAK;AACH,aAAK,iBAAiB,KAAK;AAC3B;AAAA,MACF,KAAK;AACH,aAAK,eAAe,KAAK;AACzB;AAAA,MACF,KAAK;AACH,aAAK,cAAc,KAAK;AACxB;AAAA,MACF,KAAK;AACH,aAAK,kBAAkB,KAAK;AAC5B;AAAA,MACF,KAAK;AACH,aAAK,iBAAiB,KAAK;AAC3B;AAAA,MACF,KAAK;AACH,aAAK,YAAY,KAAK;AACtB;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,gBAAgB,OAAuB;AAE7C,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,KAAK;AACxB,WAAK,gBAAgB;AAAA,IACvB;AAGA,QAAI,KAAK,cAAc,CAAC,KAAK,eAAe;AAE1C,cAAQ,OAAO,MAAM,gBAAgB;AACrC,WAAK,aAAa;AAAA,IACpB;AAEA,UAAM,OAAO,MAAM,SAAS,MAAM;AAClC,QAAI,MAAM;AACR,WAAK,gBAAgB;AAErB,YAAM,YAAY,eAAe,IAAI;AACrC,cAAQ,OAAO,MAAM,SAAS;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,eAAe,OAAuB;AAC5C,UAAM,EAAE,UAAU,KAAK,IAAI;AAC3B,UAAM,aAAa,GAAG,QAAQ,IAAI,KAAK,IAAI,CAAC;AAE5C,SAAK,cAAc,IAAI,YAAY;AAAA,MACjC,MAAM,YAAY;AAAA,MAClB,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAGD,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,KAAK;AAAA,IAC1B;AAGA,QAAI,KAAK,YAAY;AACnB,cAAQ,OAAO,MAAM,gBAAgB;AACrC,WAAK,aAAa;AAAA,IACpB;AAGA,QAAI,KAAK,eAAe;AACtB,cAAQ,OAAO,MAAM,IAAI;AAAA,IAC3B;AAEA,UAAM,cAAc,KAAK,WAAW,IAAI;AACxC,UAAM,WAAW,KAAK,YAAY,QAAQ;AAC1C,SAAK,gBAAgB,IAAI;AAAA,MACvB,MAAMA,OAAM,KAAK,GAAG,QAAQ,IAAI,QAAQ,GAAG,WAAW,EAAE;AAAA,IAC1D,CAAC,EAAE,MAAM;AAAA,EACX;AAAA,EAEQ,iBAAiB,OAAuB;AAC9C,QAAI,KAAK,eAAe;AACtB,YAAM,EAAE,SAAS,IAAI;AACrB,YAAM,YAAY,KAAK,iBAAiB;AACxC,YAAM,UAAU,KAAK,eAAe,SAAS;AAC7C,YAAM,WAAW,KAAK,YAAY,QAAQ;AAG1C,UAAI,UAAU;AACZ,aAAK,cAAc,KAAK,EAAE,MAAM,UAAU,UAAU,UAAU,CAAC;AAAA,MACjE;AAEA,WAAK,cAAc;AAAA,QACjBA,OAAM,MAAM,GAAG,QAAQ,IAAI,QAAQ,IAAIA,OAAM,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE;AAAA,MACrE;AACA,WAAK,gBAAgB;AAAA,IACvB;AAGA,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,aAAa;AAClB,cAAQ,OAAO,MAAMA,OAAM,KAAK,yBAAkB,CAAC;AAAA,IACrD;AAAA,EACF;AAAA,EAEQ,iBAAiB,OAAuB;AAE9C,QAAI,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AAChD,YAAM,OAAO,MAAM;AACnB,UAAI,KAAK,iBAAiB,KAAK,SAAS;AACtC,aAAK,cAAc,OAAOA,OAAM,KAAK,KAAK,OAAO;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,OAAuB;AAC3C,QAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC3C,YAAM,UAAU,MAAM;AACtB,UAAI,QAAQ,SAAS,GAAG;AACtB,gBAAQ,IAAIA,OAAM,KAAK,wCAAiC,CAAC;AACzD,gBAAQ,QAAQ,CAAC,WAAW;AAC1B,kBAAQ,IAAIA,OAAM,KAAK,YAAO,OAAO,aAAa,KAAK,OAAO,QAAQ,MAAM,WAAW,CAAC;AAAA,QAC1F,CAAC;AACD,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAkB,OAAuB;AAC/C,QAAI,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AAChD,YAAM,OAAO,MAAM;AACnB,UAAI,KAAK,eAAe,KAAK,YAAY,SAAS,GAAG;AACnD,gBAAQ,IAAIA,OAAM,KAAK,0BAAmB,CAAC;AAC3C,aAAK,YAAY,QAAQ,CAAC,YAAY,MAAM;AAC1C,kBAAQ,IAAIA,OAAM,KAAK,KAAK,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;AAAA,QACrD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,UAA2B;AAC7C,UAAM,QAAgC;AAAA,MACpC,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,mBAAmB;AAAA,MACnB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AACA,WAAO,MAAM,YAAY,EAAE,KAAK;AAAA,EAClC;AAAA,EAEQ,eAAe,OAAuB;AAC5C,QAAI,MAAM,QAAQ,OAAO,MAAM,SAAS,YAAY,oBAAoB,MAAM,MAAM;AAClF,WAAK,WAAW,MAAM;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,YAAY,OAAuB;AACzC,SAAK,QAAQ;AACb,YAAQ,MAAMA,OAAM,IAAI,iBAAY,GAAG,MAAM,WAAW,eAAe;AAAA,EACzE;AAAA,EAEQ,WAAW,MAAuB;AACxC,QAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,OAAO,QAAQ,IAA+B;AAC9D,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,QACb,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,YAAM,WAAW,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AACzE,YAAM,YAAY,SAAS,SAAS,KAAK,SAAS,MAAM,GAAG,EAAE,IAAI,QAAQ;AACzE,aAAO,GAAG,GAAG,KAAK,SAAS;AAAA,IAC7B,CAAC,EACA,KAAK,IAAI;AAEZ,WAAO,IAAIA,OAAM,KAAK,IAAI,OAAO,GAAG,CAAC;AAAA,EACvC;AAAA,EAEQ,mBAA2B;AACjC,UAAM,WAAW,MAAM,KAAK,KAAK,cAAc,OAAO,CAAC,EAAE,IAAI;AAC7D,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,WAAO,KAAK,IAAI,IAAI,SAAS;AAAA,EAC/B;AAAA,EAEQ,eAAe,IAAoB;AACzC,QAAI,KAAK,KAAM;AACb,aAAO,GAAG,EAAE;AAAA,IACd;AACA,WAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAAA,EAClC;AAAA,EAEA,oBAIE;AACA,WAAO;AAAA,MACL,UAAU,KAAK,IAAI,IAAI,KAAK;AAAA,MAC5B,WAAW,KAAK,cAAc;AAAA,MAC9B,WAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,UAAgB;AACtB,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,KAAK;AACxB,WAAK,gBAAgB;AAAA,IACvB;AACA,SAAK,cAAc,MAAM;AAAA,EAC3B;AACF;;;AFrSO,SAAS,oBAA6B;AAC3C,QAAM,OAAO,IAAI,QAAQ,MAAM;AAE/B,OACG,YAAY,uCAAuC,EACnD,SAAS,aAAa,8BAA8B,EACpD,OAAO,sBAAsB,+CAA+C,EAC5E,OAAO,0BAA0B,mCAAmC,EACpE,OAAO,OAAO,SAAiB,YAAyB;AACvD,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,KAAK;AACxC,YAAM,YAAY,QAAQ,SAAS,OAAO;AAE1C,UAAI,CAAC,WAAW;AACd,gBAAQ,MAAMC,OAAM,IAAI,sCAAiC,CAAC;AAC1D,gBAAQ,MAAMA,OAAM,OAAO,8BAA8B,CAAC;AAC1D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,QAAQ,OAAO,OAAO,SAAS;AACrC,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAMA,OAAM,IAAI;AAAA,gBAAc,SAAS,aAAa,CAAC;AAC7D,gBAAQ,MAAMA,OAAM,OAAO,mBAAmB,CAAC;AAC/C,mBAAW,QAAQ,OAAO,KAAK,OAAO,MAAM,GAAG;AAC7C,kBAAQ,MAAMA,OAAM,KAAK,OAAO,IAAI,EAAE,CAAC;AAAA,QACzC;AACA,gBAAQ,MAAM;AACd,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,cAAc;AAAA,QAClB,OAAO;AAAA,QACP,WAAW;AAAA,QACX,eAAe;AAAA,QACf,GAAI,QAAQ,kBAAkB,EAAE,gBAAgB,QAAQ,eAAe;AAAA,MACzE;AAEA,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,OAAO,QAAQ,iBAAiB,MAAM,EAAE;AAAA,QAC3C;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,eAAe,UAAU,MAAM,OAAO;AAAA,UACxC;AAAA,UACA,MAAM,KAAK,UAAU,WAAW;AAAA,QAClC;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,gBAAQ,MAAMA,OAAM,IAAI;AAAA,yBAAuB,SAAS,MAAM,IAAI,GAAG,SAAS;AAC9E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,UAAU,IAAI,cAAc;AAClC,YAAM,WAAW,MAAM,QAAQ,cAAc,QAAQ;AAErD,UAAI,UAAU;AACZ,gBAAQ;AAAA,UACNA,OAAM;AAAA,YACJ;AAAA;AAAA,mBAAwB,SAAS,cAAc;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,IAAI;AAAA,IACd,SAAS,OAAO;AACd,YAAMC,WAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,cAAQ,MAAMD,OAAM,IAAI,uBAAkB,GAAGC,QAAO;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AIjFA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAClB,YAAY,cAAc;;;ACF1B,OAAOC,YAAW;AAGX,IAAM,cAAN,MAAkB;AAAA,EACvB,aAAa,mBACX,aACA,SAC6C;AAC7C,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG,OAAO,iBAAiB,YAAY,EAAE,WAAW;AAAA,QAC/E,SAAS;AAAA,UACP,eAAe,UAAU,YAAY,OAAO;AAAA,QAC9C;AAAA,MACF,CAAC;AAED,UAAI,SAAS,IAAI;AACf,eAAO,EAAE,OAAO,KAAK;AAAA,MACvB;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,eAAO,EAAE,OAAO,OAAO,OAAO,kBAAkB;AAAA,MAClD;AAEA,UAAI,SAAS,WAAW,KAAK;AAC3B,eAAO,EAAE,OAAO,OAAO,OAAO,kBAAkB;AAAA,MAClD;AAEA,aAAO,EAAE,OAAO,OAAO,OAAO,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,GAAG;AAAA,IAClF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,aAAO,EAAE,OAAO,OAAO,OAAO,sBAAsB,OAAO,GAAG;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,OAAO,iBAAiB,OAAqB;AAC3C,YAAQ,MAAMA,OAAM,IAAI,iCAA4B,GAAG,KAAK;AAC5D,YAAQ,MAAMA,OAAM,OAAO,oBAAoB,CAAC;AAChD,YAAQ,MAAMA,OAAM,KAAK,oCAAoC,CAAC;AAC9D,YAAQ,MAAMA,OAAM,KAAK,iCAAiC,CAAC;AAC3D,YAAQ,MAAMA,OAAM,KAAK,wCAAwC,CAAC;AAClE,YAAQ,MAAMA,OAAM,KAAK,8BAA8B,CAAC;AAAA,EAC1D;AACF;;;ADpCO,SAAS,sBAA+B;AAC7C,QAAM,SAAS,IAAIC,SAAQ,QAAQ;AAEnC,SACG,QAAQ,MAAM,EACd,YAAY,wCAAwC,EACpD,OAAO,YAAY;AAClB,YAAQ,IAAIC,OAAM,KAAK,KAAK,mCAA4B,CAAC;AAEzD,UAAM,KAAc,yBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,QAAI;AACF,YAAM,YAAY,MAAM,GAAG;AAAA,QACzBA,OAAM,OAAO,6BAA6B;AAAA,MAC5C;AAEA,UAAI,CAAC,UAAU,KAAK,GAAG;AACrB,gBAAQ,MAAMA,OAAM,IAAI,iCAA4B,CAAC;AACrD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,UAAU,MAAM,GAAG;AAAA,QACvBA,OAAM,OAAO,YAAY;AAAA,MAC3B;AAEA,UAAI,CAAC,QAAQ,KAAK,GAAG;AACnB,gBAAQ,MAAMA,OAAM,IAAI,+BAA0B,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,SAAS,MAAM,GAAG;AAAA,QACtBA,OAAM,OAAO,WAAW;AAAA,MAC1B;AAEA,UAAI,CAAC,OAAO,KAAK,GAAG;AAClB,gBAAQ,MAAMA,OAAM,IAAI,8BAAyB,CAAC;AAClD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,UAAU,MAAM,GAAG;AAAA,QACvBA,OAAM,OAAO,oCAAoC;AAAA,MACnD;AAEA,YAAM,eAAe,QAAQ,KAAK,KAAK;AAEvC,SAAG,MAAM;AAET,YAAM,cAAc;AAAA,QAClB,IAAI,QAAQ,KAAK;AAAA,QACjB,SAAS,OAAO,KAAK;AAAA,QACrB,MAAM,UAAU,KAAK;AAAA,MACvB;AAEA,cAAQ,IAAIA,OAAM,KAAK,mCAA8B,CAAC;AAEtD,YAAM,EAAE,OAAO,MAAM,IAAI,MAAM,YAAY;AAAA,QACzC;AAAA,QACA;AAAA,MACF;AAEA,UAAI,CAAC,OAAO;AACV,oBAAY,iBAAiB,SAAS,eAAe;AACrD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,cAAc,SAAS,UAAU,KAAK,GAAG,WAAW;AAE1D,YAAM,gBAAgB,MAAM,cAAc,KAAK;AAC/C,oBAAc,WAAW;AACzB,YAAM,cAAc,KAAK,aAAa;AAEtC,cAAQ,IAAIA,OAAM,MAAM,4CAAuC,CAAC;AAChE,cAAQ,IAAIA,OAAM,KAAK;AAAA,eAAkB,cAAc,cAAc,CAAC,EAAE,CAAC;AACzE,cAAQ,IAAIA,OAAM,KAAK,kBAAkB,UAAU,KAAK,CAAC,EAAE,CAAC;AAC5D,cAAQ,IAAIA,OAAM,KAAK,6CAA6C,CAAC;AAAA,IACvE,SAAS,OAAO;AACd,SAAG,MAAM;AACT,cAAQ,MAAMA,OAAM,IAAI,wBAAmB,GAAG,KAAK;AACnD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SACG,QAAQ,MAAM,EACd,YAAY,4BAA4B,EACxC,OAAO,YAAY;AAClB,QAAI;AACF,YAAMC,UAAS,MAAM,cAAc,KAAK;AAExC,cAAQ,IAAID,OAAM,KAAK,KAAK,qCAA8B,CAAC;AAC3D,cAAQ,IAAIA,OAAM,OAAO,WAAW,GAAGC,QAAO,QAAQ;AACtD,cAAQ,IAAID,OAAM,OAAO,gBAAgB,GAAGC,QAAO,iBAAiBD,OAAM,KAAK,WAAW,CAAC;AAC3F,cAAQ,IAAIA,OAAM,OAAO,sBAAsB,CAAC;AAEhD,UAAI,OAAO,KAAKC,QAAO,MAAM,EAAE,WAAW,GAAG;AAC3C,gBAAQ,IAAID,OAAM,KAAK,wBAAwB,CAAC;AAAA,MAClD,OAAO;AACL,mBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQC,QAAO,MAAM,GAAG;AACzD,gBAAM,YAAY,SAASA,QAAO;AAClC,gBAAM,SAAS,YAAYD,OAAM,MAAM,QAAG,IAAI;AAC9C,kBAAQ,IAAI,KAAK,MAAM,IAAIA,OAAM,KAAK,IAAI,CAAC,KAAK,MAAM,EAAE,GAAG;AAAA,QAC7D;AAAA,MACF;AAEA,cAAQ,IAAIA,OAAM,KAAK;AAAA,eAAkB,cAAc,cAAc,CAAC;AAAA,CAAI,CAAC;AAAA,IAC7E,SAAS,OAAO;AACd,cAAQ,MAAMA,OAAM,IAAI,+BAA+B,GAAG,KAAK;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AEzHA,SAAS,WAAAE,gBAAe;AACxB,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,YAAYC,eAAc;AAC1B,SAAS,gBAAgB;;;ACJzB,OAAOC,YAAW;AAEX,SAAS,aAAmB;AACjC,UAAQ,IAAI;AACZ,UAAQ,IAAIA,OAAM,IAAI,SAAS,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA,CAIvC,CAAC;AACA,UAAQ,IAAIA,OAAM,KAAK,KAAK,gCAAgC,CAAC;AAC7D,UAAQ,IAAIA,OAAM,KAAK,0BAA0B,CAAC;AAClD,UAAQ,IAAIA,OAAM,KAAK,mLAAkC,CAAC;AAC1D,UAAQ,IAAI;AACd;;;ADJO,SAAS,2BAAoC;AAClD,QAAM,cAAc,IAAIC,SAAQ,aAAa;AAE7C,cACG,YAAY,mCAAmC,EAC/C,OAAO,sBAAsB,+CAA+C,EAC5E,OAAO,OAAO,YAAgC;AAC7C,QAAI;AACF,YAAM,SAAS,MAAM,cAAc,KAAK;AACxC,YAAM,YAAY,QAAQ,SAAS,OAAO;AAE1C,UAAI,CAAC,WAAW;AACd,gBAAQ,MAAMC,OAAM,IAAI,sCAAiC,CAAC;AAC1D,gBAAQ,MAAMA,OAAM,OAAO,8BAA8B,CAAC;AAC1D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,QAAQ,OAAO,OAAO,SAAS;AACrC,UAAI,CAAC,OAAO;AACV,gBAAQ,MAAMA,OAAM,IAAI;AAAA,gBAAc,SAAS,aAAa,CAAC;AAC7D,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,iBAAW;AAEX,cAAQ,IAAIA,OAAM,KAAK,KAAK,2BAAoB,MAAM,IAAI,EAAE,CAAC;AAC7D,cAAQ,IAAIA,OAAM,KAAK,+CAA+C,CAAC;AAEvE,YAAM,iBAAiB,SAAS;AAChC,UAAI,eAAe;AACnB,UAAI,iBAAiB;AACrB,YAAM,mBAAmB,KAAK,IAAI;AAGlC,YAAM,IAAI,QAAc,CAAC,YAAY;AACnC,cAAM,KAAc,0BAAgB;AAAA,UAClC,OAAO,QAAQ;AAAA,UACf,QAAQ,QAAQ;AAAA,UAChB,QAAQA,OAAM,MAAM,IAAI;AAAA,QAC1B,CAAC;AAED,WAAG,OAAO;AAEV,WAAG,GAAG,QAAQ,OAAO,UAAU;AAC/B,gBAAM,UAAU,MAAM,KAAK;AAG3B,cAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,kBAAM,CAAC,SAAS,GAAG,IAAI,IAAI,QAAQ,MAAM,CAAC,EAAE,MAAM,GAAG;AAErD,oBAAQ,QAAQ,YAAY,GAAG;AAAA,cAC7B,KAAK;AAAA,cACL,KAAK;AACH,mBAAG,MAAM;AACT;AAAA,cAEF,KAAK;AACH,wBAAQ,IAAIA,OAAM,KAAK,mCAA4B,CAAC;AACpD,wBAAQ,IAAIA,OAAM,KAAK,oCAAoC,CAAC;AAC5D,wBAAQ,IAAIA,OAAM,KAAK,uCAAuC,CAAC;AAC/D,wBAAQ,IAAIA,OAAM,KAAK,iDAAiD,CAAC;AACzE,wBAAQ,IAAIA,OAAM,KAAK,kDAAkD,CAAC;AAC1E,wBAAQ,IAAIA,OAAM,KAAK,+CAA+C,CAAC;AACvE,mBAAG,OAAO;AACV;AAAA,cAEF,KAAK;AACH,wBAAQ,MAAM;AACd,2BAAW;AACX,wBAAQ,IAAIA,OAAM,KAAK,KAAK,2BAAoB,MAAM,IAAI,EAAE,CAAC;AAC7D,wBAAQ,IAAIA,OAAM,KAAK,+CAA+C,CAAC;AACvE,mBAAG,OAAO;AACV;AAAA,cAEF,KAAK;AACH,wBAAQ,IAAIA,OAAM,KAAK,0CAAgC,CAAC;AACxD,wBAAQ,IAAIA,OAAM,KAAK,YAAY,MAAM,IAAI,KAAK,MAAM,EAAE,GAAG,CAAC;AAC9D,wBAAQ,IAAIA,OAAM,KAAK,eAAe,OAAO,QAAQ,EAAE,CAAC;AACxD,wBAAQ,IAAIA,OAAM,KAAK,sBAAsB,cAAc;AAAA,CAAI,CAAC;AAChE,mBAAG,OAAO;AACV;AAAA,cAEF,KAAK;AACH,oBAAI,CAAC,KAAK,CAAC,GAAG;AACZ,0BAAQ,IAAIA,OAAM,IAAI,uCAAkC,CAAC;AACzD,0BAAQ,IAAIA,OAAM,OAAO,mBAAmB,CAAC;AAC7C,yBAAO,KAAK,OAAO,MAAM,EAAE,QAAQ,UAAQ;AACzC,4BAAQ,IAAIA,OAAM,KAAK,OAAO,IAAI,EAAE,CAAC;AAAA,kBACvC,CAAC;AACD,0BAAQ,IAAI,EAAE;AACd,qBAAG,OAAO;AACV;AAAA,gBACF;AAEA,wBAAQ,IAAIA,OAAM,OAAO,uDAA6C,CAAC;AACvE,mBAAG,OAAO;AACV;AAAA,cAEF;AACE,wBAAQ,IAAIA,OAAM,IAAI;AAAA,2BAAyB,OAAO,EAAE,CAAC;AACzD,wBAAQ,IAAIA,OAAM,OAAO,qCAAqC,CAAC;AAC/D,mBAAG,OAAO;AACV;AAAA,YACJ;AAAA,UACF;AAGA,cAAI,YAAY,UAAU,YAAY,QAAQ;AAC5C,eAAG,MAAM;AACT;AAAA,UACF;AAEA,cAAI,CAAC,SAAS;AACZ,eAAG,OAAO;AACV;AAAA,UACF;AAEA,cAAI;AACF;AAGA,oBAAQ,IAAI,EAAE;AACd,kBAAM,eAAeC,KAAI;AAAA,cACvB,MAAMD,OAAM,KAAK,aAAa;AAAA,cAC9B,OAAO;AAAA,YACT,CAAC,EAAE,MAAM;AAET,kBAAM,WAAW,MAAM;AAAA,cACrB,GAAG,OAAO,QAAQ,iBAAiB,MAAM,EAAE;AAAA,cAC3C;AAAA,gBACE,QAAQ;AAAA,gBACR,SAAS;AAAA,kBACP,gBAAgB;AAAA,kBAChB,eAAe,UAAU,MAAM,OAAO;AAAA,gBACxC;AAAA,gBACA,MAAM,KAAK,UAAU;AAAA,kBACnB,OAAO;AAAA,kBACP,WAAW;AAAA,kBACX,eAAe;AAAA,kBACf;AAAA,gBACF,CAAC;AAAA,cACH;AAAA,YACF;AAGA,yBAAa,KAAK;AAElB,gBAAI,CAAC,SAAS,IAAI;AAChB,kBAAI,eAAe,mBAAmB,SAAS,MAAM;AACrD,kBAAI;AACF,sBAAM,YAAY,MAAM,SAAS,KAAK;AACtC,+BAAe,UAAU,SAAS,UAAU,WAAW;AAAA,cACzD,QAAQ;AACN,sBAAM,YAAY,MAAM,SAAS,KAAK;AACtC,+BAAe,aAAa;AAAA,cAC9B;AAEA,sBAAQ,MAAMA,OAAM,IAAI,iBAAY,GAAG,YAAY;AAGnD,kBAAI,SAAS,WAAW,KAAK;AAC3B,wBAAQ,IAAIA,OAAM,OAAO,0CAA0C,CAAC;AAAA,cACtE,WAAW,SAAS,WAAW,KAAK;AAClC,wBAAQ,IAAIA,OAAM,OAAO,mDAAmD,CAAC;AAAA,cAC/E,WAAW,SAAS,WAAW,KAAK;AAClC,wBAAQ,IAAIA,OAAM,OAAO,8CAA8C,CAAC;AAAA,cAC1E;AAEA,sBAAQ,IAAI,EAAE;AACd,iBAAG,OAAO;AACV;AAAA,YACF;AAEA,kBAAM,UAAU,IAAI,cAAc;AAClC,kBAAM,QAAQ,cAAc,QAAQ;AAGpC,kBAAM,UAAU,QAAQ,kBAAkB;AAC1C,8BAAkB,QAAQ;AAE1B,oBAAQ,IAAI,IAAI;AAChB,eAAG,OAAO;AAAA,UACZ,SAAS,OAAO;AACd,gBAAI,UAAU;AACd,gBAAI,OAAO;AAEX,gBAAI,iBAAiB,OAAO;AAC1B,wBAAU,MAAM;AAGhB,kBAAI,QAAQ,SAAS,cAAc,GAAG;AACpC,uBAAO;AAAA,cACT,WAAW,QAAQ,SAAS,WAAW,GAAG;AACxC,uBAAO;AAAA,cACT,WAAW,QAAQ,SAAS,WAAW,GAAG;AACxC,uBAAO;AAAA,cACT,WAAW,QAAQ,SAAS,aAAa,KAAK,QAAQ,SAAS,KAAK,GAAG;AACrE,uBAAO;AAAA,cACT,WAAW,QAAQ,SAAS,cAAc,GAAG;AAC3C,uBAAO;AAAA,cACT;AAAA,YACF;AAEA,oBAAQ,MAAMA,OAAM,IAAI,iBAAY,GAAG,OAAO;AAC9C,gBAAI,MAAM;AACR,sBAAQ,IAAIA,OAAM,OAAO,WAAW,IAAI,EAAE,CAAC;AAAA,YAC7C;AACA,oBAAQ,IAAI,EAAE;AACd,eAAG,OAAO;AAAA,UACZ;AAAA,QACF,CAAC;AAEC,WAAG,GAAG,SAAS,MAAM;AACnB,gBAAM,kBAAkB,KAAK,IAAI,IAAI;AACrC,gBAAM,kBAAkB,KAAK,MAAM,kBAAkB,GAAK;AAC1D,gBAAM,kBAAkB,KAAK,MAAO,kBAAkB,MAAS,GAAI;AAEnE,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAIA,OAAM,KAAK,SAAI,OAAO,EAAE,CAAC,CAAC;AACtC,kBAAQ,IAAIA,OAAM,KAAK,KAAK,6BAAsB,CAAC;AACnD,kBAAQ,IAAIA,OAAM,KAAK,eAAe,YAAY,EAAE,CAAC;AACrD,kBAAQ,IAAIA,OAAM,KAAK,iBAAiB,cAAc,EAAE,CAAC;AACzD,kBAAQ,IAAIA,OAAM,KAAK,eAAe,eAAe,KAAK,eAAe,GAAG,CAAC;AAC7E,kBAAQ,IAAIA,OAAM,KAAK,sBAAsB,cAAc,EAAE,CAAC;AAE9D,cAAI,eAAe,GAAG;AACpB,oBAAQ,IAAIA,OAAM,KAAK,uCAAgC,CAAC;AACxD,oBAAQ,IAAIA,OAAM,OAAO,wBAAwB,eAAe,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AAAA,UAChF;AAEA,kBAAQ,IAAIA,OAAM,KAAK,WAAM,OAAO,EAAE,CAAC,CAAC;AACxC,kBAAQ,IAAIA,OAAM,KAAK,wBAAiB,CAAC;AAGzC,kBAAQ;AAAA,QACV,CAAC;AAAA,MACH,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,cAAQ,MAAMA,OAAM,IAAI,mCAA8B,GAAG,OAAO;AAChE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AE/PA,OAAOE,YAAW;AAIlB,eAAsB,YAA2B;AAC/C,MAAI;AAEF,UAAM,SAAS,MAAM,cAAc,KAAK;AAGxC,QAAI,CAAC,OAAO,iBAAiB,CAAC,OAAO,OAAO,OAAO,aAAa,GAAG;AAEjE,iBAAW;AACX,cAAQ,IAAIC,OAAM,KAAK,uCAAgC,CAAC;AACxD,cAAQ,IAAIA,OAAM,OAAO,uCAAuC,CAAC;AACjE,cAAQ,IAAIA,OAAM,MAAM,2BAA2B,CAAC;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EAKF,SAAS,OAAO;AAEd,eAAW;AACX,YAAQ,IAAIA,OAAM,KAAK,uCAAgC,CAAC;AACxD,YAAQ,IAAIA,OAAM,OAAO,uCAAuC,CAAC;AACjE,YAAQ,IAAIA,OAAM,MAAM,2BAA2B,CAAC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ATvBA,IAAM,UAAU,IAAIC,SAAQ;AAE5B,QACG,KAAK,WAAW,EAChB,YAAY,4CAA4C,EACxD,QAAQ,OAAO;AAElB,QAAQ,WAAW,kBAAkB,CAAC;AACtC,QAAQ,WAAW,oBAAoB,CAAC;AACxC,QAAQ,WAAW,yBAAyB,CAAC;AAE7C,QAAQ,GAAG,aAAa,MAAM;AAC5B,UAAQ,MAAMC,OAAM,IAAI,0BAAqB,CAAC;AAC9C,UAAQ,IAAIA,OAAM,OAAO,uBAAuB,CAAC;AACjD,UAAQ,IAAIA,OAAM,KAAK,yDAAyD,CAAC;AACjF,UAAQ,IAAIA,OAAM,KAAK,2DAA2D,CAAC;AACnF,UAAQ,IAAIA,OAAM,KAAK,0DAA0D,CAAC;AAClF,UAAQ,IAAIA,OAAM,KAAK,4DAA4D,CAAC;AACpF,UAAQ,IAAIA,OAAM,KAAK,6CAA6C,CAAC;AACrE,UAAQ,KAAK,CAAC;AAChB,CAAC;AAGD,eAAe,OAAO;AAEpB,MAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,QAAQ;AACjC,UAAM,UAAU;AAEhB,YAAQ,KAAK,KAAK,aAAa;AAAA,EACjC;AAEA,QAAM,QAAQ,WAAW,QAAQ,IAAI;AACvC;AAGA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,MAAMA,OAAM,IAAI,uBAAkB,GAAG,MAAM,OAAO;AAC1D,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["Command","chalk","chalk","chalk","chalk","chalk","message","Command","chalk","chalk","Command","chalk","config","Command","chalk","ora","readline","chalk","Command","chalk","ora","chalk","chalk","Command","chalk"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@horneross/cli",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "Terminal interface for Horneross AI agents",
5
5
  "type": "module",
6
6
  "bin": {