@vxnus/siduri 0.0.6 → 0.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.
Files changed (39) hide show
  1. package/dist/builtin-manifests.d.ts +2 -0
  2. package/dist/builtin-manifests.js +433 -0
  3. package/dist/clean-machine-e2e.test.js +1 -1
  4. package/dist/configurators/behavior.d.ts +2 -0
  5. package/dist/configurators/behavior.js +36 -0
  6. package/dist/configurators/body.d.ts +2 -0
  7. package/dist/configurators/body.js +44 -0
  8. package/dist/configurators/brain.d.ts +6 -0
  9. package/dist/configurators/brain.js +80 -0
  10. package/dist/configurators/ear.d.ts +2 -0
  11. package/dist/configurators/ear.js +28 -0
  12. package/dist/configurators/hands.d.ts +2 -0
  13. package/dist/configurators/hands.js +27 -0
  14. package/dist/configurators/index.d.ts +23 -0
  15. package/dist/configurators/index.js +74 -0
  16. package/dist/configurators/knowledge.d.ts +6 -0
  17. package/dist/configurators/knowledge.js +100 -0
  18. package/dist/configurators/memory.d.ts +2 -0
  19. package/dist/configurators/memory.js +44 -0
  20. package/dist/configurators/observation.d.ts +2 -0
  21. package/dist/configurators/observation.js +12 -0
  22. package/dist/configurators/types.d.ts +12 -0
  23. package/dist/configurators/types.js +2 -0
  24. package/dist/configurators/vision.d.ts +2 -0
  25. package/dist/configurators/vision.js +39 -0
  26. package/dist/configurators/voice.d.ts +2 -0
  27. package/dist/configurators/voice.js +53 -0
  28. package/dist/configurators.test.d.ts +1 -0
  29. package/dist/configurators.test.js +275 -0
  30. package/dist/discovery.js +8 -0
  31. package/dist/discovery.test.js +7 -0
  32. package/dist/index.d.ts +16 -0
  33. package/dist/index.js +137 -54
  34. package/dist/providers/knowledge-hub.d.ts +37 -0
  35. package/dist/providers/knowledge-hub.js +141 -0
  36. package/dist/providers/openrouter.d.ts +32 -0
  37. package/dist/providers/openrouter.js +201 -0
  38. package/dist/release-check.js +1 -1
  39. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ import { OrganManifest } from './manifest';
