@vxnus/siduri 2.0.41 → 2.1.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.
Files changed (51) hide show
  1. package/README.md +15 -6
  2. package/dist/builtin-manifests.js +45 -17
  3. package/dist/clean-machine-smoke.test.js +19 -19
  4. package/dist/configurators/body.js +57 -1
  5. package/dist/configurators.test.js +27 -4
  6. package/dist/discovery.js +1 -1
  7. package/dist/discovery.test.js +4 -4
  8. package/dist/doctor.js +1 -1
  9. package/dist/generator.js +19 -19
  10. package/dist/generator.test.js +33 -33
  11. package/dist/index.d.ts +1 -1
  12. package/dist/index.js +10 -10
  13. package/dist/manifest.js +2 -2
  14. package/dist/release-check.js +12 -12
  15. package/dist/runtime-parity.test.js +2 -2
  16. package/dist/web-dist/404/index.html +1 -1
  17. package/dist/web-dist/404.html +1 -1
  18. package/dist/web-dist/__next.__PAGE__.txt +3 -3
  19. package/dist/web-dist/__next._full.txt +2 -2
  20. package/dist/web-dist/__next._tree.txt +2 -2
  21. package/dist/web-dist/_next/static/chunks/1629039a.f535b3ff45566416.js +1 -0
  22. package/dist/web-dist/_next/static/chunks/202.59b8eb8a8c45f711.js +1 -0
  23. package/dist/web-dist/_next/static/chunks/2be4ccb0.ab2975eb50b4e166.js +1 -0
  24. package/dist/web-dist/_next/static/chunks/411.d68b2e48424f1e47.js +1 -0
  25. package/dist/web-dist/_next/static/chunks/92e71660.11f182d50bce2be0.js +342 -0
  26. package/dist/web-dist/_next/static/chunks/app/chat/page-ab56048b707a3ddd.js +34 -0
  27. package/dist/web-dist/_next/static/chunks/webpack-9073f434bc17ce16.js +1 -0
  28. package/dist/web-dist/_next/static/css/ceeb8e5596664b11.css +1 -0
  29. package/dist/web-dist/_not-found/__next._full.txt +2 -2
  30. package/dist/web-dist/_not-found/__next._not-found.__PAGE__.txt +2 -2
  31. package/dist/web-dist/_not-found/__next._tree.txt +2 -2
  32. package/dist/web-dist/_not-found/index.html +1 -1
  33. package/dist/web-dist/_not-found/index.txt +2 -2
  34. package/dist/web-dist/chat/__next._full.txt +3 -3
  35. package/dist/web-dist/chat/__next._tree.txt +2 -2
  36. package/dist/web-dist/chat/__next.chat.__PAGE__.txt +3 -3
  37. package/dist/web-dist/chat/index.html +1 -1
  38. package/dist/web-dist/chat/index.txt +3 -3
  39. package/dist/web-dist/index.html +1 -1
  40. package/dist/web-dist/index.txt +2 -2
  41. package/dist/web-dist/operator/__next._full.txt +2 -2
  42. package/dist/web-dist/operator/__next._tree.txt +2 -2
  43. package/dist/web-dist/operator/__next.operator.__PAGE__.txt +2 -2
  44. package/dist/web-dist/operator/index.html +1 -1
  45. package/dist/web-dist/operator/index.txt +2 -2
  46. package/package.json +1 -1
  47. package/dist/web-dist/_next/static/chunks/app/chat/page-52a6bd7bcba80f13.js +0 -34
  48. package/dist/web-dist/_next/static/chunks/webpack-f73cedc256be153e.js +0 -1
  49. package/dist/web-dist/_next/static/css/695ca1bf036a1d5f.css +0 -1
  50. /package/dist/web-dist/_next/static/{19iKYYXBkzIje9VKreuP1 → 28sP60JoJYTlLwpkfMjFA}/_buildManifest.js +0 -0
  51. /package/dist/web-dist/_next/static/{19iKYYXBkzIje9VKreuP1 → 28sP60JoJYTlLwpkfMjFA}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -1,11 +1,11 @@
1
- # @vxnus/siduri
1
+ # Siduri CLI (`siduri`)
2
2
 
3
3
  Experimental CLI for creating, diagnosing, and managing standalone Siduri companions powered by the `@siduri-x/*` organ ecosystem.
4
4
 
5
5
  Requires Node.js >=22.16.0.
6
6
 
7
7
  ```bash
8
- npx @vxnus/siduri create my-companion
8
+ npx siduri create my-companion
9
9
  ```
10
10
 
11
11
  ## Prerequisites
@@ -29,7 +29,7 @@ npx @vxnus/siduri create my-companion
29
29
  ### 1. Create a Standalone Companion
30
30
 
31
31
  ```bash
32
- npx @vxnus/siduri create [directory]
32
+ npx siduri create [directory]
33
33
  ```
