@horneross/cli 0.5.2 → 0.6.0

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
@@ -3,6 +3,9 @@
3
3
  // src/index.ts
4
4
  import { Command as Command4 } from "commander";
5
5
  import chalk9 from "chalk";
6
+ import { readFileSync } from "fs";
7
+ import { fileURLToPath } from "url";
8
+ import { dirname, join as join2 } from "path";
6
9
 
7
10
  // src/commands/chat.ts
8
11
  import { Command } from "commander";
@@ -535,7 +538,7 @@ import { createId } from "@paralleldrive/cuid2";
535
538
 
536
539
  // src/utils/banner.ts
537
540
  import chalk6 from "chalk";
538
- function showBanner() {
541
+ function showBanner(version) {
539
542
  console.log();
540
543
  console.log(chalk6.hex("#FF8800").bold(`
541
544
  \u2566 \u2566\u2554\u2550\u2557\u2566\u2550\u2557\u2554\u2557\u2554\u2554\u2550\u2557\u2566\u2550\u2557\u2554\u2550\u2557\u2554\u2550\u2557\u2554\u2550\u2557
@@ -543,13 +546,16 @@ function showBanner() {
543
546
  \u2569 \u2569\u255A\u2550\u255D\u2569\u255A\u2550\u255D\u255A\u255D\u255A\u2550\u255D\u2569\u255A\u2550\u255A\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u255D
544
547
  `));
545
548
  console.log(chalk6.gray.bold(" Terminal AI Agent Interface"));
549
+ if (version) {
550
+ console.log(chalk6.gray(` v${version}`));
551
+ }
546
552
  console.log(chalk6.gray(" https://horneross.com"));
547
553
  console.log(chalk6.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
548
554
  console.log();
549
555
  }
550
556
 
551
557
  // src/commands/interactive.ts
552
- function createInteractiveCommand() {
558
+ function createInteractiveCommand(version) {
553
559
  const interactive = new Command3("interactive");
554
560
  interactive.description("Start an interactive chat session").option("-a, --agent <name>", "Agent to use (defaults to configured default)").action(async (options) => {
555
561
  try {
@@ -566,7 +572,7 @@ function createInteractiveCommand() {
566
572
  \u2716 Agent "${agentName}" not found`));
567
573
  process.exit(1);
568
574
  }
569
- showBanner();
575
+ showBanner(version);
570
576
  console.log(chalk7.bold.cyan(`\u{1F916} Chatting with ${agent.name}`));
571
577
  console.log(chalk7.gray("Commands: /help /exit /clear /agent /config\n"));
572
578
  const conversationId = createId();
@@ -600,7 +606,7 @@ function createInteractiveCommand() {
600
606
  return;
601
607
  case "clear":
602
608
  console.clear();
603
- showBanner();
609
+ showBanner(version);
604
610
  console.log(chalk7.bold.cyan(`\u{1F916} Chatting with ${agent.name}`));
605
611
  console.log(chalk7.gray("Commands: /help /exit /clear /agent /config\n"));
606
612
  rl.prompt();
@@ -750,18 +756,18 @@ function createInteractiveCommand() {
750
756
 
751
757
  // src/utils/auto-start.ts
752
758
  import chalk8 from "chalk";
753
- async function autoStart() {
759
+ async function autoStart(version) {
754
760
  try {
755
761
  const config = await ConfigManager.load();
756
762
  if (!config.default_agent || !config.agents[config.default_agent]) {
757
- showBanner();
763
+ showBanner(version);
758
764
  console.log(chalk8.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
759
765
  console.log(chalk8.yellow("No configuration found. Please run:\n"));
760
766
  console.log(chalk8.white(" horneross config init\n"));
761
767
  process.exit(0);
762
768
  }
763
769
  } catch (error) {
764
- showBanner();
770
+ showBanner(version);
765
771
  console.log(chalk8.cyan("\u{1F44B} Welcome to Horneross CLI!\n"));
766
772
  console.log(chalk8.yellow("No configuration found. Please run:\n"));
767
773
  console.log(chalk8.white(" horneross config init\n"));
@@ -770,11 +776,17 @@ async function autoStart() {
770
776
  }
771
777
 
772
778
  // src/index.ts
779
+ var __filename2 = fileURLToPath(import.meta.url);
780
+ var __dirname2 = dirname(__filename2);
781
+ var packageJson = JSON.parse(
782
+ readFileSync(join2(__dirname2, "../package.json"), "utf-8")
783
+ );
784
+ var VERSION = packageJson.version;
773
785
  var program = new Command4();
774
- program.name("horneross").description("Terminal interface for Horneross AI agents").version("0.1.0");
786
+ program.name("horneross").description("Terminal interface for Horneross AI agents").version(VERSION);
775
787
  program.addCommand(createChatCommand());
776
788
  program.addCommand(createConfigCommand());
777
- program.addCommand(createInteractiveCommand());
789
+ program.addCommand(createInteractiveCommand(VERSION));
778
790
  program.on("command:*", () => {
779
791
  console.error(chalk9.red("\n\u2716 Invalid command"));
780
792
  console.log(chalk9.yellow("\nAvailable commands:"));
@@ -787,7 +799,7 @@ program.on("command:*", () => {
787
799
  });
788
800
  async function main() {
789
801
  if (!process.argv.slice(2).length) {
790
- await autoStart();
802
+ await autoStart(VERSION);
791
803
  process.argv.push("interactive");
792
804
  }
793
805
  await program.parseAsync(process.argv);
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 // 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":"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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 { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\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\n// Read version from package.json\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '../package.json'), 'utf-8')\n);\nconst VERSION = packageJson.version;\n\nconst program = new Command();\n\nprogram\n .name('horneross')\n .description('Terminal interface for Horneross AI agents')\n .version(VERSION);\n\nprogram.addCommand(createChatCommand());\nprogram.addCommand(createConfigCommand());\nprogram.addCommand(createInteractiveCommand(VERSION));\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(VERSION);\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(version?: string): 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(version);\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(version);\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(version?: string): 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 if (version) {\n console.log(chalk.gray(` v${version}`));\n }\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(version?: string): 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(version);\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(version);\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","join","chalk","chalk","chalk","chalk","message","Command","chalk","chalk","Command","chalk","config","Command","chalk","ora","readline","chalk","Command","chalk","ora","chalk","chalk","__filename","__dirname","join","Command","chalk"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@horneross/cli",
3
- "version": "0.5.2",
3
+ "version": "0.6.0",
4
4
  "description": "Terminal interface for Horneross AI agents",
5
5
  "type": "module",
6
6
  "bin": {