@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.
- package/README.md +15 -6
- package/dist/builtin-manifests.js +45 -17
- package/dist/clean-machine-smoke.test.js +19 -19
- package/dist/configurators/body.js +57 -1
- package/dist/configurators.test.js +27 -4
- package/dist/discovery.js +1 -1
- package/dist/discovery.test.js +4 -4
- package/dist/doctor.js +1 -1
- package/dist/generator.js +19 -19
- package/dist/generator.test.js +33 -33
- package/dist/index.d.ts +1 -1
- package/dist/index.js +10 -10
- package/dist/manifest.js +2 -2
- package/dist/release-check.js +12 -12
- package/dist/runtime-parity.test.js +2 -2
- package/dist/web-dist/404/index.html +1 -1
- package/dist/web-dist/404.html +1 -1
- package/dist/web-dist/__next.__PAGE__.txt +3 -3
- package/dist/web-dist/__next._full.txt +2 -2
- package/dist/web-dist/__next._tree.txt +2 -2
- package/dist/web-dist/_next/static/chunks/1629039a.f535b3ff45566416.js +1 -0
- package/dist/web-dist/_next/static/chunks/202.59b8eb8a8c45f711.js +1 -0
- package/dist/web-dist/_next/static/chunks/2be4ccb0.ab2975eb50b4e166.js +1 -0
- package/dist/web-dist/_next/static/chunks/411.d68b2e48424f1e47.js +1 -0
- package/dist/web-dist/_next/static/chunks/92e71660.11f182d50bce2be0.js +342 -0
- package/dist/web-dist/_next/static/chunks/app/chat/page-ab56048b707a3ddd.js +34 -0
- package/dist/web-dist/_next/static/chunks/webpack-9073f434bc17ce16.js +1 -0
- package/dist/web-dist/_next/static/css/ceeb8e5596664b11.css +1 -0
- package/dist/web-dist/_not-found/__next._full.txt +2 -2
- package/dist/web-dist/_not-found/__next._not-found.__PAGE__.txt +2 -2
- package/dist/web-dist/_not-found/__next._tree.txt +2 -2
- package/dist/web-dist/_not-found/index.html +1 -1
- package/dist/web-dist/_not-found/index.txt +2 -2
- package/dist/web-dist/chat/__next._full.txt +3 -3
- package/dist/web-dist/chat/__next._tree.txt +2 -2
- package/dist/web-dist/chat/__next.chat.__PAGE__.txt +3 -3
- package/dist/web-dist/chat/index.html +1 -1
- package/dist/web-dist/chat/index.txt +3 -3
- package/dist/web-dist/index.html +1 -1
- package/dist/web-dist/index.txt +2 -2
- package/dist/web-dist/operator/__next._full.txt +2 -2
- package/dist/web-dist/operator/__next._tree.txt +2 -2
- package/dist/web-dist/operator/__next.operator.__PAGE__.txt +2 -2
- package/dist/web-dist/operator/index.html +1 -1
- package/dist/web-dist/operator/index.txt +2 -2
- package/package.json +1 -1
- package/dist/web-dist/_next/static/chunks/app/chat/page-52a6bd7bcba80f13.js +0 -34
- package/dist/web-dist/_next/static/chunks/webpack-f73cedc256be153e.js +0 -1
- package/dist/web-dist/_next/static/css/695ca1bf036a1d5f.css +0 -1
- /package/dist/web-dist/_next/static/{19iKYYXBkzIje9VKreuP1 → 28sP60JoJYTlLwpkfMjFA}/_buildManifest.js +0 -0
- /package/dist/web-dist/_next/static/{19iKYYXBkzIje9VKreuP1 → 28sP60JoJYTlLwpkfMjFA}/_ssgManifest.js +0 -0
package/README.md
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
#
|
|
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
|
|
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
|
|
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
|
|
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
|
|
59
|
+
npx siduri db push [directory]
|
|
60
|
+
npx siduri db reset [directory]
|
|
60
61
|
```
|
|
61
62
|
|
|
62
|
-
|
|
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: '@
|
|
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: '@
|
|
46
|
+
name: '@sidurijs/body',
|
|
47
47
|
organType: 'body',
|
|
48
|
-
version: '2.0
|
|
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: '@
|
|
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: '@
|
|
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: '@
|
|
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: '@
|
|
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: '@
|
|
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: '@
|
|
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: '@
|
|
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: '@
|
|
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: '@
|
|
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: '@
|
|
18
|
-
{ filter: '@
|
|
19
|
-
{ filter: '@
|
|
20
|
-
{ filter: '@
|
|
21
|
-
{ filter: '@
|
|
22
|
-
{ filter: '@
|
|
23
|
-
{ filter: '@
|
|
24
|
-
{ filter: '@
|
|
25
|
-
{ filter: '@
|
|
26
|
-
{ filter: '@
|
|
27
|
-
{ filter: '@
|
|
28
|
-
{ filter: '@
|
|
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
|
-
'@
|
|
103
|
-
'@
|
|
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/@
|
|
116
|
-
expect(node_fs_1.default.existsSync(node_path_1.default.join(instanceDir, 'node_modules/@
|
|
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
|
-
'@
|
|
139
|
-
'@
|
|
140
|
-
'@
|
|
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 '@
|
|
436
|
-
expect(files['src/index.js']).toContain("import { SqliteMemoryStore } from '@
|
|
437
|
-
expect(files['src/index.js']).toContain("import { UnifiedKnowledgeOrgan } from '@
|
|
438
|
-
expect(files['src/index.js']).toContain("import { VoiceAdapter } from '@
|
|
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 @
|
|
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);
|
package/dist/discovery.test.js
CHANGED
|
@@ -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
|
-
'@
|
|
43
|
-
'@
|
|
44
|
-
'@
|
|
45
|
-
'@
|
|
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 @
|
|
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 || '^
|
|
78
|
-
const cliVersion = options.cliVersion || '^2.0
|
|
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?.['@
|
|
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['@
|
|
96
|
+
dependencies['@sidurijs/core'] = `file:${repoPath}/packages/core`;
|
|
97
97
|
for (const m of manifests) {
|
|
98
|
-
const organRel = ['@
|
|
99
|
-
? `packages/${m.name.slice('@
|
|
100
|
-
: `packages/organs/${m.name.slice('@
|
|
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['@
|
|
105
|
+
dependencies['@sidurijs/core'] = coreVersion;
|
|
106
106
|
for (const m of manifests) {
|
|
107
|
-
dependencies[m.name] = `^${m.version || '
|
|
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 '@
|
|
190
|
+
`import { SiduriRuntime, dispatchCompanionChat, validateCompanionConfig } from '@sidurijs/core';`,
|
|
191
191
|
];
|
|
192
192
|
for (const m of manifests) {
|
|
193
|
-
if (m.name === '@
|
|
194
|
-
importLines.push(`import { ActiveSelfCompiler, SqliteSelfRepository, SelfPackageParser, scanDirective, compilePersonaDocument } from '@
|
|
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 === '@
|
|
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 === '@
|
|
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 === '@
|
|
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 === '@
|
|
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 @
|
|
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?.['@
|
|
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?.['@
|
|
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');
|