34
34
 
35
35
  The interactive wizard allows you to name your companion, configure organ providers and models, and inspect Knowledge manifests. It generates:
@@ -48,7 +48,7 @@ my-companion/
48
48
  ### 2. Run Diagnostics
49
49
 
50
50
  ```bash
51
- npx @vxnus/siduri doctor [directory]
51
+ npx siduri doctor [directory]
52
52
  ```
53
53
 
54
54
  Inspects active configuration, checks required/optional environment variables, and executes health probes.
@@ -56,10 +56,19 @@ Inspects active configuration, checks required/optional environment variables, a
56
56
  ### 3. Database Management
57
57
 
58
58
  ```bash
59
- npx @vxnus/siduri db push [directory]
59
+ npx siduri db push [directory]
60
+ npx siduri db reset [directory]
60
61
  ```
61
62
 
62
- Inspects the instance storage configuration. Under the SQLite unified foundation, schema initialization and table creation are handled natively and automatically at boot.
63
+ SQLite manages migrations and schemas automatically in-process.
64
+
65
+ ### 4. Instance Reset
66
+
67
+ ```bash
68
+ npx siduri reset [directory]
69
+ ```
70
+
71
+ Clears SQLite databases and cached state to return the companion to Blank Slate.
63
72
 
64
73
  ## Local Development
65
74
 
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BUILTIN_ORGAN_MANIFESTS = void 0;
4
4
  exports.BUILTIN_ORGAN_MANIFESTS = [
5
5
  {
6
- name: '@siduri-x/self',
6
+ name: '@sidurijs/self',
7
7
  organType: 'behavior',
8
8
  version: '2.0.12',
9
9
  displayName: 'Self & Persona (Identity & Directives)',
@@ -43,11 +43,11 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
43
43
  healthCheck: null
44
44
  },
45
45
  {
46
- name: '@siduri-x/body',
46
+ name: '@sidurijs/body',
47
47
  organType: 'body',
48
- version: '2.0.1',
49
- displayName: 'Body (Live2D & Avatar State)',
50
- description: 'Renderer-agnostic avatar expression and embodiment event adapter',
48
+ version: '2.1.0',
49
+ displayName: 'Body (Live2D & VRM Avatar State)',
50
+ description: 'Renderer-agnostic avatar expression and embodiment event adapter supporting Live2D (.model3.json) and VRM (.vrm)',
51
51
  entrypoint: './dist/index.js',
52
52
  factory: 'NeutralBodyOrgan',
53
53
  configKey: 'body',
@@ -57,17 +57,45 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
57
57
  properties: {
58
58
  provider: {
59
59
  type: 'string',
60
- enum: ['live2d', 'none']
60
+ enum: ['live2d', 'vrm', 'none']
61
+ },
62
+ format: {
63
+ type: 'string',
64
+ enum: ['live2d', 'vrm', 'auto'],
65
+ default: 'auto'
61
66
  },
62
67
  initialExpression: {
63
68
  type: 'string',
64
69
  default: 'neutral'
65
70
  },
66
71
  modelPath: {
67
- type: 'string'
72
+ type: 'string',
73
+ description: 'Path to local Live2D Cubism (.model3.json) or VRM (.vrm) model file'
68
74
  },
69
75
  modelUrl: {
70
- type: 'string'
76
+ type: 'string',
77
+ description: 'Relative web or remote HTTP URL to Live2D Cubism (.model3.json) or VRM (.vrm) model file'
78
+ },
79
+ vrm: {
80
+ type: 'object',
81
+ properties: {
82
+ specVersion: {
83
+ type: 'string',
84
+ enum: ['0.x', '1.0', 'auto'],
85
+ default: 'auto'
86
+ },
87
+ lookAtMode: {
88
+ type: 'string',
89
+ enum: ['camera', 'cursor', 'head', 'none'],
90
+ default: 'camera'
91
+ },
92
+ defaultPose: {
93
+ type: 'string'
94
+ },
95
+ expressionMapping: {
96
+ type: 'object'
97
+ }
98
+ }
71
99
  }
72
100
  }
73
101
  },
@@ -77,7 +105,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
77
105
  healthCheck: null
78
106
  },
79
107
  {
80
- name: '@siduri-x/brain',
108
+ name: '@sidurijs/brain',
81
109
  organType: 'brain',
82
110
  version: '2.0.13',
83
111
  displayName: 'Brain (Cognition & Planning)',
@@ -133,7 +161,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
133
161
  healthCheck: 'probeBrainHealth'
134
162
  },
135
163
  {
136
- name: '@siduri-x/ear',
164
+ name: '@sidurijs/ear',
137
165
  organType: 'ear',
138
166
  version: '2.0.3',
139
167
  displayName: 'Ear (Perception Ingress)',
@@ -164,7 +192,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
164
192
  healthCheck: null
165
193
  },
