siduri 1.0.2 → 1.0.3

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.
@@ -5,7 +5,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
5
5
  {
6
6
  name: '@sidurijs/self',
7
7
  organType: 'behavior',
8
- version: '2.0.12',
8
+ version: '1.0.1',
9
9
  displayName: 'Self & Persona (Identity & Directives)',
10
10
  description: 'Autonomous persona compiler, relational stances, and .self asset loader',
11
11
  entrypoint: './dist/index.js',
@@ -45,7 +45,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
45
45
  {
46
46
  name: '@sidurijs/body',
47
47
  organType: 'body',
48
- version: '2.1.0',
48
+ version: '1.0.1',
49
49
  displayName: 'Body (Live2D & VRM Avatar State)',
50
50
  description: 'Renderer-agnostic avatar expression and embodiment event adapter supporting Live2D (.model3.json) and VRM (.vrm)',
51
51
  entrypoint: './dist/index.js',
@@ -107,7 +107,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
107
107
  {
108
108
  name: '@sidurijs/brain',
109
109
  organType: 'brain',
110
- version: '2.0.13',
110
+ version: '1.0.2',
111
111
  displayName: 'Brain (Cognition & Planning)',
112
112
  description: 'Provider-neutral LLM reasoning, response planning, and proposal generation',
113
113
  entrypoint: './dist/index.js',
@@ -163,7 +163,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
163
163
  {
164
164
  name: '@sidurijs/ear',
165
165
  organType: 'ear',
166
- version: '2.0.3',
166
+ version: '1.0.1',
167
167
  displayName: 'Ear (Perception Ingress)',
168
168
  description: 'Multi-modal sensory input ingestion, transcription bounds, and mime validation',
169
169
  entrypoint: './dist/index.js',
@@ -194,7 +194,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
194
194
  {
195
195
  name: '@sidurijs/hands',
196
196
  organType: 'hands',
197
- version: '2.0.2',
197
+ version: '1.0.1',
198
198
  displayName: 'Hands (MCP Tool Execution)',
199
199
  description: 'Model Context Protocol tool management and cryptographically authorized action execution',
200
200
  entrypoint: './dist/index.js',
@@ -248,7 +248,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
248
248
  {
249
249
  name: '@sidurijs/knowledge',
250
250
  organType: 'knowledge',
251
- version: '2.0.6',
251
+ version: '1.0.1',
252
252
  displayName: 'Knowledge (Sovereign Life DB & Knowledge Packs)',
253
253
  description: 'Sovereign Life Database (finances, inventory, schedule, preferences) and portable E knowledge packs',
254
254
  entrypoint: './dist/index.js',
@@ -326,7 +326,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
326
326
  {
327
327
  name: '@sidurijs/archive',
328
328
  organType: 'archive',
329
- version: '1.0.0',
329
+ version: '1.0.2',
330
330
  displayName: 'Archive (Interaction Audit Ledger)',
331
331
  description: 'Cold append-only interaction audit trail and FTS5 full-text search (RFC VX-26-13)',
332
332
  entrypoint: './dist/index.js',
@@ -356,7 +356,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
356
356
  {
357
357
  name: '@sidurijs/observation',
358
358
  organType: 'observation',
359
- version: '2.0.1',
359
+ version: '1.0.1',
360
360
  displayName: 'Observation (Screen Perception & Frame Ingest)',
361
361
  description: 'Screen capture frame ingest, SHA-256 deduplication, and visual grounding for Eyes/Vision',
362
362
  entrypoint: './dist/index.js',
@@ -374,7 +374,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
374
374
  {
375
375
  name: '@sidurijs/vision',
376
376
  organType: 'vision',
377
- version: '2.0.1',
377
+ version: '1.0.1',
378
378
  displayName: 'Vision (Visual Perception & OCR)',
379
379
  description: 'Image inspection, cropping, and multi-pass OCR perception adapter',
380
380
  entrypoint: './dist/index.js',
@@ -421,7 +421,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
421
421
  {
422
422
  name: '@sidurijs/voice',
423
423
  organType: 'voice',
424
- version: '2.0.2',
424
+ version: '1.0.1',
425
425
  displayName: 'Voice (Speech Synthesis & Voice Conversion)',
426
426
  description: 'Queued speech synthesis and audio rendering lifecycle adapter (VOICEVOX, RVC)',
427
427
  entrypoint: './dist/index.js',
@@ -496,7 +496,7 @@ exports.BUILTIN_ORGAN_MANIFESTS = [
496
496
  {
497
497
  name: '@sidurijs/mouth',
498
498
  organType: 'mouth',
499
- version: '2.0.2',
499
+ version: '1.0.1',
500
500
  displayName: 'Mouth (Communication & UI Delivery)',
501
501
  description: 'Decoupled output delivery organ formatting cognitive decisions for web interfaces',
502
502
  entrypoint: './dist/index.js',
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_fs_1 = __importDefault(require("node:fs"));
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const node_child_process_1 = require("node:child_process");
9
+ const discovery_1 = require("./discovery");
10
+ const generator_1 = require("./generator");
11
+ describe('Phase 5: Clean-Machine Distribution & E2E Integration Suite', () => {
12
+ const repoRoot = node_path_1.default.resolve(__dirname, '../../');
13
+ const tempPackDir = node_path_1.default.resolve(__dirname, '../temp-packs-e2e');
14
+ const cleanMachineRoot = node_path_1.default.resolve(__dirname, '../temp-clean-machine-e2e');
15
+ const getPkgVer = (dir) => JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.resolve(repoRoot, dir, 'package.json'), 'utf8')).version;
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 },
29
+ { filter: '@siduri-x/eknowledge', dir: 'packages/organs/eknowledge', tarName: `siduri-x-eknowledge-${getPkgVer('packages/organs/eknowledge')}.tgz`, isOrgan: true },
30
+ { filter: '@vxnus/siduri', dir: 'cli', tarName: `vxnus-siduri-${getPkgVer('cli')}.tgz`, isOrgan: false },
31
+ ];
32
+ const getTarPath = (pkgName) => {
33
+ const pkg = ALL_CANONICAL_PACKAGES.find(p => p.filter === pkgName);
34
+ return node_path_1.default.join(tempPackDir, pkg.tarName);
35
+ };
36
+ beforeAll(() => {
37
+ // 1. Prepare clean directories
38
+ if (node_fs_1.default.existsSync(tempPackDir))
39
+ node_fs_1.default.rmSync(tempPackDir, { recursive: true, force: true });
40
+ if (node_fs_1.default.existsSync(cleanMachineRoot))
41
+ node_fs_1.default.rmSync(cleanMachineRoot, { recursive: true, force: true });
42
+ node_fs_1.default.mkdirSync(tempPackDir, { recursive: true });
43
+ node_fs_1.default.mkdirSync(cleanMachineRoot, { recursive: true });
44
+ // 2. Build all packages in repo
45
+ (0, node_child_process_1.execSync)("pnpm turbo run build --filter='!web'", { cwd: repoRoot, stdio: 'pipe' });
46
+ // 3. Pack each canonical package into tempPackDir
47
+ for (const pkg of ALL_CANONICAL_PACKAGES) {
48
+ (0, node_child_process_1.execSync)(`pnpm pack --pack-destination ${tempPackDir}`, {
49
+ cwd: node_path_1.default.resolve(repoRoot, pkg.dir),
50
+ stdio: 'pipe',
51
+ });
52
+ }
53
+ }, 90000);
54
+ afterAll(() => {
55
+ if (node_fs_1.default.existsSync(tempPackDir))
56
+ node_fs_1.default.rmSync(tempPackDir, { recursive: true, force: true });
57
+ if (node_fs_1.default.existsSync(cleanMachineRoot))
58
+ node_fs_1.default.rmSync(cleanMachineRoot, { recursive: true, force: true });
59
+ });
60
+ describe('Phase 5A: Package Artifact Verification', () => {
61
+ test('all 14 packages produce valid tarballs', () => {
62
+ for (const pkg of ALL_CANONICAL_PACKAGES) {
63
+ const tarPath = node_path_1.default.join(tempPackDir, pkg.tarName);
64
+ expect(node_fs_1.default.existsSync(tarPath)).toBe(true);
65
+ }
66
+ });
67
+ test('packed package.json files have zero workspace:* or link: dependencies', () => {
68
+ for (const pkg of ALL_CANONICAL_PACKAGES) {
69
+ const tarPath = node_path_1.default.join(tempPackDir, pkg.tarName);
70
+ const pkgJsonRaw = (0, node_child_process_1.execSync)(`tar -xzf ${tarPath} -O package/package.json`, { encoding: 'utf8' });
71
+ const pkgJson = JSON.parse(pkgJsonRaw);
72
+ const allDeps = {
73
+ ...(pkgJson.dependencies || {}),
74
+ ...(pkgJson.peerDependencies || {}),
75
+ };
76
+ for (const [depName, version] of Object.entries(allDeps)) {
77
+ if (typeof version === 'string') {
78
+ expect(version.startsWith('workspace:')).toBe(false);
79
+ expect(version.startsWith('link:')).toBe(false);
80
+ expect(version.includes('../')).toBe(false);
81
+ }
82
+ }
83
+ }
84
+ });
85
+ });
86
+ describe('Phase 5B & 5C & 5G: Clean-Machine Installation & Isolation Acceptance', () => {
87
+ const registry = discovery_1.OrganRegistry.discover([
88
+ node_path_1.default.resolve(repoRoot, 'packages/organs'),
89
+ node_path_1.default.resolve(repoRoot, 'packages')
90
+ ]);
91
+ const brain = registry.get('brain');
92
+ const hands = registry.get('hands');
93
+ const memory = registry.get('memory');
94
+ test('Clean Composition 1: Brain only instance installs, starts, runs doctor and db push', () => {
95
+ const instanceDir = node_path_1.default.join(cleanMachineRoot, 'inst-brain-only');
96
+ node_fs_1.default.mkdirSync(node_path_1.default.join(instanceDir, 'src'), { recursive: true });
97
+ const files = (0, generator_1.generateInstanceFiles)({
98
+ name: 'CleanBrainOnly',
99
+ selectedManifests: [brain],
100
+ });
101
+ const pkgObj = JSON.parse(files['package.json']);
102
+ pkgObj.dependencies = {
103
+ '@siduri-x/core': `file:${getTarPath('@siduri-x/core')}`,
104
+ '@siduri-x/brain': `file:${getTarPath('@siduri-x/brain')}`,
105
+ };
106
+ node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, 'package.json'), JSON.stringify(pkgObj, null, 2) + '\n');
107
+ node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, 'siduri.config.json'), files['siduri.config.json']);
108
+ node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, 'siduri.schema.json'), files['siduri.schema.json']);
109
+ node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, '.env.example'), files['.env.example']);
110
+ node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, 'README.md'), files['README.md']);
111
+ node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, 'src/index.js'), files['src/index.js']);
112
+ (0, node_child_process_1.execSync)('npm install --no-audit --no-fund', { cwd: instanceDir, stdio: 'pipe' });
113
+ expect(node_fs_1.default.existsSync(node_path_1.default.join(instanceDir, 'node_modules/@siduri-x/memory'))).toBe(false);
114
+ expect(node_fs_1.default.existsSync(node_path_1.default.join(instanceDir, 'node_modules/@siduri-x/hands'))).toBe(false);
115
+ const doctorPass = (0, node_child_process_1.execSync)(`node ${node_path_1.default.resolve(repoRoot, 'cli/dist/index.js')} doctor`, {
116
+ cwd: instanceDir,
117
+ env: { ...process.env, OPENROUTER_API_KEY: 'test-key-clean' },
118
+ encoding: 'utf8',
119
+ });
120
+ expect(doctorPass).toContain('Result: PASS');
121
+ const dbPushOutput = (0, node_child_process_1.execSync)(`node ${node_path_1.default.resolve(repoRoot, 'cli/dist/index.js')} db push`, {
122
+ cwd: instanceDir,
123
+ encoding: 'utf8',
124
+ });
125
+ expect(dbPushOutput).toContain('SQLite manages schema natively. No CLI migrations required.');
126
+ }, 60000);
127
+ test('Clean Composition 2: Brain + Hands installs and runs doctor verifying ACTION_POLICY_SECRET', () => {
128
+ const instanceDir = node_path_1.default.join(cleanMachineRoot, 'inst-brain-hands');
129
+ node_fs_1.default.mkdirSync(node_path_1.default.join(instanceDir, 'src'), { recursive: true });
130
+ const files = (0, generator_1.generateInstanceFiles)({
131
+ name: 'CleanBrainHands',
132
+ selectedManifests: [brain, hands],
133
+ });
134
+ const pkgObj = JSON.parse(files['package.json']);
135
+ pkgObj.dependencies = {
136
+ '@siduri-x/core': `file:${getTarPath('@siduri-x/core')}`,
137
+ '@siduri-x/brain': `file:${getTarPath('@siduri-x/brain')}`,
138
+ '@siduri-x/hands': `file:${getTarPath('@siduri-x/hands')}`,
139
+ };
140
+ node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, 'package.json'), JSON.stringify(pkgObj, null, 2) + '\n');
141
+ node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, 'siduri.config.json'), files['siduri.config.json']);
142
+ node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, 'siduri.schema.json'), files['siduri.schema.json']);
143
+ node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, '.env.example'), files['.env.example']);
144
+ node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, 'README.md'), files['README.md']);
145
+ node_fs_1.default.writeFileSync(node_path_1.default.join(instanceDir, 'src/index.js'), files['src/index.js']);
146
+ (0, node_child_process_1.execSync)('npm install --no-audit --no-fund', { cwd: instanceDir, stdio: 'pipe' });
147
+ const doctorOutput = (0, node_child_process_1.execSync)(`node ${node_path_1.default.resolve(repoRoot, 'cli/dist/index.js')} doctor`, {
148
+ cwd: instanceDir,
149
+ env: {
150
+ ...process.env,
151
+ OPENROUTER_API_KEY: 'test-key-clean',
152
+ ACTION_POLICY_SECRET: 'test-secret-clean',
153
+ },
154
+ encoding: 'utf8',
155
+ });
156
+ expect(doctorOutput).toContain('ACTION_POLICY_SECRET');
157
+ expect(doctorOutput).toContain('Result: PASS');
158
+ }, 60000);
159
+ });
160
+ });
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @deprecated RFC VX-26-13: Deconstructing Memory into Sovereign Primitives.
3
+ * Use ./archive instead.
4
+ */
5
+ export * from './archive';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ /**
18
+ * @deprecated RFC VX-26-13: Deconstructing Memory into Sovereign Primitives.
19
+ * Use ./archive instead.
20
+ */
21
+ __exportStar(require("./archive"), exports);
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 || '^1.0.2';
78
- const cliVersion = options.cliVersion || '^1.0.2';
77
+ const coreVersion = options.coreVersion || '^1.0.3';
78
+ const cliVersion = options.cliVersion || '^1.0.3';
79
79
  const canonicalOrder = ['brain', 'archive', '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);
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { OrganManifest } from './manifest';
3
- export declare const CLI_VERSION = "1.0.2";
3
+ export declare const CLI_VERSION = "1.0.3";
4
4
  import { colors } from './colors';
5
5
  export { colors };
6
6
  export declare function printHeader(): void;
package/dist/index.js CHANGED
@@ -61,7 +61,7 @@ const doctor_1 = require("./doctor");
61
61
  const db_1 = require("./db");
62
62
  const configurators_1 = require("./configurators");
63
63
  const execFile = (0, node_util_1.promisify)(node_child_process_1.execFile);
64
- exports.CLI_VERSION = '1.0.2';
64
+ exports.CLI_VERSION = '1.0.3';
65
65
  const colors_1 = require("./colors");
66
66
  Object.defineProperty(exports, "colors", { enumerable: true, get: function () { return colors_1.colors; } });
67
67
  function printHeader() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siduri",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Experimental CLI for installing and configuring Siduri companions",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {