helix-assistant-cli 0.2.7 → 0.2.9

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.
@@ -42,6 +42,7 @@ export declare class AgentClient extends EventEmitter {
42
42
  getProviders(): Promise<ProviderSummary[]>;
43
43
  getModels(requirements?: Record<string, unknown>): Promise<ModelSummary[]>;
44
44
  getSettings(): Promise<HelixSettings>;
45
+ getCapabilities(): Promise<Record<string, unknown>>;
45
46
  saveSettings(settings: Partial<HelixSettings>): Promise<HelixSettings>;
46
47
  validateKey(provider: string, slot: number, key: string): Promise<string>;
47
48
  getSkills(): Promise<SkillSummary[]>;
@@ -265,6 +265,9 @@ class AgentClient extends events_1.EventEmitter {
265
265
  async getSettings() {
266
266
  return this.request('GET_SETTINGS', {});
267
267
  }
268
+ async getCapabilities() {
269
+ return this.request('GET_CAPABILITIES', {});
270
+ }
268
271
  async saveSettings(settings) {
269
272
  return this.request('SAVE_SETTINGS', { settings });
270
273
  }
@@ -0,0 +1,4 @@
1
+ import type { AgentClient } from '../client/agent-client';
2
+ export declare function handleProviders(client: AgentClient): Promise<void>;
3
+ export declare function handleCapabilities(client: AgentClient): Promise<void>;
4
+ export declare function handleSettings(client: AgentClient): Promise<void>;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleProviders = handleProviders;
4
+ exports.handleCapabilities = handleCapabilities;
5
+ exports.handleSettings = handleSettings;
6
+ const colors_1 = require("../ui/colors");
7
+ async function handleProviders(client) {
8
+ try {
9
+ const providers = await client.getProviders();
10
+ console.log(`\n${(0, colors_1.BOLD)('🧠 Proveedores configurados:')}\n`);
11
+ for (const provider of providers) {
12
+ const state = provider.configured ? (0, colors_1.GREEN)('configurado') : (0, colors_1.GRAY)('sin clave');
13
+ console.log(` ${(0, colors_1.CYAN)(provider.name || provider.id)} [${state}] ${(0, colors_1.DIM)(`${provider.models_available} modelos`)}`);
14
+ for (const key of provider.keys || []) {
15
+ console.log(` ${(0, colors_1.DIM)(`slot ${key.slot}:`)} ${key.configured ? (0, colors_1.GREEN)(key.health) : (0, colors_1.GRAY)('vacío')} ${key.masked || ''}`);
16
+ }
17
+ }
18
+ console.log('');
19
+ }
20
+ catch (err) {
21
+ console.log((0, colors_1.RED)(` Error consultando proveedores: ${err.message}\n`));
22
+ }
23
+ }
24
+ async function handleCapabilities(client) {
25
+ try {
26
+ const caps = await client.getCapabilities();
27
+ console.log(`\n${(0, colors_1.BOLD)('⚙ Capacidades activas:')}\n`);
28
+ for (const [key, value] of Object.entries(caps)) {
29
+ const rendered = typeof value === 'boolean' ? (value ? (0, colors_1.GREEN)('activo') : (0, colors_1.YELLOW)('inactivo')) : (0, colors_1.CYAN)(String(value));
30
+ console.log(` ${(0, colors_1.DIM)(key.padEnd(24))} ${rendered}`);
31
+ }
32
+ console.log('');
33
+ }
34
+ catch (err) {
35
+ console.log((0, colors_1.RED)(` Error consultando capacidades: ${err.message}\n`));
36
+ }
37
+ }
38
+ async function handleSettings(client) {
39
+ try {
40
+ const settings = await client.getSettings();
41
+ const safe = Object.fromEntries(Object.entries(settings).filter(([key]) => !/key|token|secret|password|auth/i.test(key)));
42
+ console.log(`\n${(0, colors_1.BOLD)('📋 Configuración efectiva (sin secretos):')}\n${JSON.stringify(safe, null, 2)}\n`);
43
+ }
44
+ catch (err) {
45
+ console.log((0, colors_1.RED)(` Error consultando configuración: ${err.message}\n`));
46
+ }
47
+ }
@@ -1,3 +1,4 @@
1
1
  import type { AgentClient } from '../client/agent-client';
2
+ export declare function handleMcpDefaults(): void;
2
3
  export declare function handleListMcp(client: AgentClient): Promise<void>;
3
4
  export declare function handleCreateMcp(client: AgentClient): Promise<void>;
@@ -3,11 +3,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.handleMcpDefaults = handleMcpDefaults;
6
7
  exports.handleListMcp = handleListMcp;
7
8
  exports.handleCreateMcp = handleCreateMcp;
8
9
  const prompts_1 = __importDefault(require("prompts"));
9
10
  const chalk_1 = __importDefault(require("chalk"));
10
11
  const colors_1 = require("../ui/colors");
12
+ const mcp_defaults_1 = require("../config/mcp-defaults");
13
+ function handleMcpDefaults() {
14
+ console.log(`\n${(0, colors_1.BOLD)('📦 MCPs recomendados (catálogo, no activados automáticamente):')}\n`);
15
+ for (const item of mcp_defaults_1.MCP_DEFAULTS) {
16
+ console.log(` ${(0, colors_1.CYAN_BOLD)('◈')} ${(0, colors_1.formatMcp)(item.id)} — ${item.label}`);
17
+ console.log(` ${(0, colors_1.DIM)(item.purpose)} | ${item.activation} | ${item.privacy}`);
18
+ }
19
+ console.log((0, colors_1.DIM)('\nActiva cada MCP individualmente con consentimiento y alcance explícito.\n'));
20
+ }
11
21
  async function handleListMcp(client) {
12
22
  console.log(`\n${(0, colors_1.BOLD)('🔌 Servidores y Herramientas MCP:')}\n`);
13
23
  try {
@@ -0,0 +1,10 @@
1
+ export interface McpDefaultDefinition {
2
+ id: string;
3
+ label: string;
4
+ purpose: string;
5
+ transport: 'stdio' | 'connector';
6
+ activation: 'local-opt-in' | 'oauth-opt-in';
7
+ privacy: string;
8
+ }
9
+ /** Catalog only: entries are never enabled or installed automatically. */
10
+ export declare const MCP_DEFAULTS: McpDefaultDefinition[];
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MCP_DEFAULTS = void 0;
4
+ /** Catalog only: entries are never enabled or installed automatically. */
5
+ exports.MCP_DEFAULTS = [
6
+ { id: 'filesystem', label: 'Archivos locales', purpose: 'Carpeta elegida por el usuario', transport: 'stdio', activation: 'local-opt-in', privacy: 'Solo rutas autorizadas' },
7
+ { id: 'obsidian', label: 'Obsidian / Helix Vault', purpose: 'Leer y gestionar una bóveda concreta', transport: 'stdio', activation: 'local-opt-in', privacy: 'Solo la bóveda seleccionada' },
8
+ { id: 'vscode', label: 'VS Code', purpose: 'Trabajar con el workspace seleccionado', transport: 'stdio', activation: 'local-opt-in', privacy: 'Solo el workspace seleccionado' },
9
+ { id: 'github', label: 'GitHub', purpose: 'Repositorios, issues y pull requests', transport: 'stdio', activation: 'oauth-opt-in', privacy: 'Requiere token u OAuth del usuario' },
10
+ { id: 'gmail', label: 'Gmail', purpose: 'Correo y búsqueda de mensajes', transport: 'connector', activation: 'oauth-opt-in', privacy: 'Requiere OAuth explícito del usuario' },
11
+ { id: 'notion', label: 'Notion', purpose: 'Páginas y bases de datos', transport: 'connector', activation: 'oauth-opt-in', privacy: 'Requiere integración autorizada' },
12
+ ];
package/dist/index.js CHANGED
@@ -70,7 +70,7 @@ const program = new commander_1.Command();
70
70
  program
71
71
  .name('helix')
72
72
  .description('HELIX - Interactive Terminal CLI for Windows AI Desktop Agent')
73
- .version('0.2.7')
73
+ .version('0.2.9')
74
74
  .option('-u, --ws-url <url>', 'URL del servidor WebSocket del agente', (0, env_1.getWsUrl)())
75
75
  .option('-t, --token <token>', 'Token de autenticación WebSocket de HELIX', (0, env_1.getWsToken)())
76
76
  .option('--plain', 'Desactivar formato enriquecido de Markdown y mostrar texto plano sin asteriscos')
@@ -10,7 +10,7 @@ const user_skill_discovery_1 = require("../skills/user-skill-discovery");
10
10
  exports.SLASH_COMMANDS = [
11
11
  { command: '/create-skill', description: 'Crear una nueva skill interactiva para HELIX' },
12
12
  { command: '/skill', description: 'Listar o inspeccionar skills registradas', usage: '/skill [nombre]' },
13
- { command: '/mcp', description: 'Listar servidores MCP y sus herramientas' },
13
+ { command: '/mcp', description: 'Listar servidores MCP y sus herramientas', usage: '/mcp [defaults]' },
14
14
  { command: '/create-mcp', description: 'Registrar y configurar un nuevo servidor MCP' },
15
15
  { command: '/browser', description: 'Ver estado del navegador web o abrir URLs', usage: '/browser [open <url>]' },
16
16
  { command: '/config-apikey', description: 'Configurador interactivo de API Keys (OpenAI, Anthropic, Gemini, etc.)' },
@@ -19,6 +19,9 @@ exports.SLASH_COMMANDS = [
19
19
  { command: '/tasks', description: 'Ver tareas activas y recientes del agente' },
20
20
  { command: '/models', description: 'Listar modelos disponibles de proveedores configurados' },
21
21
  { command: '/status', description: 'Mostrar resumen del estado del sistema' },
22
+ { command: '/providers', description: 'Ver proveedores configurados y salud de sus claves' },
23
+ { command: '/capabilities', description: 'Ver capacidades activas: sandbox, subagentes, voz y browser' },
24
+ { command: '/settings', description: 'Ver configuración efectiva sin exponer secretos' },
22
25
  { command: '/clear', description: 'Limpiar pantalla y restaurar el banner de HELIX' },
23
26
  { command: '/stop', description: 'Parada de emergencia de todas las tareas activas' },
24
27
  { command: '/help', description: 'Mostrar ayuda de comandos y atajos' },
package/dist/ui/repl.js CHANGED
@@ -17,6 +17,7 @@ const mcp_1 = require("../commands/mcp");
17
17
  const mic_1 = require("../commands/mic");
18
18
  const browser_1 = require("../commands/browser");
19
19
  const markdown_1 = require("./markdown");
20
+ const diagnostics_1 = require("../commands/diagnostics");
20
21
  class HelixRepl {
21
22
  options;
22
23
  rl = null;
@@ -316,7 +317,10 @@ class HelixRepl {
316
317
  }
317
318
  break;
318
319
  case '/mcp':
319
- await (0, mcp_1.handleListMcp)(this.client);
320
+ if (args?.trim().toLowerCase() === 'defaults')
321
+ (0, mcp_1.handleMcpDefaults)();
322
+ else
323
+ await (0, mcp_1.handleListMcp)(this.client);
320
324
  break;
321
325
  case '/create-mcp':
322
326
  this.rl?.pause();
@@ -351,6 +355,15 @@ class HelixRepl {
351
355
  case '/status':
352
356
  await this._handleStatus();
353
357
  break;
358
+ case '/providers':
359
+ await (0, diagnostics_1.handleProviders)(this.client);
360
+ break;
361
+ case '/capabilities':
362
+ await (0, diagnostics_1.handleCapabilities)(this.client);
363
+ break;
364
+ case '/settings':
365
+ await (0, diagnostics_1.handleSettings)(this.client);
366
+ break;
354
367
  case '/stop':
355
368
  console.log((0, colors_1.RED_BOLD)('\n[PARADA DE EMERGENCIA]: Cancelando todas las tareas activas...'));
356
369
  this.client.emergencyStop();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "helix-assistant-cli",
3
- "version": "0.2.7",
3
+ "version": "0.2.9",
4
4
  "description": "HELIX - Interactive Terminal CLI for Windows AI Desktop Agent",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -319,6 +319,10 @@ export class AgentClient extends EventEmitter {
319
319
  return this.request<HelixSettings>('GET_SETTINGS', {});
320
320
  }
321
321
 
322
+ public async getCapabilities(): Promise<Record<string, unknown>> {
323
+ return this.request<Record<string, unknown>>('GET_CAPABILITIES', {});
324
+ }
325
+
322
326
  public async saveSettings(settings: Partial<HelixSettings>): Promise<HelixSettings> {
323
327
  return this.request<HelixSettings>('SAVE_SETTINGS', { settings });
324
328
  }
@@ -0,0 +1,38 @@
1
+ import chalk from 'chalk';
2
+ import type { AgentClient } from '../client/agent-client';
3
+ import { BOLD, CYAN, DIM, GREEN, GRAY, RED, YELLOW } from '../ui/colors';
4
+
5
+ export async function handleProviders(client: AgentClient): Promise<void> {
6
+ try {
7
+ const providers = await client.getProviders();
8
+ console.log(`\n${BOLD('🧠 Proveedores configurados:')}\n`);
9
+ for (const provider of providers) {
10
+ const state = provider.configured ? GREEN('configurado') : GRAY('sin clave');
11
+ console.log(` ${CYAN(provider.name || provider.id)} [${state}] ${DIM(`${provider.models_available} modelos`)}`);
12
+ for (const key of provider.keys || []) {
13
+ console.log(` ${DIM(`slot ${key.slot}:`)} ${key.configured ? GREEN(key.health) : GRAY('vacío')} ${key.masked || ''}`);
14
+ }
15
+ }
16
+ console.log('');
17
+ } catch (err) { console.log(RED(` Error consultando proveedores: ${(err as Error).message}\n`)); }
18
+ }
19
+
20
+ export async function handleCapabilities(client: AgentClient): Promise<void> {
21
+ try {
22
+ const caps = await client.getCapabilities();
23
+ console.log(`\n${BOLD('⚙ Capacidades activas:')}\n`);
24
+ for (const [key, value] of Object.entries(caps)) {
25
+ const rendered = typeof value === 'boolean' ? (value ? GREEN('activo') : YELLOW('inactivo')) : CYAN(String(value));
26
+ console.log(` ${DIM(key.padEnd(24))} ${rendered}`);
27
+ }
28
+ console.log('');
29
+ } catch (err) { console.log(RED(` Error consultando capacidades: ${(err as Error).message}\n`)); }
30
+ }
31
+
32
+ export async function handleSettings(client: AgentClient): Promise<void> {
33
+ try {
34
+ const settings = await client.getSettings();
35
+ const safe = Object.fromEntries(Object.entries(settings).filter(([key]) => !/key|token|secret|password|auth/i.test(key)));
36
+ console.log(`\n${BOLD('📋 Configuración efectiva (sin secretos):')}\n${JSON.stringify(safe, null, 2)}\n`);
37
+ } catch (err) { console.log(RED(` Error consultando configuración: ${(err as Error).message}\n`)); }
38
+ }
@@ -3,6 +3,16 @@ import chalk from 'chalk';
3
3
  import type { AgentClient } from '../client/agent-client';
4
4
  import type { McpServerConfig } from '../client/types';
5
5
  import { formatMcp, CYAN_BOLD, GREEN, RED, YELLOW, GRAY, BOLD, DIM } from '../ui/colors';
6
+ import { MCP_DEFAULTS } from '../config/mcp-defaults';
7
+
8
+ export function handleMcpDefaults(): void {
9
+ console.log(`\n${BOLD('📦 MCPs recomendados (catálogo, no activados automáticamente):')}\n`);
10
+ for (const item of MCP_DEFAULTS) {
11
+ console.log(` ${CYAN_BOLD('◈')} ${formatMcp(item.id)} — ${item.label}`);
12
+ console.log(` ${DIM(item.purpose)} | ${item.activation} | ${item.privacy}`);
13
+ }
14
+ console.log(DIM('\nActiva cada MCP individualmente con consentimiento y alcance explícito.\n'));
15
+ }
6
16
 
7
17
  export async function handleListMcp(client: AgentClient): Promise<void> {
8
18
  console.log(`\n${BOLD('🔌 Servidores y Herramientas MCP:')}\n`);
@@ -0,0 +1,18 @@
1
+ export interface McpDefaultDefinition {
2
+ id: string;
3
+ label: string;
4
+ purpose: string;
5
+ transport: 'stdio' | 'connector';
6
+ activation: 'local-opt-in' | 'oauth-opt-in';
7
+ privacy: string;
8
+ }
9
+
10
+ /** Catalog only: entries are never enabled or installed automatically. */
11
+ export const MCP_DEFAULTS: McpDefaultDefinition[] = [
12
+ { id: 'filesystem', label: 'Archivos locales', purpose: 'Carpeta elegida por el usuario', transport: 'stdio', activation: 'local-opt-in', privacy: 'Solo rutas autorizadas' },
13
+ { id: 'obsidian', label: 'Obsidian / Helix Vault', purpose: 'Leer y gestionar una bóveda concreta', transport: 'stdio', activation: 'local-opt-in', privacy: 'Solo la bóveda seleccionada' },
14
+ { id: 'vscode', label: 'VS Code', purpose: 'Trabajar con el workspace seleccionado', transport: 'stdio', activation: 'local-opt-in', privacy: 'Solo el workspace seleccionado' },
15
+ { id: 'github', label: 'GitHub', purpose: 'Repositorios, issues y pull requests', transport: 'stdio', activation: 'oauth-opt-in', privacy: 'Requiere token u OAuth del usuario' },
16
+ { id: 'gmail', label: 'Gmail', purpose: 'Correo y búsqueda de mensajes', transport: 'connector', activation: 'oauth-opt-in', privacy: 'Requiere OAuth explícito del usuario' },
17
+ { id: 'notion', label: 'Notion', purpose: 'Páginas y bases de datos', transport: 'connector', activation: 'oauth-opt-in', privacy: 'Requiere integración autorizada' },
18
+ ];
package/src/index.ts CHANGED
@@ -73,7 +73,7 @@ const program = new Command();
73
73
  program
74
74
  .name('helix')
75
75
  .description('HELIX - Interactive Terminal CLI for Windows AI Desktop Agent')
76
- .version('0.2.7')
76
+ .version('0.2.9')
77
77
  .option('-u, --ws-url <url>', 'URL del servidor WebSocket del agente', getWsUrl())
78
78
  .option('-t, --token <token>', 'Token de autenticación WebSocket de HELIX', getWsToken())
79
79
  .option('--plain', 'Desactivar formato enriquecido de Markdown y mostrar texto plano sin asteriscos')
@@ -12,7 +12,7 @@ export interface CommandDefinition {
12
12
  export const SLASH_COMMANDS: CommandDefinition[] = [
13
13
  { command: '/create-skill', description: 'Crear una nueva skill interactiva para HELIX' },
14
14
  { command: '/skill', description: 'Listar o inspeccionar skills registradas', usage: '/skill [nombre]' },
15
- { command: '/mcp', description: 'Listar servidores MCP y sus herramientas' },
15
+ { command: '/mcp', description: 'Listar servidores MCP y sus herramientas', usage: '/mcp [defaults]' },
16
16
  { command: '/create-mcp', description: 'Registrar y configurar un nuevo servidor MCP' },
17
17
  { command: '/browser', description: 'Ver estado del navegador web o abrir URLs', usage: '/browser [open <url>]' },
18
18
  { command: '/config-apikey', description: 'Configurador interactivo de API Keys (OpenAI, Anthropic, Gemini, etc.)' },
@@ -21,6 +21,9 @@ export const SLASH_COMMANDS: CommandDefinition[] = [
21
21
  { command: '/tasks', description: 'Ver tareas activas y recientes del agente' },
22
22
  { command: '/models', description: 'Listar modelos disponibles de proveedores configurados' },
23
23
  { command: '/status', description: 'Mostrar resumen del estado del sistema' },
24
+ { command: '/providers', description: 'Ver proveedores configurados y salud de sus claves' },
25
+ { command: '/capabilities', description: 'Ver capacidades activas: sandbox, subagentes, voz y browser' },
26
+ { command: '/settings', description: 'Ver configuración efectiva sin exponer secretos' },
24
27
  { command: '/clear', description: 'Limpiar pantalla y restaurar el banner de HELIX' },
25
28
  { command: '/stop', description: 'Parada de emergencia de todas las tareas activas' },
26
29
  { command: '/help', description: 'Mostrar ayuda de comandos y atajos' },
package/src/ui/repl.ts CHANGED
@@ -21,11 +21,12 @@ import {
21
21
  } from './colors';
22
22
  import { handleConfigApiKey, handleShowApiKey } from '../commands/apikey';
23
23
  import { handleCreateSkill, handleListSkills } from '../commands/skills';
24
- import { handleCreateMcp, handleListMcp } from '../commands/mcp';
24
+ import { handleCreateMcp, handleListMcp, handleMcpDefaults } from '../commands/mcp';
25
25
  import { handleMicrophoneCommand } from '../commands/mic';
26
26
  import { handleBrowserCommand } from '../commands/browser';
27
27
  import type { ConfirmationRequest } from '../client/types';
28
28
  import { formatTerminalMarkdown } from './markdown';
29
+ import { handleCapabilities, handleProviders, handleSettings } from '../commands/diagnostics';
29
30
 
30
31
  export interface ReplOptions {
31
32
  wsUrl: string;
@@ -359,7 +360,8 @@ export class HelixRepl {
359
360
  break;
360
361
 
361
362
  case '/mcp':
362
- await handleListMcp(this.client);
363
+ if (args?.trim().toLowerCase() === 'defaults') handleMcpDefaults();
364
+ else await handleListMcp(this.client);
363
365
  break;
364
366
 
365
367
  case '/create-mcp':
@@ -397,6 +399,18 @@ export class HelixRepl {
397
399
  await this._handleStatus();
398
400
  break;
399
401
 
402
+ case '/providers':
403
+ await handleProviders(this.client);
404
+ break;
405
+
406
+ case '/capabilities':
407
+ await handleCapabilities(this.client);
408
+ break;
409
+
410
+ case '/settings':
411
+ await handleSettings(this.client);
412
+ break;
413
+
400
414
  case '/stop':
401
415
  console.log(RED_BOLD('\n[PARADA DE EMERGENCIA]: Cancelando todas las tareas activas...'));
402
416
  this.client.emergencyStop();