166
194
  {
167
- name: '@siduri-x/hands',
195
+ name: '@sidurijs/hands',
168
196
  organType: 'hands',
169
197
  version: '2.0.2',
170
198
  displayName: 'Hands (MCP Tool Execution)',
@@ -218,7 +246,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
218
246
  healthCheck: 'probeHandsHealth'
219
247
  },
220
248
  {
221
- name: '@siduri-x/knowledge',
249
+ name: '@sidurijs/knowledge',
222
250
  organType: 'knowledge',
223
251
  version: '2.0.6',
224
252
  displayName: 'Knowledge (Sovereign Life DB & Knowledge Packs)',
@@ -296,7 +324,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
296
324
  healthCheck: null
297
325
  },
298
326
  {
299
- name: '@siduri-x/memory',
327
+ name: '@sidurijs/memory',
300
328
  organType: 'memory',
301
329
  version: '2.0.5',
302
330
  displayName: 'Memory (Long-term Recall & State)',
@@ -326,7 +354,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
326
354
  healthCheck: null
327
355
  },
328
356
  {
329
- name: '@siduri-x/observation',
357
+ name: '@sidurijs/observation',
330
358
  organType: 'observation',
331
359
  version: '2.0.1',
332
360
  displayName: 'Observation (Screen Perception & Frame Ingest)',
@@ -344,7 +372,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
344
372
  healthCheck: null
345
373
  },
346
374
  {
347
- name: '@siduri-x/vision',
375
+ name: '@sidurijs/vision',
348
376
  organType: 'vision',
349
377
  version: '2.0.1',
350
378
  displayName: 'Vision (Visual Perception & OCR)',
@@ -391,7 +419,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
391
419
  healthCheck: 'probeVisionHealth'
392
420
  },
393
421
  {
394
- name: '@siduri-x/voice',
422
+ name: '@sidurijs/voice',
395
423
  organType: 'voice',
396
424
  version: '2.0.2',
397
425
  displayName: 'Voice (Speech Synthesis & Voice Conversion)',
@@ -466,7 +494,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
466
494
  healthCheck: null
467
495
  },