2
+ export declare const BUILTIN_ORGAN_MANIFESTS: OrganManifest[];
@@ -0,0 +1,433 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BUILTIN_ORGAN_MANIFESTS = void 0;
4
+ exports.BUILTIN_ORGAN_MANIFESTS = [
5
+ {
6
+ name: '@siduri-x/behavior',
7
+ organType: 'behavior',
8
+ version: '1.0.0',
9
+ displayName: 'Behavior (Active Self Directives)',
10
+ description: 'Atomic directive state machine and personality projection compiler',
11
+ entrypoint: './dist/index.js',
12
+ factory: 'ActiveSelfCompiler',
13
+ configKey: 'behavior',
14
+ configSchema: {
15
+ type: 'object',
16
+ required: ['provider'],
17
+ properties: {
18
+ provider: {
19
+ type: 'string',
20
+ enum: ['active_self', 'none']
21
+ },
22
+ preset: {
23
+ type: 'string'
24
+ }
25
+ }
26
+ },
27
+ environment: [],
28
+ services: [],
29
+ database: null,
30
+ healthCheck: null
31
+ },
32
+ {
33
+ name: '@siduri-x/body',
34
+ organType: 'body',
35
+ version: '1.0.0',
36
+ displayName: 'Body (Live2D & Avatar State)',
37
+ description: 'Renderer-agnostic avatar expression and embodiment event adapter',
38
+ entrypoint: './dist/index.js',
39
+ factory: 'NeutralBodyOrgan',
40
+ configKey: 'body',
41
+ configSchema: {
42
+ type: 'object',
43
+ required: ['provider'],
44
+ properties: {
45
+ provider: {
46
+ type: 'string',
47
+ enum: ['live2d', 'none']
48
+ },
49
+ initialExpression: {
50
+ type: 'string',
51
+ default: 'neutral'
52
+ }
53
+ }
54
+ },
55
+ environment: [],
56
+ services: [],
57
+ database: null,
58
+ healthCheck: null
59
+ },
60
+ {
61
+ name: '@siduri-x/brain',
62
+ organType: 'brain',
63
+ version: '1.0.0',
64
+ displayName: 'Brain (Cognition & Planning)',
65
+ description: 'Provider-neutral LLM reasoning, response planning, and proposal generation',
66
+ entrypoint: './dist/index.js',
67
+ factory: 'OpenRouterBrain',
68
+ configKey: 'brain',
69
+ configSchema: {
70
+ type: 'object',
71
+ required: ['provider', 'model'],
72
+ properties: {
73
+ provider: {
74
+ type: 'string',
75
+ enum: ['openrouter', 'openai-compatible']
76
+ },
77
+ model: {
78
+ type: 'string'
79
+ },
80
+ apiKey: {
81
+ type: 'string'
82
+ },
83
+ apiKeyEnv: {
84
+ type: 'string',
85
+ default: 'OPENROUTER_API_KEY'
86
+ },
87
+ baseUrl: {
88
+ type: 'string'
89
+ }
90
+ }
91
+ },
92
+ environment: [
93
+ {
94
+ name: 'OPENROUTER_API_KEY',
95
+ required: false,
96
+ secret: true,
97
+ description: 'API key for OpenRouter managed routing'
98
+ },
99
+ {
100
+ name: 'OPENAI_COMPATIBLE_API_KEY',
101
+ required: false,
102
+ secret: true,
103
+ description: 'API key for OpenAI-compatible endpoint'
104
+ }
105
+ ],
106
+ services: [
107
+ {
108
+ name: 'LLM Inference API',
109
+ kind: 'http_service',
110
+ optional: false
111
+ }
112
+ ],
113
+ database: null,
114
+ healthCheck: 'probeBrainHealth'
115
+ },
116
+ {
117
+ name: '@siduri-x/ear',
118
+ organType: 'ear',
119
+ version: '1.0.0',
120
+ displayName: 'Ear (Perception Ingress)',
121
+ description: 'Multi-modal sensory input ingestion, transcription bounds, and mime validation',
122
+ entrypoint: './dist/index.js',
123
+ factory: 'DefaultEarOrgan',
124
+ configKey: 'ear',
125
+ configSchema: {
126
+ type: 'object',
127
+ properties: {
128
+ defaultSource: {
129
+ type: 'string',
130
+ default: 'text_chat'
131
+ },
132
+ maxTextLength: {
133
+ type: 'number',
134
+ default: 4000
135
+ },
136
+ maxAudioBytes: {
137
+ type: 'number',
138
+ default: 10485760
139
+ }
140
+ }
141
+ },
142
+ environment: [],
143
+ services: [],
144
+ database: null,
145
+ healthCheck: null
146
+ },
147
+ {
148
+ name: '@siduri-x/hands',
149
+ organType: 'hands',
150
+ version: '1.0.0',
151
+ displayName: 'Hands (MCP Tool Execution)',
152
+ description: 'Model Context Protocol tool management and cryptographically authorized action execution',
153
+ entrypoint: './dist/index.js',
154
+ factory: 'DefaultHandsOrgan',
155
+ configKey: 'hands',
156
+ configSchema: {
157
+ type: 'object',
158
+ properties: {
159
+ defaultTimeoutMs: {
160
+ type: 'number',
161
+ default: 10000
162
+ },
163
+ providers: {
164
+ type: 'array',
165
+ items: {
166
+ type: 'object',
167
+ required: ['serverName'],
168
+ properties: {
169
+ serverName: {
170
+ type: 'string'
171
+ },
172
+ baseUrl: {
173
+ type: 'string'
174
+ },
175
+ command: {
176
+ type: 'string'
177
+ },
178
+ args: {
179
+ type: 'array',
180
+ items: {
181
+ type: 'string'
182
+ }
183
+ }
184
+ }
185
+ }
186
+ }
187
+ }
188
+ },
189
+ environment: [
190
+ {
191
+ name: 'ACTION_POLICY_SECRET',
192
+ required: false,
193
+ secret: true,
194
+ description: 'HMAC secret key for signing and verifying action execution capabilities (required in production)'
195
+ }
196
+ ],
197
+ services: [],
198
+ database: null,
199
+ healthCheck: 'probeHandsHealth'
200
+ },
201
+ {
202
+ name: '@siduri-x/knowledge',
203
+ organType: 'knowledge',
204
+ version: '1.0.0',
205
+ displayName: 'Knowledge (E-Compatible Cited Facts)',
206
+ description: 'Factual context retrieval from local or hosted E Knowledge packs',
207
+ entrypoint: './dist/index.js',
208
+ factory: 'EKnowledgeAdapter',
209
+ configKey: 'knowledge',
210
+ configSchema: {
211
+ type: 'object',
212
+ required: ['provider'],
213
+ properties: {
214
+ provider: {
215
+ type: 'string',
216
+ enum: ['e-knowledge', 'e-remote', 'e-hub', 'none']
217
+ },
218
+ packPath: {
219
+ type: 'string'
220
+ },
221
+ baseUrl: {
222
+ type: 'string'
223
+ },
224
+ registryUrl: {
225
+ type: 'string'
226
+ },
227
+ packId: {
228
+ type: 'string'
229
+ },
230
+ timeoutMs: {
231
+ type: 'number',
232
+ default: 5000
233
+ },
234
+ preferredMode: {
235
+ type: 'string',
236
+ enum: ['lexical', 'semantic', 'hybrid'],
237
+ default: 'lexical'
238
+ }
239
+ }
240
+ },
241
+ environment: [
242
+ {
243
+ name: 'SIDURI_KNOWLEDGE_PACK',
244
+ required: false,
245
+ secret: false,
246
+ description: 'Path to local E knowledge pack'
247
+ },
248
+ {
249
+ name: 'SIDURI_KNOWLEDGE_REGISTRY_URL',
250
+ required: false,
251
+ secret: false,
252
+ default: 'https://e.vxnus.xyz/api/v1/knowledge',
253
+ description: 'URL of the E Knowledge Hub registry'
254
+ }
255
+ ],
256
+ services: [
257
+ {
258
+ name: 'E Knowledge Hub',
259
+ kind: 'http_service',
260
+ optional: true
261
+ }
262
+ ],
263
+ database: null,
264
+ healthCheck: null
265
+ },
266
+ {
267
+ name: '@siduri-x/memory',
268
+ organType: 'memory',
269
+ version: '1.0.0',
270
+ displayName: 'Memory (PostgreSQL FTS Claims)',
271
+ description: 'Relational semantic claims with Full-Text Search and companion isolation',
272
+ entrypoint: './dist/index.js',
273
+ factory: 'PostgresMemoryOrgan',
274
+ configKey: 'memory',
275
+ configSchema: {
276
+ type: 'object',
277
+ required: ['provider'],
278
+ properties: {
279
+ provider: {
280
+ type: 'string',
281
+ enum: ['postgres']
282
+ },
283
+ deployment: {
284
+ type: 'string',
285
+ enum: ['local', 'neon', 'supabase', 'other']
286
+ },
287
+ connectionString: {
288
+ type: 'string'
289
+ },
290
+ maxConnections: {
291
+ type: 'number',
292
+ default: 10
293
+ }
294
+ }
295
+ },
296
+ environment: [
297
+ {
298
+ name: 'DATABASE_URL',
299
+ required: true,
300
+ secret: true,
301
+ default: 'postgresql://postgres:postgres@localhost:5432/siduri',
302
+ description: 'PostgreSQL connection string'
303
+ }
304
+ ],
305
+ services: [
306
+ {
307
+ name: 'PostgreSQL Database',
308
+ kind: 'database',
309
+ optional: false
310
+ }
311
+ ],
312
+ database: {
313
+ engine: 'postgres',
314
+ migrationsDir: './migrations'
315
+ },
316
+ healthCheck: 'probeMemoryHealth'
317
+ },
318
+ {
319
+ name: '@siduri-x/observation',
320
+ organType: 'observation',
321
+ version: '1.0.0',
322
+ displayName: 'Observation (Grounded Observation Ingestion)',
323
+ description: 'Cryptographically hashed video/image observation ingest and duplicate detection',
324
+ entrypoint: './dist/index.js',
325
+ factory: 'FixtureObservationOrgan',
326
+ configKey: 'observation',
327
+ configSchema: {
328
+ type: 'object',
329
+ properties: {}
330
+ },
331
+ environment: [],
332
+ services: [],
333
+ database: null,
334
+ healthCheck: null
335
+ },
336
+ {
337
+ name: '@siduri-x/vision',
338
+ organType: 'vision',
339
+ version: '1.0.0',
340
+ displayName: 'Vision (Visual Perception & OCR)',
341
+ description: 'Image inspection, cropping, and multi-pass OCR perception adapter',
342
+ entrypoint: './dist/index.js',
343
+ factory: 'OpenRouterVisionAdapter',
344
+ configKey: 'vision',
345
+ configSchema: {
346
+ type: 'object',
347
+ required: ['provider'],
348
+ properties: {
349
+ provider: {
350
+ type: 'string',
351
+ enum: ['openrouter', 'none']
352
+ },
353
+ model: {
354
+ type: 'string',
355
+ default: 'gpt-4-vision'
356
+ },
357
+ apiKey: {
358
+ type: 'string'
359
+ },
360
+ baseUrl: {
361
+ type: 'string'
362
+ }
363
+ }
364
+ },
365
+ environment: [
366
+ {
367
+ name: 'OPENROUTER_API_KEY',
368
+ required: false,
369
+ secret: true,
370
+ description: 'API key for vision model inference'
371
+ }
372
+ ],
373
+ services: [
374
+ {
375
+ name: 'Vision Inference API',
376
+ kind: 'http_service',
377
+ optional: false
378
+ }
379
+ ],
380
+ database: null,
381
+ healthCheck: null
382
+ },
383
+ {
384
+ name: '@siduri-x/voice',
385
+ organType: 'voice',
386
+ version: '1.0.0',
387
+ displayName: 'Voice (VOICEVOX Speech Synthesis)',
388
+ description: 'Queued speech synthesis and audio rendering lifecycle adapter',
389
+ entrypoint: './dist/index.js',
390
+ factory: 'VoicevoxAdapter',
391
+ configKey: 'voice',
392
+ configSchema: {
393
+ type: 'object',
394
+ required: ['provider'],
395
+ properties: {
396
+ provider: {
397
+ type: 'string',
398
+ enum: ['voicevox', 'none']
399
+ },
400
+ speakerId: {
401
+ type: 'number',
402
+ default: 1
403
+ },
404
+ baseUrl: {
405
+ type: 'string',
406
+ default: 'http://localhost:50021'
407
+ },
408
+ maxQueueDepth: {
409
+ type: 'number',
410
+ default: 50
411
+ }
412
+ }
413
+ },
414
+ environment: [
415
+ {
416
+ name: 'VOICEVOX_URL',
417
+ required: false,
418
+ secret: false,
419
+ default: 'http://localhost:50021',
420
+ description: 'Base URL of the running VOICEVOX engine'
421
+ }
422
+ ],
423
+ services: [
424
+ {
425
+ name: 'VOICEVOX Engine',
426
+ kind: 'http_service',
427
+ optional: false
428
+ }
429
+ ],
430
+ database: null,
431
+ healthCheck: null
432
+ }
433
+ ];
@@ -24,7 +24,7 @@ describe('Phase 5: Clean-Machine Distribution & E2E Integration Suite', () => {
24
24
  { filter: '@siduri-x/body', tarName: 'siduri-x-body-1.0.0.tgz', isOrgan: true },
25
25
  { filter: '@siduri-x/voice', tarName: 'siduri-x-voice-1.0.0.tgz', isOrgan: true },
26
26
  { filter: '@siduri-x/observation', tarName: 'siduri-x-observation-1.0.0.tgz', isOrgan: true },
27
- { filter: '@vxnus/siduri', tarName: 'vxnus-siduri-0.0.6.tgz', isOrgan: false },
27
+ { filter: '@vxnus/siduri', tarName: 'vxnus-siduri-0.0.8.tgz', isOrgan: false },
28
28
  ];
29
29
  beforeAll(() => {
30
30
  // 1. Prepare clean directories
@@ -0,0 +1,2 @@
1
+ import { OrganConfiguratorContext, OrganConfigurationResult } from './types';
2
+ export declare function configureBehavior(_context: OrganConfiguratorContext): Promise<OrganConfigurationResult>;
@@ -0,0 +1,36 @@
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
+ exports.configureBehavior = configureBehavior;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ async function configureBehavior(_context) {
9
+ const { preset } = await inquirer_1.default.prompt({
10
+ type: 'list',
11
+ name: 'preset',
12
+ message: 'Personality projection preset:',
13
+ choices: [
14
+ { name: 'Calm & Precise (Default)', value: 'calm_precise' },
15
+ { name: 'Cheerful & Enthusiastic', value: 'cheerful' },
16
+ { name: 'Analytical & Methodical', value: 'analytical' },
17
+ { name: 'Custom Directive State Machine', value: 'custom' },
18
+ ],
19
+ });
20
+ const presetLabels = {
21
+ calm_precise: 'Calm & Precise',
22
+ cheerful: 'Cheerful & Enthusiastic',
23
+ analytical: 'Analytical & Methodical',
24
+ custom: 'Custom Directives',
25
+ };
26
+ return {
27
+ config: {
28
+ provider: 'active_self',
29
+ preset,
30
+ },
31
+ summary: {
32
+ Provider: 'Active Self Directives',
33
+ Preset: presetLabels[preset] || preset,
34
+ },
35
+ };
36
+ }
@@ -0,0 +1,2 @@
1
+ import { OrganConfiguratorContext, OrganConfigurationResult } from './types';
2
+ export declare function configureBody(_context: OrganConfiguratorContext): Promise<OrganConfigurationResult>;
@@ -0,0 +1,44 @@
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
+ exports.configureBody = configureBody;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ async function configureBody(_context) {
9
+ const { provider } = await inquirer_1.default.prompt({
10
+ type: 'list',
11
+ name: 'provider',
12
+ message: 'Body avatar provider?',
13
+ choices: [
14
+ { name: 'Live2D Cubism (Interactive avatar motion & expression state)', value: 'live2d' },
15
+ { name: 'None (Headless / No visual body)', value: 'none' },
16
+ ],
17
+ });
18
+ if (provider === 'none') {
19
+ return {
20
+ config: { provider: 'none' },
21
+ summary: { Provider: 'None (Headless)' },
22
+ };
23
+ }
24
+ const { initialExpression } = await inquirer_1.default.prompt({
25
+ type: 'list',
26
+ name: 'initialExpression',
27
+ message: 'Initial avatar expression:',
28
+ choices: [
29
+ { name: 'Neutral', value: 'neutral' },
30
+ { name: 'Happy / Cheerful', value: 'happy' },
31
+ { name: 'Calm', value: 'calm' },
32
+ ],
33
+ });
34
+ return {
35
+ config: {
36
+ provider: 'live2d',
37
+ initialExpression,
38
+ },
39
+ summary: {
40
+ Provider: 'Live2D',
41
+ Expression: initialExpression,
42
+ },
43
+ };
44
+ }
@@ -0,0 +1,6 @@
1
+ import { OrganConfiguratorContext, OrganConfigurationResult } from './types';
2
+ import { ModelProvider } from '../providers/openrouter';
3
+ export interface BrainConfiguratorOptions {
4
+ modelProvider?: ModelProvider;
5
+ }
6
+ export declare function configureBrain(_context: OrganConfiguratorContext, options?: BrainConfiguratorOptions): Promise<OrganConfigurationResult>;
@@ -0,0 +1,80 @@
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
+ exports.configureBrain = configureBrain;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const openrouter_1 = require("../providers/openrouter");
9
+ async function configureBrain(_context, options = {}) {
10
+ const modelProvider = options.modelProvider || new openrouter_1.OpenRouterModelProvider();
11
+ while (true) {
12
+ const { provider } = await inquirer_1.default.prompt({
13
+ type: 'list',
14
+ name: 'provider',
15
+ message: 'Brain provider?',
16
+ choices: [
17
+ { name: 'OpenRouter (Managed Routing & Broad Model Access)', value: 'openrouter' },
18
+ { name: 'OpenAI-compatible / Custom endpoint (Ollama, vLLM, Azure, OpenAI)', value: 'openai-compatible' },
19
+ ],
20
+ });
21
+ if (provider === 'openrouter') {
22
+ const selection = await (0, openrouter_1.promptOpenRouterModelSelection)(modelProvider);
23
+ if (selection.type === 'switch_provider') {
24
+ continue;
25
+ }
26
+ if (selection.type === 'cancel') {
27
+ throw new Error('Brain configuration cancelled.');
28
+ }
29
+ const modelId = selection.modelId;
30
+ return {
31
+ config: {
32
+ provider: 'openrouter',
33
+ model: modelId,
34
+ apiKeyEnv: 'OPENROUTER_API_KEY',
35
+ },
36
+ summary: {
37
+ Provider: 'OpenRouter',
38
+ Model: modelId,
39
+ },
40
+ };
41
+ }
42
+ if (provider === 'openai-compatible') {
43
+ const answers = await inquirer_1.default.prompt([
44
+ {
45
+ type: 'input',
46
+ name: 'baseUrl',
47
+ message: 'Endpoint Base URL:',
48
+ default: 'https://api.openai.com/v1',
49
+ validate: (v) => v.trim().length > 0 || 'Base URL is required.',
50
+ },
51
+ {
52
+ type: 'input',
53
+ name: 'model',
54
+ message: 'Model ID (e.g. gpt-4o, llama3, mistral):',
55
+ default: 'gpt-4o',
56
+ validate: (v) => v.trim().length > 0 || 'Model ID is required.',
57
+ },
58
+ {
59
+ type: 'input',
60
+ name: 'apiKeyEnv',
61
+ message: 'API Key environment variable name:',
62
+ default: 'OPENAI_COMPATIBLE_API_KEY',
63
+ },
64
+ ]);
65
+ return {
66
+ config: {
67
+ provider: 'openai-compatible',
68
+ model: answers.model.trim(),
69
+ baseUrl: answers.baseUrl.trim(),
70
+ apiKeyEnv: answers.apiKeyEnv.trim() || 'OPENAI_COMPATIBLE_API_KEY',
71
+ },
72
+ summary: {
73
+ Provider: 'OpenAI-compatible',
74
+ Model: answers.model.trim(),
75
+ 'Base URL': answers.baseUrl.trim(),
76
+ },
77
+ };
78
+ }
79
+ }
80
+ }
@@ -0,0 +1,2 @@
1
+ import { OrganConfiguratorContext, OrganConfigurationResult } from './types';
2
+ export declare function configureEar(_context: OrganConfiguratorContext): Promise<OrganConfigurationResult>;
@@ -0,0 +1,28 @@
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
+ exports.configureEar = configureEar;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ async function configureEar(_context) {
9
+ const { defaultSource } = await inquirer_1.default.prompt({
10
+ type: 'list',
11
+ name: 'defaultSource',
12
+ message: 'Perception ingress channel:',
13
+ choices: [
14
+ { name: 'Text Chat (Standard multimodal chat ingress)', value: 'text_chat' },
15
+ { name: 'Audio Streaming Ingress', value: 'audio_stream' },
16
+ ],
17
+ });
18
+ return {
19
+ config: {
20
+ defaultSource,
21
+ maxTextLength: 4000,
22
+ maxAudioBytes: 10485760,
23
+ },
24
+ summary: {
25
+ 'Default Ingress': defaultSource === 'text_chat' ? 'Text Chat' : 'Audio Stream',
26
+ },
27
+ };
28
+ }
@@ -0,0 +1,2 @@
1
+ import { OrganConfiguratorContext, OrganConfigurationResult } from './types';
2
+ export declare function configureHands(_context: OrganConfiguratorContext): Promise<OrganConfigurationResult>;
@@ -0,0 +1,27 @@
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
+ exports.configureHands = configureHands;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ async function configureHands(_context) {
9
+ const { timeoutSeconds } = await inquirer_1.default.prompt({
10
+ type: 'input',
11
+ name: 'timeoutSeconds',
12
+ message: 'MCP Tool execution timeout (seconds):',
13
+ default: '10',
14
+ validate: (v) => (!isNaN(Number(v)) && Number(v) > 0) || 'Timeout must be a positive number.',
15
+ });
16
+ const timeoutMs = Math.round(Number(timeoutSeconds) * 1000);
17
+ return {
18
+ config: {
19
+ defaultTimeoutMs: timeoutMs,
20
+ providers: [],
21
+ },
22
+ summary: {
23
+ 'Default Timeout': `${timeoutSeconds}s`,
24
+ 'MCP Execution': 'Active Policy HMAC Protected',
25
+ },
26
+ };
27
+ }