@horneross/cli 0.3.0 → 0.4.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
@@ -174,10 +174,14 @@ var StreamAdapter = class {
174
174
  metadata = null;
175
175
  isThinking = false;
176
176
  hasOutputText = false;
177
+ toolsExecuted = [];
178
+ sessionStartTime = Date.now();
177
179
  async processStream(response) {
178
180
  if (!response.body) {
179
181
  throw new Error("Response body is null");
180
182
  }
183
+ this.isThinking = true;
184
+ process.stdout.write(chalk.gray("\u{1F914} Thinking...\n"));
181
185
  const reader = response.body.getReader();
182
186
  const decoder = new TextDecoder();
183
187
  return new Promise((resolve, reject) => {
@@ -248,11 +252,9 @@ var StreamAdapter = class {
248
252
  this.activeSpinner.stop();
249
253
  this.activeSpinner = null;
250
254
  }
251
- if (this.isThinking) {
255
+ if (this.isThinking && !this.hasOutputText) {
256
+ process.stdout.write("\x1B[1A\x1B[2K");
252
257
  this.isThinking = false;
253
- if (!this.hasOutputText) {
254
- process.stdout.write("\n");
255
- }
256
258
  }
257
259
  if (event.content) {
258
260
  this.hasOutputText = true;
@@ -269,21 +271,28 @@ var StreamAdapter = class {
269
271
  if (this.activeSpinner) {
270
272
  this.activeSpinner.stop();
271
273
  }
274
+ if (this.isThinking) {
275
+ process.stdout.write("\x1B[1A\x1B[2K");
276
+ this.isThinking = false;
277
+ }
272
278
  if (this.hasOutputText) {
273
279
  process.stdout.write("\n");
274
280
  }
275
281
  const argsPreview = this.formatArgs(args);
276
282
  const toolIcon = this.getToolIcon(toolName);
277
283
  this.activeSpinner = ora({
278
- text: chalk.cyan(`${toolIcon} ${toolName}${argsPreview}`),
279
- prefixText: this.hasOutputText ? "" : "\n"
284
+ text: chalk.cyan(`${toolIcon} ${toolName}${argsPreview}`)
280
285
  }).start();
281
286
  }
282
287
  handleToolResult(event) {
283
288
  if (this.activeSpinner) {
284
289
  const { toolName } = event;
285
- const elapsed = this.getElapsedTime();
290
+ const elapsedMs = this.getElapsedTimeMs();
291
+ const elapsed = this.formatDuration(elapsedMs);
286
292
  const toolIcon = this.getToolIcon(toolName);
293
+ if (toolName) {
294
+ this.toolsExecuted.push({ name: toolName, duration: elapsedMs });
295
+ }
287
296
  this.activeSpinner.succeed(
288
297
  chalk.green(`${toolIcon} ${toolName} ${chalk.gray(`(${elapsed})`)}`)
289
298
  );
@@ -364,13 +373,25 @@ var StreamAdapter = class {
364
373
  }).join(", ");
365
374
  return ` ${chalk.gray(`(${preview})`)}`;
366
375
  }
367
- getElapsedTime() {
376
+ getElapsedTimeMs() {
368
377
  const lastTool = Array.from(this.toolCallStack.values()).pop();
369
378
  if (!lastTool) {
370
- return "0s";
379
+ return 0;
380
+ }
381
+ return Date.now() - lastTool.startTime;
382
+ }
383
+ formatDuration(ms) {
384
+ if (ms < 1e3) {
385
+ return `${ms}ms`;
371
386
  }
372
- const elapsed = Date.now() - lastTool.startTime;
373
- return elapsed < 1e3 ? `${elapsed}ms` : `${(elapsed / 1e3).toFixed(1)}s`;
387
+ return `${(ms / 1e3).toFixed(1)}s`;
388
+ }
389
+ getSessionSummary() {
390
+ return {
391
+ duration: Date.now() - this.sessionStartTime,
392
+ toolsUsed: this.toolsExecuted.length,
393
+ toolsList: this.toolsExecuted
394
+ };
374
395
  }
375
396
  cleanup() {
376
397
  if (this.activeSpinner) {
@@ -588,6 +609,7 @@ init_esm_shims();
588
609
  init_config_manager();
589
610
  import { Command as Command3 } from "commander";
590
611
  import chalk6 from "chalk";
612
+ import ora2 from "ora";
591
613
  import * as readline2 from "readline";
592
614
  import { createId } from "@paralleldrive/cuid2";
593
615
  init_banner();
@@ -613,6 +635,8 @@ function createInteractiveCommand() {
613
635
  console.log(chalk6.gray("Commands: /help /exit /clear /agent /config\n"));
614
636
  const conversationId = createId();
615
637
  let messageCount = 0;
638
+ let totalToolsUsed = 0;
639
+ const sessionStartTime = Date.now();
616
640
  const rl = readline2.createInterface({
617
641
  input: process.stdin,
618
642
  output: process.stdout,
@@ -687,6 +711,11 @@ function createInteractiveCommand() {
687
711
  }
688
712
  try {
689
713
  messageCount++;
714
+ console.log("");
715
+ const startSpinner = ora2({
716
+ text: chalk6.gray("Starting..."),
717
+ color: "gray"
718
+ }).start();
690
719
  const response = await fetch(
691
720
  `${config.base_url}/api/v2/agent/${agent.id}/chat`,
692
721
  {
@@ -703,29 +732,76 @@ function createInteractiveCommand() {
703
732
  })
704
733
  }
705
734
  );
735
+ startSpinner.stop();
706
736
  if (!response.ok) {
707
- const errorText = await response.text();
708
- console.error(chalk6.red(`
709
- \u2716 Request failed (${response.status}):`), errorText);
737
+ let errorMessage = `Request failed (${response.status})`;
738
+ try {
739
+ const errorData = await response.json();
740
+ errorMessage = errorData.error || errorData.message || errorMessage;
741
+ } catch {
742
+ const errorText = await response.text();
743
+ errorMessage = errorText || errorMessage;
744
+ }
745
+ console.error(chalk6.red("\n\u2716 Error:"), errorMessage);
746
+ if (response.status === 401) {
747
+ console.log(chalk6.yellow(" Hint: Check your API key configuration"));
748
+ } else if (response.status === 429) {
749
+ console.log(chalk6.yellow(" Hint: Rate limit exceeded, please wait a moment"));
750
+ } else if (response.status === 500) {
751
+ console.log(chalk6.yellow(" Hint: Server error, please try again later"));
752
+ }
753
+ console.log("");
710
754
  rl.prompt();
711
755
  return;
712
756
  }
713
757
  const adapter = new StreamAdapter();
714
758
  await adapter.processStream(response);
759
+ const summary = adapter.getSessionSummary();
760
+ totalToolsUsed += summary.toolsUsed;
715
761
  console.log("\n");
716
762
  rl.prompt();
717
763
  } catch (error) {
718
- const message = error instanceof Error ? error.message : "Unknown error";
764
+ let message = "Unknown error";
765
+ let hint = "";
766
+ if (error instanceof Error) {
767
+ message = error.message;
768
+ if (message.includes("ECONNREFUSED")) {
769
+ hint = "Cannot connect to server. Is the Horneross backend running?";
770
+ } else if (message.includes("ENOTFOUND")) {
771
+ hint = "Cannot resolve hostname. Check your base_url configuration.";
772
+ } else if (message.includes("ETIMEDOUT")) {
773
+ hint = "Connection timed out. Check your network connection.";
774
+ } else if (message.includes("certificate") || message.includes("SSL")) {
775
+ hint = "SSL/TLS error. Check your certificates or try http:// instead of https://.";
776
+ } else if (message.includes("fetch failed")) {
777
+ hint = "Network request failed. Check your internet connection and base_url.";
778
+ }
779
+ }
719
780
  console.error(chalk6.red("\n\u2716 Error:"), message);
781
+ if (hint) {
782
+ console.log(chalk6.yellow(` Hint: ${hint}`));
783
+ }
784
+ console.log("");
720
785
  rl.prompt();
721
786
  }
722
787
  });
723
788
  rl.on("close", () => {
724
- console.log(
725
- chalk6.gray(`
726
- Session ended. ${messageCount} messages exchanged.
727
- `)
728
- );
789
+ const sessionDuration = Date.now() - sessionStartTime;
790
+ const durationMinutes = Math.floor(sessionDuration / 6e4);
791
+ const durationSeconds = Math.floor(sessionDuration % 6e4 / 1e3);
792
+ console.log("");
793
+ console.log(chalk6.blue("\u2501".repeat(50)));
794
+ console.log(chalk6.bold.cyan("\n\u{1F4CA} Session Summary"));
795
+ console.log(chalk6.gray(` Messages: ${messageCount}`));
796
+ console.log(chalk6.gray(` Tools used: ${totalToolsUsed}`));
797
+ console.log(chalk6.gray(` Duration: ${durationMinutes}m ${durationSeconds}s`));
798
+ console.log(chalk6.gray(` Conversation ID: ${conversationId}`));
799
+ if (messageCount > 0) {
800
+ console.log(chalk6.blue("\n\u{1F4A1} Resume this conversation:"));
801
+ console.log(chalk6.yellow(` horneross --resume ${conversationId.slice(0, 8)}`));
802
+ }
803
+ console.log(chalk6.blue("\n\u2501".repeat(50)));
804
+ console.log(chalk6.gray("\nGoodbye! \u{1F44B}\n"));
729
805
  process.exit(0);
730
806
  });
731
807
  } catch (error) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_tsx@3.14.0_typescript@5.9.3_yaml@2.8.1/node_modules/tsup/assets/esm_shims.js","../src/config/config-manager.ts","../src/utils/banner.ts","../src/utils/auto-start.ts","../src/index.ts","../src/commands/chat.ts","../src/adapters/stream-adapter.ts","../src/commands/config.ts","../src/auth/auth-manager.ts","../src/commands/interactive.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\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 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 { execSync } from 'child_process';\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 - run config init\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Let\\'s set up your first agent.\\n'));\n\n // Run config init\n execSync('horneross config init', { stdio: 'inherit' });\n return;\n }\n\n // Configuration exists - start interactive mode\n execSync('horneross interactive', { stdio: 'inherit' });\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. Let\\'s set up your first agent.\\n'));\n\n try {\n execSync('horneross config init', { stdio: 'inherit' });\n } catch (initError) {\n console.error(chalk.red('\\n✖ Configuration failed'));\n process.exit(1);\n }\n }\n}\n","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';\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// Auto-start interactive mode when no command is provided\nif (!process.argv.slice(2).length) {\n // Import dynamically to avoid circular dependencies\n import('./utils/auto-start.js').then(({ autoStart }) => {\n autoStart();\n });\n} else {\n program.parse(process.argv);\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 { createParser } from 'eventsource-parser';\nimport ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\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\n async processStream(response: Response): Promise<StreamMetadata | null> {\n if (!response.body) {\n throw new Error('Response body is null');\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 // Stop thinking indicator\n if (this.isThinking) {\n this.isThinking = false;\n if (!this.hasOutputText) {\n process.stdout.write('\\n');\n }\n }\n\n if (event.content) {\n this.hasOutputText = true;\n process.stdout.write(event.content);\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 // 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 prefixText: this.hasOutputText ? '' : '\\n',\n }).start();\n }\n\n private handleToolResult(event: SSEEvent): void {\n if (this.activeSpinner) {\n const { toolName } = event;\n const elapsed = this.getElapsedTime();\n const toolIcon = this.getToolIcon(toolName);\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 getElapsedTime(): string {\n const lastTool = Array.from(this.toolCallStack.values()).pop();\n if (!lastTool) {\n return '0s';\n }\n\n const elapsed = Date.now() - lastTool.startTime;\n return elapsed < 1000 ? `${elapsed}ms` : `${(elapsed / 1000).toFixed(1)}s`;\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 { 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 * 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\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 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 if (!response.ok) {\n const errorText = await response.text();\n console.error(chalk.red(`\\n✖ Request failed (${response.status}):`), errorText);\n rl.prompt();\n return;\n }\n\n const adapter = new StreamAdapter();\n await adapter.processStream(response);\n\n console.log('\\n');\n rl.prompt();\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error(chalk.red('\\n✖ Error:'), message);\n rl.prompt();\n }\n });\n\n rl.on('close', () => {\n console.log(\n chalk.gray(`\\nSession ended. ${messageCount} messages exchanged.\\n`)\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"],"mappings":"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","names":["chalk","chalk","Command","chalk","chalk","chalk","message","Command","chalk","chalk","Command","chalk","config","Command","chalk","readline","Command","chalk","Command","chalk","autoStart"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_tsx@3.14.0_typescript@5.9.3_yaml@2.8.1/node_modules/tsup/assets/esm_shims.js","../src/config/config-manager.ts","../src/utils/banner.ts","../src/utils/auto-start.ts","../src/index.ts","../src/commands/chat.ts","../src/adapters/stream-adapter.ts","../src/commands/config.ts","../src/auth/auth-manager.ts","../src/commands/interactive.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\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 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 { execSync } from 'child_process';\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 - run config init\n showBanner();\n console.log(chalk.cyan('👋 Welcome to Horneross CLI!\\n'));\n console.log(chalk.yellow('No configuration found. Let\\'s set up your first agent.\\n'));\n\n // Run config init\n execSync('horneross config init', { stdio: 'inherit' });\n return;\n }\n\n // Configuration exists - start interactive mode\n execSync('horneross interactive', { stdio: 'inherit' });\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. Let\\'s set up your first agent.\\n'));\n\n try {\n execSync('horneross config init', { stdio: 'inherit' });\n } catch (initError) {\n console.error(chalk.red('\\n✖ Configuration failed'));\n process.exit(1);\n }\n }\n}\n","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';\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// Auto-start interactive mode when no command is provided\nif (!process.argv.slice(2).length) {\n // Import dynamically to avoid circular dependencies\n import('./utils/auto-start.js').then(({ autoStart }) => {\n autoStart();\n });\n} else {\n program.parse(process.argv);\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 { createParser } from 'eventsource-parser';\nimport ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\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 if (event.content) {\n this.hasOutputText = true;\n process.stdout.write(event.content);\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 { 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"],"mappings":"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","names":["chalk","chalk","Command","chalk","chalk","chalk","message","Command","chalk","chalk","Command","chalk","config","Command","chalk","ora","readline","Command","chalk","ora","Command","chalk","autoStart"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@horneross/cli",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Terminal interface for Horneross AI agents",
5
5
  "type": "module",
6
6
  "bin": {