468
496
  {
469
- name: '@siduri-x/mouth',
497
+ name: '@sidurijs/mouth',
470
498
  organType: 'mouth',
471
499
  version: '2.0.2',
472
500
  displayName: 'Mouth (Communication & UI Delivery)',
@@ -14,18 +14,18 @@ describe('Phase 5: Clean-Machine Distribution & Packaging Smoke Suite', () => {
14
14
  const cleanMachineRoot = node_path_1.default.resolve(__dirname, '../temp-clean-machine-smoke');
15
15
  const getPkgVer = (dir) => JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.resolve(repoRoot, dir, 'package.json'), 'utf8')).version;
16
16
  const ALL_CANONICAL_PACKAGES = [
17
- { filter: '@siduri-x/core', dir: 'packages/core', tarName: `siduri-x-core-${getPkgVer('packages/core')}.tgz`, isOrgan: false },
18
- { filter: '@siduri-x/brain', dir: 'packages/organs/brain', tarName: `siduri-x-brain-${getPkgVer('packages/organs/brain')}.tgz`, isOrgan: true },
19
- { filter: '@siduri-x/memory', dir: 'packages/memory', tarName: `siduri-x-memory-${getPkgVer('packages/memory')}.tgz`, isOrgan: true },
20
- { filter: '@siduri-x/knowledge', dir: 'packages/knowledge', tarName: `siduri-x-knowledge-${getPkgVer('packages/knowledge')}.tgz`, isOrgan: true },
21
- { filter: '@siduri-x/self', dir: 'packages/self', tarName: `siduri-x-self-${getPkgVer('packages/self')}.tgz`, isOrgan: true },
22
- { filter: '@siduri-x/ear', dir: 'packages/organs/ear', tarName: `siduri-x-ear-${getPkgVer('packages/organs/ear')}.tgz`, isOrgan: true },
23
- { filter: '@siduri-x/vision', dir: 'packages/organs/vision', tarName: `siduri-x-vision-${getPkgVer('packages/organs/vision')}.tgz`, isOrgan: true },
24
- { filter: '@siduri-x/hands', dir: 'packages/organs/hands', tarName: `siduri-x-hands-${getPkgVer('packages/organs/hands')}.tgz`, isOrgan: true },
25
- { filter: '@siduri-x/body', dir: 'packages/organs/body', tarName: `siduri-x-body-${getPkgVer('packages/organs/body')}.tgz`, isOrgan: true },
26
- { filter: '@siduri-x/voice', dir: 'packages/organs/voice', tarName: `siduri-x-voice-${getPkgVer('packages/organs/voice')}.tgz`, isOrgan: true },
27
- { filter: '@siduri-x/observation', dir: 'packages/organs/observation', tarName: `siduri-x-observation-${getPkgVer('packages/organs/observation')}.tgz`, isOrgan: true },
28
- { filter: '@siduri-x/mouth', dir: 'packages/organs/mouth', tarName: `siduri-x-mouth-${getPkgVer('packages/organs/mouth')}.tgz`, isOrgan: true },
17
+ { filter: '@sidurijs/core', dir: 'packages/core', tarName: `sidurijs-core-${getPkgVer('packages/core')}.tgz`, isOrgan: false },
18
+ { filter: '@sidurijs/brain', dir: 'packages/organs/brain', tarName: `sidurijs-brain-${getPkgVer('packages/organs/brain')}.tgz`, isOrgan: true },
19
+ { filter: '@sidurijs/memory', dir: 'packages/memory', tarName: `sidurijs-memory-${getPkgVer('packages/memory')}.tgz`, isOrgan: true },
20
+ { filter: '@sidurijs/knowledge', dir: 'packages/knowledge', tarName: `sidurijs-knowledge-${getPkgVer('packages/knowledge')}.tgz`, isOrgan: true },
21
+ { filter: '@sidurijs/self', dir: 'packages/self', tarName: `sidurijs-self-${getPkgVer('packages/self')}.tgz`, isOrgan: true },
22
+ { filter: '@sidurijs/ear', dir: 'packages/organs/ear', tarName: `sidurijs-ear-${getPkgVer('packages/organs/ear')}.tgz`, isOrgan: true },
23
+ { filter: '@sidurijs/vision', dir: 'packages/organs/vision', tarName: `sidurijs-vision-${getPkgVer('packages/organs/vision')}.tgz`, isOrgan: true },
24
+ { filter: '@sidurijs/hands', dir: 'packages/organs/hands', tarName: `sidurijs-hands-${getPkgVer('packages/organs/hands')}.tgz`, isOrgan: true },
25
+ { filter: '@sidurijs/body', dir: 'packages/organs/body', tarName: `sidurijs-body-${getPkgVer('packages/organs/body')}.tgz`, isOrgan: true },
26
+ { filter: '@sidurijs/voice', dir: 'packages/organs/voice', tarName: `sidurijs-voice-${getPkgVer('packages/organs/voice')}.tgz`, isOrgan: true },
27
+ { filter: '@sidurijs/observation', dir: 'packages/organs/observation', tarName: `sidurijs-observation-${getPkgVer('packages/organs/observation')}.tgz`, isOrgan: true },
28
+ { filter: '@sidurijs/mouth', dir: 'packages/organs/mouth', tarName: `sidurijs-mouth-${getPkgVer('packages/organs/mouth')}.tgz`, isOrgan: true },
29
29
  { filter: '@vxnus/siduri', dir: 'cli', tarName: `vxnus-siduri-${getPkgVer('cli')}.tgz`, isOrgan: false },
30
30
  ];
31
31
  const getTarPath = (pkgName) => {
@@ -99,8 +99,8 @@ describe('Phase 5: Clean-Machine Distribution & Packaging Smoke Suite', () => {
99
99
  });
100
100
  const pkgObj = JSON.parse(files['package.json']);
101
101
  pkgObj.dependencies = {
102
- '@siduri-x/core': `file:${getTarPath('@siduri-x/core')}`,
103
- '@siduri-x/brain': `file:${getTarPath('@siduri-x/brain')}`,
102
+ '@sidurijs/core': `file:${getTarPath('@sidurijs/core')}`,
103
+ '@sidurijs/brain': `file:${getTarPath('@sidurijs/brain')}`,
104
104
  };
105
105
  pkgObj.devDependencies = {
106
106
  '@vxnus/siduri': `file:${getTarPath('@vxnus/siduri')}`,
@@ -112,8 +112,8 @@ describe('Phase 5: Clean-Machine Distribution & Packaging Smoke Suite', () => {
112
112
  node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, 'README.md'), files['README.md']);
113
113
  node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, 'src/index.js'), files['src/index.js']);
114
114
  (0, node_child_process_1.execSync)('npm install --no-audit --no-fund', { cwd: instanceDir, stdio: 'pipe' });
115
- expect(node_fs_1.default.existsSync(node_path_1.default.join(instanceDir, 'node_modules/@siduri-x/memory'))).toBe(false);
116
- expect(node_fs_1.default.existsSync(node_path_1.default.join(instanceDir, 'node_modules/@siduri-x/hands'))).toBe(false);
115
+ expect(node_fs_1.default.existsSync(node_path_1.default.join(instanceDir, 'node_modules/@sidurijs/memory'))).toBe(false);
116
+ expect(node_fs_1.default.existsSync(node_path_1.default.join(instanceDir, 'node_modules/@sidurijs/hands'))).toBe(false);
117
117
  const doctorPass = (0, node_child_process_1.execSync)(`node ${node_path_1.default.resolve(repoRoot, 'cli/dist/index.js')} doctor`, {
118
118
  cwd: instanceDir,
119
119
  env: { ...process.env, OPENROUTER_API_KEY: 'test-key-clean' },
@@ -135,9 +135,9 @@ describe('Phase 5: Clean-Machine Distribution & Packaging Smoke Suite', () => {
135
135
  });
136
136
  const pkgObj = JSON.parse(files['package.json']);
137
137
  pkgObj.dependencies = {
138
- '@siduri-x/core': `file:${getTarPath('@siduri-x/core')}`,
139
- '@siduri-x/brain': `file:${getTarPath('@siduri-x/brain')}`,
140
- '@siduri-x/hands': `file:${getTarPath('@siduri-x/hands')}`,
138
+ '@sidurijs/core': `file:${getTarPath('@sidurijs/core')}`,
139
+ '@sidurijs/brain': `file:${getTarPath('@sidurijs/brain')}`,
140
+ '@sidurijs/hands': `file:${getTarPath('@sidurijs/hands')}`,
141
141
  };
142
142
  pkgObj.devDependencies = {
143
143
  '@vxnus/siduri': `file:${getTarPath('@vxnus/siduri')}`,
@@ -5,13 +5,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.configureBody = configureBody;
7
7
  const inquirer_1 = __importDefault(require("inquirer"));
8
+ const colors_1 = require("../colors");
8
9
  async function configureBody(_context) {
9
10
  const { provider } = await inquirer_1.default.prompt({
10
11
  type: 'list',
11
12
  name: 'provider',
12
13
  message: 'Body avatar provider?',
13
14
  choices: [
14
- { name: 'Live2D Cubism (Interactive avatar motion & expression state)', value: 'live2d' },
15
+ { name: 'Live2D Cubism (Interactive 2D avatar motion & expression state)', value: 'live2d' },
16
+ { name: 'VRM 3D Humanoid (Interactive 3D avatar, VRoid / glTF)', value: 'vrm' },
15
17
  { name: 'None (Headless / No visual body)', value: 'none' },
16
18
  ],
17
19
  });
@@ -21,6 +23,59 @@ async function configureBody(_context) {
21
23
  summary: { Provider: 'None (Headless)' },
22
24
  };
23
25
  }
26
+ if (provider === 'vrm') {
27
+ const { modelSource, lookAtMode } = await inquirer_1.default.prompt([
28
+ {
29
+ type: 'input',
30
+ name: 'modelSource',
31
+ message: 'VRM Model path / URL (.vrm):',
32
+ default: './assets/body/default/model.vrm',
33
+ },
34
+ {
35
+ type: 'list',
36
+ name: 'lookAtMode',
37
+ message: 'VRM Camera LookAt target behavior:',
38
+ choices: [
39
+ { name: 'Camera (Look towards viewer)', value: 'camera' },
40
+ { name: 'Cursor (Track mouse / touch cursor)', value: 'cursor' },
41
+ { name: 'Head (Restricted head-only tracking)', value: 'head' },
42
+ { name: 'None (Fixed gaze)', value: 'none' },
43
+ ],
44
+ default: 'camera',
45
+ },
46
+ ]);
47
+ const modelPath = modelSource.trim() || './assets/body/default/model.vrm';
48
+ const isHttpOrAbsolute = modelPath.startsWith('http://') || modelPath.startsWith('https://') || modelPath.startsWith('/');
49
+ const webModelUrl = isHttpOrAbsolute
50
+ ? modelPath
51
+ : modelPath.startsWith('./')
52
+ ? modelPath.slice(1)
53
+ : `/${modelPath}`;
54
+ return {
55
+ config: {
56
+ provider: 'vrm',
57
+ format: 'vrm',
58
+ modelPath,
59
+ modelUrl: webModelUrl,
60
+ initialExpression: 'neutral',
61
+ vrm: {
62
+ specVersion: 'auto',
63
+ lookAtMode: lookAtMode,
64
+ },
65
+ },
66
+ summary: {
67
+ Provider: 'VRM (3D Avatar)',
68
+ 'Model Path': modelPath,
69
+ 'LookAt Mode': lookAtMode,
70
+ },
71
+ };
72
+ }
73
+ // provider === 'live2d'
74
+ console.log(`\n ${colors_1.colors.yellow}⚠ Live2D Cubism Licensing & Runtime Notice:${colors_1.colors.reset}`);
75
+ console.log(` • ${colors_1.colors.dim}Proprietary Core:${colors_1.colors.reset} Live2D Cubism Core is proprietary software of Live2D Inc.`);
76
+ console.log(` • ${colors_1.colors.dim}Indie / Small Biz:${colors_1.colors.reset} Free & royalty-free for entities with annual revenue < 10M JPY (~$67k USD).`);
77
+ console.log(` • ${colors_1.colors.dim}Commercial License:${colors_1.colors.reset} Entities exceeding this threshold require a Publication License from Live2D Inc.`);
78
+ console.log(` • ${colors_1.colors.dim}Runtime Download:${colors_1.colors.reset} Clients fetch live2dcubismcore.min.js directly from Live2D CDN at runtime.\n`);
24
79
  const { modelSource } = await inquirer_1.default.prompt([
25
80
  {
26
81
  type: 'input',
@@ -39,6 +94,7 @@ async function configureBody(_context) {
39
94
  return {
40
95
  config: {
41
96
  provider: 'live2d',
97
+ format: 'live2d',
42
98
  modelPath,
43
99
  modelUrl: webModelUrl,
44
100
  initialExpression: 'neutral',
@@ -316,6 +316,29 @@ describe('Guided Manifest-Driven Configuration UX Specification Tests', () => {
316
316
  expect(result.config.modelUrl).toBe('/assets/body/default/model.model3.json');
317
317
  expect(result.summary?.['Model Path']).toBe('./assets/body/default/model.model3.json');
318
318
  });
319
+ test('Body configurator configures VRM 3D avatar with lookAt mode', async () => {
320
+ inquirer_1.default.prompt
321
+ .mockResolvedValueOnce({ provider: 'vrm' })
322
+ .mockResolvedValueOnce({
323
+ modelSource: './assets/body/vroid/model.vrm',
324
+ lookAtMode: 'cursor',
325
+ });
326
+ const result = await (0, body_1.configureBody)({ companionName: 'VRoidCompanion', manifest: bodyManifest });
327
+ expect(result.config.provider).toBe('vrm');
328
+ expect(result.config.format).toBe('vrm');
329
+ expect(result.config.modelPath).toBe('./assets/body/vroid/model.vrm');
330
+ expect(result.config.modelUrl).toBe('/assets/body/vroid/model.vrm');
331
+ expect(result.config.vrm?.lookAtMode).toBe('cursor');
332
+ expect(result.summary?.Provider).toBe('VRM (3D Avatar)');
333
+ expect(result.summary?.['LookAt Mode']).toBe('cursor');
334
+ });
335
+ test('Body configurator disables body when none is selected', async () => {
336
+ inquirer_1.default.prompt
337
+ .mockResolvedValueOnce({ provider: 'none' });
338
+ const result = await (0, body_1.configureBody)({ companionName: 'HeadlessCompanion', manifest: bodyManifest });
339
+ expect(result.config.provider).toBe('none');
340
+ expect(result.summary?.Provider).toBe('None (Headless)');
341
+ });
319
342
  test('Hands configurator configures MCP tool execution timeout', async () => {
320
343
  inquirer_1.default.prompt
321
344
  .mockResolvedValueOnce({ provider: 'mcp' })
@@ -432,10 +455,10 @@ describe('Guided Manifest-Driven Configuration UX Specification Tests', () => {
432
455
  expect(config.organs.knowledge.packId).toBe('@vxnus/e-teyvat');
433
456
  expect(config.organs.voice.speakerId).toBe(2);
434
457
  // Verify explicit imports in src/index.js
435
- expect(files['src/index.js']).toContain("import { OpenRouterBrain } from '@siduri-x/brain'");
436
- expect(files['src/index.js']).toContain("import { SqliteMemoryStore } from '@siduri-x/memory'");
437
- expect(files['src/index.js']).toContain("import { UnifiedKnowledgeOrgan } from '@siduri-x/knowledge'");
438
- expect(files['src/index.js']).toContain("import { VoiceAdapter } from '@siduri-x/voice'");
458
+ expect(files['src/index.js']).toContain("import { OpenRouterBrain } from '@sidurijs/brain'");
459
+ expect(files['src/index.js']).toContain("import { SqliteMemoryStore } from '@sidurijs/memory'");
460
+ expect(files['src/index.js']).toContain("import { UnifiedKnowledgeOrgan } from '@sidurijs/knowledge'");
461
+ expect(files['src/index.js']).toContain("import { VoiceAdapter } from '@sidurijs/voice'");
439
462
  });
440
463
  });
441
464
  });
package/dist/discovery.js CHANGED
@@ -73,7 +73,7 @@ class OrganRegistry {
73
73
  // Continue scanning other roots
74
74
  }
75
75
  }
76
- // Always merge canonical built-in @siduri-x/* organ manifests as fallback for ones that weren't found
76
+ // Always merge canonical built-in @sidurijs/* organ manifests as fallback for ones that weren't found
77
77
  for (const builtinManifest of builtin_manifests_1.BUILTIN_ORGAN_MANIFESTS) {
78
78
  if (!registry.get(builtinManifest.organType)) {
79
79
  registry.register(builtinManifest);
@@ -39,10 +39,10 @@ describe('Discovery & Dynamic Composition System Tests (Phase 3)', () => {
39
39
  });
40
40
  const pkg = JSON.parse(files['package.json']);
41
41
  expect(Object.keys(pkg.dependencies).sort()).toEqual([
42
- '@siduri-x/brain',
43
- '@siduri-x/core',
44
- '@siduri-x/hands',
45
- '@siduri-x/vision',
42
+ '@sidurijs/brain',
43
+ '@sidurijs/core',
44
+ '@sidurijs/hands',
45
+ '@sidurijs/vision',
46
46
  ]);
47
47
  const schema = JSON.parse(files['siduri.schema.json']);
48
48
  expect(Object.keys(schema.properties.organs.properties).sort()).toEqual(['brain', 'hands', 'vision']);
package/dist/doctor.js CHANGED
@@ -83,7 +83,7 @@ async function runDoctor(options = {}) {
83
83
  name: `Manifest resolution: ${organKey}`,
84
84
  status: 'FAIL',
85
85
  message: `Could not resolve package manifest for configured organ '${organKey}'.`,
86
- remediation: `Ensure @siduri-x/${organKey} is installed in package.json and npm install has been run.`,
86
+ remediation: `Ensure @sidurijs/${organKey} is installed in package.json and npm install has been run.`,
87
87
  });
88
88
  }
89
89
  else {
package/dist/generator.js CHANGED
@@ -74,8 +74,8 @@ function getDefaultConfigForManifest(manifest) {
74
74
  function generateInstanceFiles(options) {
75
75
  const instanceName = options.name || 'my-siduri';
76
76
  const instanceId = options.id || 'default';
77
- const coreVersion = options.coreVersion || '^2.0.16';
78
- const cliVersion = options.cliVersion || '^2.0.40';
77
+ const coreVersion = options.coreVersion || '^1.0.0';
78
+ const cliVersion = options.cliVersion || '^2.1.0';
79
79
  const canonicalOrder = ['brain', 'memory', 'knowledge', 'behavior', 'voice', 'body', 'mouth', 'hands', 'vision', 'ear', 'observation'];
80
80
  const manifests = [...options.selectedManifests].sort((a, b) => {
81
81
  const idxA = canonicalOrder.indexOf(a.organType);
@@ -87,24 +87,24 @@ function generateInstanceFiles(options) {
87
87
  const hasBody = manifests.some((m) => m.organType === 'body');
88
88
  const hasMouth = manifests.some((m) => m.organType === 'mouth');
89
89
  const hasVision = manifests.some((m) => m.organType === 'vision');
90
- const voiceConfig = options.organConfigs?.voice || options.organConfigs?.['@siduri-x/voice'];
90
+ const voiceConfig = options.organConfigs?.voice || options.organConfigs?.['@sidurijs/voice'];
91
91
  const isVoicevox = hasVoice && (!voiceConfig || voiceConfig.provider === 'voicevox');
92
92
  // 1. package.json
93
93
  const dependencies = {};
94
94
  if (options.localPath) {
95
95
  const repoPath = options.localPath.replace(/\\/g, '/');
96
- dependencies['@siduri-x/core'] = `file:${repoPath}/packages/core`;
96
+ dependencies['@sidurijs/core'] = `file:${repoPath}/packages/core`;
97
97
  for (const m of manifests) {
98
- const organRel = ['@siduri-x/memory', '@siduri-x/knowledge', '@siduri-x/self'].includes(m.name)
99
- ? `packages/${m.name.slice('@siduri-x/'.length)}`
100
- : `packages/organs/${m.name.slice('@siduri-x/'.length)}`;
98
+ const organRel = ['@sidurijs/memory', '@sidurijs/knowledge', '@sidurijs/self'].includes(m.name)
99
+ ? `packages/${m.name.slice('@sidurijs/'.length)}`
100
+ : `packages/organs/${m.name.slice('@sidurijs/'.length)}`;
101
101
  dependencies[m.name] = `file:${repoPath}/${organRel}`;
102
102
  }
103
103
  }
104
104
  else {
105
- dependencies['@siduri-x/core'] = coreVersion;
105
+ dependencies['@sidurijs/core'] = coreVersion;
106
106
  for (const m of manifests) {
107
- dependencies[m.name] = `^${m.version || '2.0.1'}`;
107
+ dependencies[m.name] = `^${m.version || '1.0.0'}`;
108
108
  }
109
109
  }
110
110
  const scripts = {
@@ -187,11 +187,11 @@ function generateInstanceFiles(options) {
187
187
  `import { readFile, stat, readdir } from 'node:fs/promises';`,
188
188
  `import path from 'node:path';`,
189
189
  `import { fileURLToPath } from 'node:url';`,
190
- `import { SiduriRuntime, dispatchCompanionChat, validateCompanionConfig } from '@siduri-x/core';`,
190
+ `import { SiduriRuntime, dispatchCompanionChat, validateCompanionConfig } from '@sidurijs/core';`,
191
191
  ];
192
192
  for (const m of manifests) {
193
- if (m.name === '@siduri-x/self') {
194
- importLines.push(`import { ActiveSelfCompiler, SqliteSelfRepository, SelfPackageParser, scanDirective, compilePersonaDocument } from '@siduri-x/self';`);
193
+ if (m.name === '@sidurijs/self') {
194
+ importLines.push(`import { ActiveSelfCompiler, SqliteSelfRepository, SelfPackageParser, scanDirective, compilePersonaDocument } from '@sidurijs/self';`);
195
195
  }
196
196
  else {
197
197
  importLines.push(`import { ${m.factory} } from '${m.name}';`);
@@ -200,7 +200,7 @@ function generateInstanceFiles(options) {
200
200
  const instantiationLines = [];
201
201
  const organMapEntries = [];
202
202
  for (const m of manifests) {
203
- if (m.name === '@siduri-x/self') {
203
+ if (m.name === '@sidurijs/self') {
204
204
  instantiationLines.push(`const self = new SqliteSelfRepository({ dbPath: path.resolve(rootDir, 'siduri.sqlite') });`);
205
205
  instantiationLines.push(`const behavior = new ActiveSelfCompiler(config.organs.behavior);`);
206
206
  // NOTE: .self file is NOT auto-installed on startup.
@@ -209,15 +209,15 @@ function generateInstanceFiles(options) {
209
209
  organMapEntries.push(` behavior,`);
210
210
  organMapEntries.push(` self,`);
211
211
  }
212
- else if (m.name === '@siduri-x/memory') {
212
+ else if (m.name === '@sidurijs/memory') {
213
213
  instantiationLines.push(`const memory = new ${m.factory}({ ...config.organs.${m.configKey}, dbPath: path.resolve(rootDir, config.organs.${m.configKey}?.dbPath || 'siduri.sqlite') });`);
214
214
  organMapEntries.push(` ${m.configKey},`);
215
215
  }
216
- else if (m.name === '@siduri-x/knowledge') {
216
+ else if (m.name === '@sidurijs/knowledge') {
217
217
  instantiationLines.push(`const knowledge = new ${m.factory}({ ...config.organs.${m.configKey}, dbPath: path.resolve(rootDir, config.organs.${m.configKey}?.dbPath || 'siduri.sqlite') });`);
218
218
  organMapEntries.push(` ${m.configKey},`);
219
219
  }
220
- else if (m.name === '@siduri-x/observation') {
220
+ else if (m.name === '@sidurijs/observation') {
221
221
  const visionArg = hasVision ? 'vision' : '{ analyze: async () => JSON.stringify({ readings: [] }) }';
222
222
  instantiationLines.push(`const observation = new ${m.factory}(${visionArg});`);
223
223
  organMapEntries.push(` ${m.configKey},`);
@@ -714,7 +714,7 @@ function generateInstanceFiles(options) {
714
714
  ` return;`,
715
715
  ` }`,
716
716
  '',
717
- ` // API: Chat interaction (routed through canonical dispatchCompanionChat from @siduri-x/core)`,
717
+ ` // API: Chat interaction (routed through canonical dispatchCompanionChat from @sidurijs/core)`,
718
718
  ` if ((pathname === '/chat' || pathname === '/api/chat') && req.method === 'POST') {`,
719
719
  ` let body = '';`,
720
720
  ` req.on('data', (chunk) => { body += chunk; });`,
@@ -1035,13 +1035,13 @@ function generateInstanceFiles(options) {
1035
1035
  createAssetsDirs.push('assets/voice/default');
1036
1036
  readmeLines.push('', '### Voice & RVC Models', 'Place your character RVC voice models into `./assets/voice/default/`:', '- `default.pth` (Target voice weights)', '- `default.index` (Feature index file)');
1037
1037
  }
1038
- const knowledgeConfig = options.organConfigs?.knowledge || options.organConfigs?.['@siduri-x/knowledge'];
1038
+ const knowledgeConfig = options.organConfigs?.knowledge || options.organConfigs?.['@sidurijs/knowledge'];
1039
1039
  if (manifests.some((m) => m.organType === 'knowledge') && knowledgeConfig?.packPath) {
1040
1040
  const cleanPackDir = String(knowledgeConfig.packPath).replace(/^\.\//, '');
1041
1041
  createAssetsDirs.push(cleanPackDir);
1042
1042
  readmeLines.push('', '### Knowledge Pack Assets', `Local knowledge pack files reside in \`./${cleanPackDir}/\`.`);
1043
1043
  }
1044
- const behaviorConfig = options.organConfigs?.behavior || options.organConfigs?.['@siduri-x/self'];
1044
+ const behaviorConfig = options.organConfigs?.behavior || options.organConfigs?.['@sidurijs/self'];
1045
1045
  let selfPersonaFile = null;
1046
1046
  if (manifests.some((m) => m.organType === 'behavior')) {
1047
1047
  createAssetsDirs.push('assets/self');