@vxnus/siduri 2.0.7 → 2.0.8

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.
@@ -0,0 +1,8 @@
1
+ export declare const colors: {
2
+ cyan: string;
3
+ dim: string;
4
+ green: string;
5
+ yellow: string;
6
+ bold: string;
7
+ reset: string;
8
+ };
package/dist/colors.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.colors = void 0;
4
+ exports.colors = {
5
+ cyan: '\u001b[36m',
6
+ dim: '\u001b[2m',
7
+ green: '\u001b[32m',
8
+ yellow: '\u001b[33m',
9
+ bold: '\u001b[1m',
10
+ reset: '\u001b[0m',
11
+ };
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.configureVoice = configureVoice;
7
7
  const inquirer_1 = __importDefault(require("inquirer"));
8
+ const colors_1 = require("../colors");
8
9
  async function configureVoice(_context) {
9
10
  const companionSlug = _context.companionName.toLowerCase().replace(/[^a-z0-9_-]/g, '') || 'default';
10
11
  const { provider } = await inquirer_1.default.prompt({
@@ -33,6 +34,10 @@ async function configureVoice(_context) {
33
34
  };
34
35
  }
35
36
  if (provider === 'rvc') {
37
+ console.log(`\n ${colors_1.colors.cyan}ℹ RVC Voice Model Setup:${colors_1.colors.reset}`);
38
+ console.log(` • ${colors_1.colors.dim}Voice Weights:${colors_1.colors.reset} Place your trained weights (.pth) in: ${colors_1.colors.green}./assets/voice/${companionSlug}/${companionSlug}.pth${colors_1.colors.reset}`);
39
+ console.log(` • ${colors_1.colors.dim}Feature Index:${colors_1.colors.reset} Place optional .index in: ${colors_1.colors.green}./assets/voice/${companionSlug}/${companionSlug}.index${colors_1.colors.reset}`);
40
+ console.log(` • ${colors_1.colors.dim}RVC Service:${colors_1.colors.reset} Ensure your headless RVC microservice is running before voice inference.\n`);
36
41
  const rvcAnswers = await inquirer_1.default.prompt([
37
42
  {
38
43
  type: 'input',
@@ -65,9 +70,9 @@ async function configureVoice(_context) {
65
70
  name: 'baseTts',
66
71
  message: 'Base TTS Engine for RVC (Generates initial audio):',
67
72
  choices: [
68
- { name: 'Edge-TTS (Cloud API, 0MB)', value: 'edge-tts' },
69
- { name: 'Kokoro TTS (Local, ~80MB)', value: 'kokoro' },
70
- { name: 'Piper TTS (Local, ~20MB)', value: 'piper' },
73
+ { name: 'Edge-TTS (Cloud API, 0MB - streams over network, zero local binary)', value: 'edge-tts' },
74
+ { name: 'Kokoro TTS (Connects to existing local Kokoro server or CLI)', value: 'kokoro' },
75
+ { name: 'Piper TTS (Connects to existing local Piper server or CLI)', value: 'piper' },
71
76
  ],
72
77
  default: 'edge-tts',
73
78
  },
@@ -308,6 +313,11 @@ async function configureVoice(_context) {
308
313
  return choices;
309
314
  }
310
315
  // provider === 'voicevox'
316
+ console.log(`\n ${colors_1.colors.cyan}ℹ VOICEVOX Engine Runtime:${colors_1.colors.reset}`);
317
+ console.log(` • ${colors_1.colors.dim}Download timing:${colors_1.colors.reset} Automatically downloaded on first companion run (${colors_1.colors.green}npm start${colors_1.colors.reset}).`);
318
+ console.log(` • ${colors_1.colors.dim}Install path:${colors_1.colors.reset} ~/.voicevox/engine/ (~1.5GB CPU binary, verified SHA-256).`);
319
+ console.log(` • ${colors_1.colors.dim}Engine execution:${colors_1.colors.reset} Siduri auto-spawns and manages the engine in background on port 50021.`);
320
+ console.log(` • ${colors_1.colors.dim}Pre-existing check:${colors_1.colors.reset} If you already run VOICEVOX (desktop/docker), Siduri connects directly without downloading.\n`);
311
321
  const urlAnswer = await inquirer_1.default.prompt([
312
322
  {
313
323
  type: 'input',
@@ -355,6 +365,7 @@ async function configureVoice(_context) {
355
365
  'Voice Bank': speakerLabel,
356
366
  'Speaker ID': speakerId,
357
367
  'Base URL': baseUrl,
368
+ 'Engine Runtime': 'Auto-downloads to ~/.voicevox/engine/ on first npm start (if port free)',
358
369
  };
359
370
  return {
360
371
  config,
package/dist/index.d.ts CHANGED
@@ -1,14 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { OrganManifest } from './manifest';
3
- export declare const CLI_VERSION = "2.0.7";
4
- export declare const colors: {
5
- cyan: string;
6
- dim: string;
7
- green: string;
8
- yellow: string;
9
- bold: string;
10
- reset: string;
11
- };
3
+ export declare const CLI_VERSION = "2.0.8";
4
+ import { colors } from './colors';
5
+ export { colors };
12
6
  export declare function printHeader(): void;
13
7
  export declare function printSection(title: string): void;
14
8
  export declare function printSuccess(message: string): void;
package/dist/index.js CHANGED
@@ -26,24 +26,18 @@ const doctor_1 = require("./doctor");
26
26
  const db_1 = require("./db");
27
27
  const configurators_1 = require("./configurators");
28
28
  const execFile = (0, node_util_1.promisify)(node_child_process_1.execFile);
29
- exports.CLI_VERSION = '2.0.7';
30
- exports.colors = {
31
- cyan: '\u001b[36m',
32
- dim: '\u001b[2m',
33
- green: '\u001b[32m',
34
- yellow: '\u001b[33m',
35
- bold: '\u001b[1m',
36
- reset: '\u001b[0m',
37
- };
29
+ exports.CLI_VERSION = '2.0.8';
30
+ const colors_1 = require("./colors");
31
+ Object.defineProperty(exports, "colors", { enumerable: true, get: function () { return colors_1.colors; } });
38
32
  function printHeader() {
39
- console.log(`\n${exports.colors.cyan}◈ SIDURI${exports.colors.reset} ${exports.colors.dim}companion setup (manifest-driven)${exports.colors.reset}`);
40
- console.log(`${exports.colors.yellow}Version ${exports.CLI_VERSION}${exports.colors.reset} · composable standalone architecture\n`);
33
+ console.log(`\n${colors_1.colors.cyan}◈ SIDURI${colors_1.colors.reset} ${colors_1.colors.dim}companion setup (manifest-driven)${colors_1.colors.reset}`);
34
+ console.log(`${colors_1.colors.yellow}Version ${exports.CLI_VERSION}${colors_1.colors.reset} · composable standalone architecture\n`);
41
35
  }
42
36
  function printSection(title) {
43
- console.log(`\n${exports.colors.cyan}── ${title} ${'─'.repeat(Math.max(2, 42 - title.length))}${exports.colors.reset}\n`);
37
+ console.log(`\n${colors_1.colors.cyan}── ${title} ${'─'.repeat(Math.max(2, 42 - title.length))}${colors_1.colors.reset}\n`);
44
38
  }
45
39
  function printSuccess(message) {
46
- console.log(`${exports.colors.green}✓${exports.colors.reset} ${message}`);
40
+ console.log(`${colors_1.colors.green}✓${colors_1.colors.reset} ${message}`);
47
41
  }
48
42
  function projectDirectoryName(value) {
49
43
  const slug = value
@@ -55,45 +49,45 @@ function projectDirectoryName(value) {
55
49
  }
56
50
  function formatReviewSummary(companionName, selectedManifests, organSummaries) {
57
51
  const lines = [];
58
- lines.push(`\n${exports.colors.cyan}── Review ${companionName} ${'─'.repeat(Math.max(2, 42 - (companionName.length + 9)))}${exports.colors.reset}\n`);
59
- lines.push(` ${exports.colors.bold}Companion${exports.colors.reset}`);
60
- lines.push(` ${exports.colors.dim}Name:${exports.colors.reset} ${companionName}\n`);
52
+ lines.push(`\n${colors_1.colors.cyan}── Review ${companionName} ${'─'.repeat(Math.max(2, 42 - (companionName.length + 9)))}${colors_1.colors.reset}\n`);
53
+ lines.push(` ${colors_1.colors.bold}Companion${colors_1.colors.reset}`);
54
+ lines.push(` ${colors_1.colors.dim}Name:${colors_1.colors.reset} ${companionName}\n`);
61
55
  for (const m of selectedManifests) {
62
56
  const isRequired = m.organType === 'brain';
63
- const tag = isRequired ? ` ${exports.colors.dim}· required${exports.colors.reset}` : '';
64
- lines.push(` ${exports.colors.bold}${m.displayName.split(' ')[0] || m.organType}${exports.colors.reset}${tag}`);
57
+ const tag = isRequired ? ` ${colors_1.colors.dim}· required${colors_1.colors.reset}` : '';
58
+ lines.push(` ${colors_1.colors.bold}${m.displayName.split(' ')[0] || m.organType}${colors_1.colors.reset}${tag}`);
65
59
  const summary = organSummaries[m.configKey] || organSummaries[m.organType] || {};
66
60
  const entries = Object.entries(summary);
67
61
  if (entries.length === 0) {
68
- lines.push(` ${exports.colors.dim}Provider:${exports.colors.reset} ${m.displayName}`);
62
+ lines.push(` ${colors_1.colors.dim}Provider:${colors_1.colors.reset} ${m.displayName}`);
69
63
  }
70
64
  else {
71
65
  for (const [key, val] of entries) {
72
66
  const valStr = String(val);
73
- lines.push(` ${exports.colors.dim}${key}:${exports.colors.reset}${' '.repeat(Math.max(1, 10 - key.length))}${valStr}`);
67
+ lines.push(` ${colors_1.colors.dim}${key}:${colors_1.colors.reset}${' '.repeat(Math.max(1, 10 - key.length))}${valStr}`);
74
68
  }
75
69
  }
76
70
  lines.push('');
77
71
  }
78
- lines.push(`${exports.colors.cyan}${'─'.repeat(46)}${exports.colors.reset}\n`);
72
+ lines.push(`${colors_1.colors.cyan}${'─'.repeat(46)}${colors_1.colors.reset}\n`);
79
73
  return lines.join('\n');
80
74
  }
81
75
  async function withTask(label, task) {
82
- process.stdout.write(`${exports.colors.dim}${label}${exports.colors.reset}`);
76
+ process.stdout.write(`${colors_1.colors.dim}${label}${colors_1.colors.reset}`);
83
77
  const frames = ['·', '•', '●', '•'];
84
78
  let index = 0;
85
79
  const timer = setInterval(() => {
86
- process.stdout.write(`\r${exports.colors.dim}${label} ${frames[index++ % frames.length]}${exports.colors.reset}`);
80
+ process.stdout.write(`\r${colors_1.colors.dim}${label} ${frames[index++ % frames.length]}${colors_1.colors.reset}`);
87
81
  }, 120);
88
82
  try {
89
83
  const result = await task();
90
84
  clearInterval(timer);
91
- process.stdout.write(`\r${exports.colors.green}✓${exports.colors.reset} ${label}\n`);
85
+ process.stdout.write(`\r${colors_1.colors.green}✓${colors_1.colors.reset} ${label}\n`);
92
86
  return result;
93
87
  }
94
88
  catch (error) {
95
89
  clearInterval(timer);
96
- process.stdout.write(`\r${exports.colors.yellow}!${exports.colors.reset} ${label}\n`);
90
+ process.stdout.write(`\r${colors_1.colors.yellow}!${colors_1.colors.reset} ${label}\n`);
97
91
  throw error;
98
92
  }
99
93
  }
@@ -121,7 +115,7 @@ async function runCreateWizard(targetDir) {
121
115
  const companionName = basicAnswers.name;
122
116
  const projectDir = targetDir ? node_path_1.default.resolve(process.cwd(), targetDir) : node_path_1.default.resolve(process.cwd(), projectDirectoryName(companionName));
123
117
  printSection('Organ Configuration');
124
- console.log(`${exports.colors.dim}Configuring capability organs for ${companionName} sequentially from cognition to physical embodiment.${exports.colors.reset}\n`);
118
+ console.log(`${colors_1.colors.dim}Configuring capability organs for ${companionName} sequentially from cognition to physical embodiment.${colors_1.colors.reset}\n`);
125
119
  // Canonical organ presentation order: Cognition -> Memory/State -> Identity -> Embodiment & Peripheral
126
120
  const canonicalOrder = ['brain', 'memory', 'knowledge', 'behavior', 'voice', 'body', 'mouth', 'hands', 'vision', 'ear', 'observation'];
127
121
  const orderedManifests = [...availableManifests].sort((a, b) => {
@@ -277,7 +271,7 @@ async function runCreateWizard(targetDir) {
277
271
  });
278
272
  }
279
273
  catch (err) {
280
- console.warn(`${exports.colors.yellow}!${exports.colors.reset} Notice: Could not download or unpack knowledge archive: ${err.message}`);
274
+ console.warn(`${colors_1.colors.yellow}!${colors_1.colors.reset} Notice: Could not download or unpack knowledge archive: ${err.message}`);
281
275
  }
282
276
  }
283
277
  printSuccess(`Generated standalone files at ${projectDir}`);
@@ -289,49 +283,56 @@ async function runCreateWizard(targetDir) {
289
283
  printSuccess('Dependencies installed successfully.');
290
284
  }
291
285
  catch (err) {
292
- console.warn(`${exports.colors.yellow}!${exports.colors.reset} Notice: npm install had warnings or requires network: ${err.message}`);
286
+ console.warn(`${colors_1.colors.yellow}!${colors_1.colors.reset} Notice: npm install had warnings or requires network: ${err.message}`);
293
287
  }
294
288
  printSection('Instance Ready');
295
289
  console.log(`Your Siduri companion is ready! Next steps:\n`);
296
290
  console.log(` cd ${node_path_1.default.relative(process.cwd(), projectDir) || '.'}`);
297
- console.log(` cp .env.example .env ${exports.colors.dim}# Fill in required API keys/credentials${exports.colors.reset}`);
298
- console.log(` npm run doctor ${exports.colors.dim}# Run diagnostic health probes${exports.colors.reset}`);
299
- console.log(` npm start ${exports.colors.dim}# Start Web Companion & Memory Console at http://localhost:3000${exports.colors.reset}\n`);
291
+ console.log(` cp .env.example .env ${colors_1.colors.dim}# Fill in required API keys/credentials${colors_1.colors.reset}`);
292
+ console.log(` npm run doctor ${colors_1.colors.dim}# Run diagnostic health probes${colors_1.colors.reset}`);
293
+ console.log(` npm start ${colors_1.colors.dim}# Start Web Companion & Memory Console at http://localhost:3000${colors_1.colors.reset}\n`);
294
+ const voiceConfig = organConfigs.voice || organConfigs['@siduri-x/voice'];
295
+ if (voiceConfig?.provider === 'voicevox') {
296
+ console.log(` ${colors_1.colors.cyan}ℹ Voice Runtime:${colors_1.colors.reset} ${colors_1.colors.dim}VOICEVOX engine (~1.5GB) will auto-download to ~/.voicevox/engine/ and launch on port 50021 on first 'npm start' (if not already running).${colors_1.colors.reset}\n`);
297
+ }
298
+ else if (voiceConfig?.rvc?.enabled) {
299
+ console.log(` ${colors_1.colors.cyan}ℹ Voice Model:${colors_1.colors.reset} ${colors_1.colors.dim}Place your RVC weights (.pth) in ${voiceConfig.rvc.modelPath} before starting voice synthesis.${colors_1.colors.reset}\n`);
300
+ }
300
301
  }
301
302
  async function runCliDoctor(targetDir) {
302
303
  printHeader();
303
304
  const dir = targetDir ? node_path_1.default.resolve(process.cwd(), targetDir) : process.cwd();
304
- console.log(`${exports.colors.cyan}Siduri Doctor${exports.colors.reset}`);
305
- console.log(`${exports.colors.dim}─────────────${exports.colors.reset}\n`);
305
+ console.log(`${colors_1.colors.cyan}Siduri Doctor${colors_1.colors.reset}`);
306
+ console.log(`${colors_1.colors.dim}─────────────${colors_1.colors.reset}\n`);
306
307
  try {
307
308
  const report = await (0, doctor_1.runDoctor)({ projectDir: dir });
308
- console.log(`${exports.colors.dim}Instance:${exports.colors.reset} ${report.instanceName}`);
309
- console.log(`${exports.colors.dim}Organs:${exports.colors.reset} ${report.configuredOrgans.join(', ')}\n`);
309
+ console.log(`${colors_1.colors.dim}Instance:${colors_1.colors.reset} ${report.instanceName}`);
310
+ console.log(`${colors_1.colors.dim}Organs:${colors_1.colors.reset} ${report.configuredOrgans.join(', ')}\n`);
310
311
  const categories = ['Environment', 'Services', 'Database', 'Health Probe'];
311
312
  for (const cat of categories) {
312
313
  const items = report.results.filter((r) => r.category === cat);
313
314
  if (items.length > 0) {
314
- console.log(`${exports.colors.cyan}${cat}${exports.colors.reset}`);
315
+ console.log(`${colors_1.colors.cyan}${cat}${colors_1.colors.reset}`);
315
316
  for (const item of items) {
316
317
  if (item.status === 'PASS') {
317
- console.log(` ${exports.colors.green}✓${exports.colors.reset} ${item.name} ${exports.colors.dim}(${item.message || 'OK'})${exports.colors.reset}`);
318
+ console.log(` ${colors_1.colors.green}✓${colors_1.colors.reset} ${item.name} ${colors_1.colors.dim}(${item.message || 'OK'})${colors_1.colors.reset}`);
318
319
  }
319
320
  else if (item.status === 'OPTIONAL_MISSING') {
320
- console.log(` ${exports.colors.dim}○${exports.colors.reset} ${item.name} ${exports.colors.dim}(Optional, not set)${exports.colors.reset}`);
321
+ console.log(` ${colors_1.colors.dim}○${colors_1.colors.reset} ${item.name} ${colors_1.colors.dim}(Optional, not set)${colors_1.colors.reset}`);
321
322
  }
322
323
  else if (item.status === 'SKIPPED') {
323
- console.log(` ${exports.colors.dim}— ${item.name} (${item.message})${exports.colors.reset}`);
324
+ console.log(` ${colors_1.colors.dim}— ${item.name} (${item.message})${colors_1.colors.reset}`);
324
325
  }
325
326
  else {
326
- console.log(` ${exports.colors.yellow}✗${exports.colors.reset} ${item.name}`);
327
+ console.log(` ${colors_1.colors.yellow}✗${colors_1.colors.reset} ${item.name}`);
327
328
  if (item.organName) {
328
- console.log(` ${exports.colors.dim}Required by:${exports.colors.reset} ${item.organName}`);
329
+ console.log(` ${colors_1.colors.dim}Required by:${colors_1.colors.reset} ${item.organName}`);
329
330
  }
330
331
  if (item.message) {
331
- console.log(` ${exports.colors.yellow}${item.message}${exports.colors.reset}`);
332
+ console.log(` ${colors_1.colors.yellow}${item.message}${colors_1.colors.reset}`);
332
333
  }
333
334
  if (item.remediation) {
334
- console.log(` ${exports.colors.dim}Remediation:${exports.colors.reset} ${item.remediation}`);
335
+ console.log(` ${colors_1.colors.dim}Remediation:${colors_1.colors.reset} ${item.remediation}`);
335
336
  }
336
337
  }
337
338
  }
@@ -339,16 +340,16 @@ async function runCliDoctor(targetDir) {
339
340
  }
340
341
  }
341
342
  if (report.passed) {
342
- console.log(`${exports.colors.green}Result: PASS${exports.colors.reset}\n`);
343
+ console.log(`${colors_1.colors.green}Result: PASS${colors_1.colors.reset}\n`);
343
344
  process.exitCode = 0;
344
345
  }
345
346
  else {
346
- console.log(`${exports.colors.yellow}Result: FAIL${exports.colors.reset}\n`);
347
+ console.log(`${colors_1.colors.yellow}Result: FAIL${colors_1.colors.reset}\n`);
347
348
  process.exitCode = 1;
348
349
  }
349
350
  }
350
351
  catch (err) {
351
- console.error(`\n${exports.colors.yellow}Doctor Error:${exports.colors.reset} ${err.message}\n`);
352
+ console.error(`\n${colors_1.colors.yellow}Doctor Error:${colors_1.colors.reset} ${err.message}\n`);
352
353
  process.exitCode = 2;
353
354
  }
354
355
  }
@@ -360,24 +361,24 @@ async function runCliDb(subcommand, targetDir) {
360
361
  return;
361
362
  }
362
363
  const dir = targetDir ? node_path_1.default.resolve(process.cwd(), targetDir) : process.cwd();
363
- console.log(`${exports.colors.cyan}Siduri Database Migrations${exports.colors.reset}`);
364
- console.log(`${exports.colors.dim}──────────────────────────${exports.colors.reset}\n`);
364
+ console.log(`${colors_1.colors.cyan}Siduri Database Migrations${colors_1.colors.reset}`);
365
+ console.log(`${colors_1.colors.dim}──────────────────────────${colors_1.colors.reset}\n`);
365
366
  try {
366
367
  const res = await (0, db_1.runDbPush)({ projectDir: dir });
367
368
  if (res.status === 'NOOP') {
368
- console.log(`${exports.colors.dim}— ${res.message}${exports.colors.reset}\n`);
369
+ console.log(`${colors_1.colors.dim}— ${res.message}${colors_1.colors.reset}\n`);
369
370
  }
370
371
  else {
371
372
  printSuccess(res.message);
372
373
  if (res.appliedMigrations.length > 0) {
373
- console.log(`${exports.colors.dim}Applied:${exports.colors.reset} ${res.appliedMigrations.join(', ')}`);
374
+ console.log(`${colors_1.colors.dim}Applied:${colors_1.colors.reset} ${res.appliedMigrations.join(', ')}`);
374
375
  }
375
376
  console.log();
376
377
  }
377
378
  process.exitCode = 0;
378
379
  }
379
380
  catch (err) {
380
- console.error(`\n${exports.colors.yellow}Database Migration Error:${exports.colors.reset} ${err.message}\n`);
381
+ console.error(`\n${colors_1.colors.yellow}Database Migration Error:${colors_1.colors.reset} ${err.message}\n`);
381
382
  process.exitCode = 3;
382
383
  }
383
384
  }
@@ -416,7 +417,7 @@ if (require.main === module) {
416
417
  console.log('\nOperation cancelled.');
417
418
  return;
418
419
  }
419
- console.error(`\n${exports.colors.yellow}!${exports.colors.reset} ${error instanceof Error ? error.message : error}`);
420
+ console.error(`\n${colors_1.colors.yellow}!${colors_1.colors.reset} ${error instanceof Error ? error.message : error}`);
420
421
  process.exitCode = 1;
421
422
  });
422
423
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vxnus/siduri",
3
- "version": "2.0.7",
3
+ "version": "2.0.8",
4
4
  "description": "Experimental CLI for installing and configuring Siduri companions",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {