@kernel.chat/kbot 3.36.0 → 3.38.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.
@@ -0,0 +1,525 @@
1
+ // kbot Voice Loop — Full voice conversation loop
2
+ //
3
+ // Continuous voice conversation: listen → transcribe → think → speak → loop
4
+ //
5
+ // Uses:
6
+ // - macOS `say` for text-to-speech (free, pre-installed)
7
+ // - `rec` (sox) or macOS `rec` for audio recording
8
+ // - Whisper API (OpenAI) or local whisper.cpp for speech-to-text
9
+ // - Ollama at localhost:11434 for agent inference
10
+ //
11
+ // Usage:
12
+ // import { runVoiceLoop } from './voice-loop.js'
13
+ // await runVoiceLoop({ voice: 'Samantha', model: 'base', agent: 'auto' })
14
+ import { execSync, spawn } from 'node:child_process';
15
+ import { createInterface } from 'node:readline';
16
+ import { tmpdir, homedir } from 'node:os';
17
+ import { join } from 'node:path';
18
+ import { existsSync, unlinkSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
19
+ import chalk from 'chalk';
20
+ // ---------------------------------------------------------------------------
21
+ // Constants
22
+ // ---------------------------------------------------------------------------
23
+ const KBOT_DIR = join(homedir(), '.kbot');
24
+ const VOICE_LOG_DIR = join(KBOT_DIR, 'voice-logs');
25
+ const OLLAMA_HOST_DEFAULT = process.env.OLLAMA_HOST || 'http://localhost:11434';
26
+ const ACCENT = chalk.hex('#A78BFA');
27
+ const DIM = chalk.dim;
28
+ // ---------------------------------------------------------------------------
29
+ // Platform detection
30
+ // ---------------------------------------------------------------------------
31
+ function commandExists(cmd) {
32
+ try {
33
+ execSync(`which ${cmd}`, { stdio: 'ignore' });
34
+ return true;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ }
40
+ function detectRecorder() {
41
+ if (commandExists('rec'))
42
+ return 'rec';
43
+ if (commandExists('arecord'))
44
+ return 'arecord';
45
+ return 'none';
46
+ }
47
+ function detectWhisperBackend(openaiKey) {
48
+ // Prefer local whisper.cpp (free, private)
49
+ if (commandExists('whisper') || commandExists('whisper.cpp') || commandExists('whisper-cpp'))
50
+ return 'local';
51
+ // Fallback to OpenAI Whisper API
52
+ if (openaiKey)
53
+ return 'api';
54
+ // Try loading from kbot config
55
+ const configKey = loadOpenAIKeyFromConfig();
56
+ if (configKey)
57
+ return 'api';
58
+ return 'none';
59
+ }
60
+ function detectTTS() {
61
+ return process.platform === 'darwin' && commandExists('say');
62
+ }
63
+ function loadOpenAIKeyFromConfig() {
64
+ const configPath = join(KBOT_DIR, 'config.json');
65
+ if (!existsSync(configPath))
66
+ return null;
67
+ try {
68
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
69
+ // OpenAI key may be stored under 'openai' provider
70
+ if (config.providers?.openai?.apiKey)
71
+ return config.providers.openai.apiKey;
72
+ if (config.apiKey && config.provider === 'openai')
73
+ return config.apiKey;
74
+ }
75
+ catch { /* ignore */ }
76
+ return null;
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // Text cleaning for TTS
80
+ // ---------------------------------------------------------------------------
81
+ function stripMarkdownForSpeech(text) {
82
+ let cleaned = text;
83
+ // Replace code blocks with spoken description
84
+ cleaned = cleaned.replace(/```(\w+)?\n[\s\S]*?```/g, (_match, lang) => lang ? `Here's a ${lang} code snippet.` : 'Here\'s a code snippet.');
85
+ // Remove inline code backticks
86
+ cleaned = cleaned.replace(/`([^`]+)`/g, '$1');
87
+ // Remove heading markers
88
+ cleaned = cleaned.replace(/^#{1,6}\s+/gm, '');
89
+ // Remove bold/italic markers
90
+ cleaned = cleaned.replace(/\*{1,3}([^*]+)\*{1,3}/g, '$1');
91
+ cleaned = cleaned.replace(/_{1,3}([^_]+)_{1,3}/g, '$1');
92
+ // Remove links — keep label
93
+ cleaned = cleaned.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1');
94
+ // Remove images
95
+ cleaned = cleaned.replace(/!\[([^\]]*)\]\([^)]+\)/g, '$1');
96
+ // Remove blockquote markers
97
+ cleaned = cleaned.replace(/^>\s+/gm, '');
98
+ // Remove list markers
99
+ cleaned = cleaned.replace(/^[\s]*[-*+]\s+/gm, '');
100
+ cleaned = cleaned.replace(/^[\s]*\d+\.\s+/gm, '');
101
+ // Collapse whitespace
102
+ cleaned = cleaned.replace(/\n{3,}/g, '\n\n');
103
+ return cleaned.trim();
104
+ }
105
+ function sanitizeForShell(text) {
106
+ return text.replace(/[;&|`$(){}[\]!#\\]/g, '');
107
+ }
108
+ // ---------------------------------------------------------------------------
109
+ // Audio recording
110
+ // ---------------------------------------------------------------------------
111
+ async function recordAudio(outputPath, recorder, maxSeconds, silenceThreshold) {
112
+ return new Promise((resolve) => {
113
+ let proc;
114
+ if (recorder === 'rec') {
115
+ // sox rec: 16kHz mono WAV, stop on silence after speech detected
116
+ // silence 1 0.1 3% = start recording after sound above 3%
117
+ // silence 1 2.0 3% = stop recording after 2s of silence below 3%
118
+ proc = spawn('rec', [
119
+ outputPath,
120
+ 'rate', '16k',
121
+ 'channels', '1',
122
+ 'silence', '1', '0.1', `${silenceThreshold}%`,
123
+ '1', '2.0', `${silenceThreshold}%`,
124
+ 'trim', '0', String(maxSeconds),
125
+ ], {
126
+ stdio: ['ignore', 'ignore', 'ignore'],
127
+ });
128
+ }
129
+ else {
130
+ // arecord: record 16kHz mono WAV with fixed duration
131
+ proc = spawn('arecord', [
132
+ '-f', 'S16_LE',
133
+ '-r', '16000',
134
+ '-c', '1',
135
+ '-d', String(maxSeconds),
136
+ outputPath,
137
+ ], {
138
+ stdio: ['ignore', 'ignore', 'ignore'],
139
+ });
140
+ }
141
+ // Safety timeout — kill if recording hangs
142
+ const timeout = setTimeout(() => {
143
+ proc.kill('SIGTERM');
144
+ }, (maxSeconds + 5) * 1000);
145
+ proc.on('close', () => {
146
+ clearTimeout(timeout);
147
+ resolve(existsSync(outputPath));
148
+ });
149
+ proc.on('error', () => {
150
+ clearTimeout(timeout);
151
+ resolve(false);
152
+ });
153
+ });
154
+ }
155
+ // ---------------------------------------------------------------------------
156
+ // Speech-to-text (Whisper)
157
+ // ---------------------------------------------------------------------------
158
+ function getLocalWhisperCommand() {
159
+ if (commandExists('whisper'))
160
+ return 'whisper';
161
+ if (commandExists('whisper.cpp'))
162
+ return 'whisper.cpp';
163
+ if (commandExists('whisper-cpp'))
164
+ return 'whisper-cpp';
165
+ return null;
166
+ }
167
+ async function transcribeLocal(audioPath, model, language) {
168
+ const cmd = getLocalWhisperCommand();
169
+ if (!cmd)
170
+ throw new Error('No local whisper binary found');
171
+ // whisper.cpp and openai-whisper have slightly different flags
172
+ // Both support --model and --language
173
+ const output = execSync(`${cmd} "${audioPath}" --model ${model} --language ${language} --output_format txt 2>/dev/null`, { encoding: 'utf-8', timeout: 60_000 }).trim();
174
+ return output;
175
+ }
176
+ async function transcribeWithAPI(audioPath, apiKey, language) {
177
+ // Use OpenAI Whisper API via curl (no external deps needed)
178
+ const output = execSync(`curl -s https://api.openai.com/v1/audio/transcriptions ` +
179
+ `-H "Authorization: Bearer ${apiKey}" ` +
180
+ `-F "file=@${audioPath}" ` +
181
+ `-F "model=whisper-1" ` +
182
+ `-F "language=${language}" ` +
183
+ `-F "response_format=text"`, { encoding: 'utf-8', timeout: 30_000 }).trim();
184
+ return output;
185
+ }
186
+ async function transcribe(audioPath, state, openaiKey) {
187
+ // Try local whisper first
188
+ if (state.whisperBackend === 'local') {
189
+ try {
190
+ const text = await transcribeLocal(audioPath, state.model, state.language);
191
+ if (text)
192
+ return { text, source: 'whisper-local' };
193
+ }
194
+ catch {
195
+ // Fall through to API
196
+ }
197
+ }
198
+ // Try OpenAI Whisper API
199
+ const key = openaiKey || loadOpenAIKeyFromConfig();
200
+ if (key) {
201
+ try {
202
+ const text = await transcribeWithAPI(audioPath, key, state.language);
203
+ if (text)
204
+ return { text, source: 'whisper-api' };
205
+ }
206
+ catch {
207
+ // Fall through to text input
208
+ }
209
+ }
210
+ return { text: '', source: 'text-fallback' };
211
+ }
212
+ // ---------------------------------------------------------------------------
213
+ // Text-to-speech
214
+ // ---------------------------------------------------------------------------
215
+ async function speakText(text, voice, rate) {
216
+ if (!detectTTS())
217
+ return;
218
+ const cleaned = sanitizeForShell(stripMarkdownForSpeech(text));
219
+ if (!cleaned)
220
+ return;
221
+ return new Promise((resolve) => {
222
+ const proc = spawn('say', ['-v', voice, '-r', String(rate), cleaned], {
223
+ stdio: 'ignore',
224
+ });
225
+ proc.on('close', () => resolve());
226
+ proc.on('error', () => resolve());
227
+ });
228
+ }
229
+ // ---------------------------------------------------------------------------
230
+ // Ollama chat
231
+ // ---------------------------------------------------------------------------
232
+ async function chatWithOllama(message, conversationHistory, ollamaHost, ollamaModel, agent) {
233
+ const systemPrompt = buildVoiceSystemPrompt(agent);
234
+ const messages = [
235
+ { role: 'system', content: systemPrompt },
236
+ ...conversationHistory.slice(-10), // Keep last 10 turns for context
237
+ { role: 'user', content: message },
238
+ ];
239
+ const body = JSON.stringify({
240
+ model: ollamaModel,
241
+ messages,
242
+ stream: false,
243
+ options: {
244
+ temperature: 0.7,
245
+ num_predict: 500, // Keep responses concise for voice
246
+ },
247
+ });
248
+ const res = await fetch(`${ollamaHost}/api/chat`, {
249
+ method: 'POST',
250
+ headers: { 'Content-Type': 'application/json' },
251
+ body,
252
+ signal: AbortSignal.timeout(60_000),
253
+ });
254
+ if (!res.ok) {
255
+ const errText = await res.text().catch(() => '');
256
+ throw new Error(`Ollama returned ${res.status}: ${errText.slice(0, 200)}`);
257
+ }
258
+ const data = await res.json();
259
+ return data.message?.content?.trim() || '(no response)';
260
+ }
261
+ function buildVoiceSystemPrompt(agent) {
262
+ const base = [
263
+ 'You are kbot, a helpful AI assistant in a voice conversation.',
264
+ 'Keep your responses concise and conversational — the user is listening, not reading.',
265
+ 'Avoid code blocks, markdown formatting, and long lists.',
266
+ 'Prefer short, direct answers. If a topic needs detail, ask if the user wants to go deeper.',
267
+ 'Speak naturally, as if having a face-to-face conversation.',
268
+ ];
269
+ if (agent !== 'auto') {
270
+ base.push(`You are acting as the "${agent}" specialist agent.`);
271
+ }
272
+ return base.join(' ');
273
+ }
274
+ // ---------------------------------------------------------------------------
275
+ // Ollama availability check
276
+ // ---------------------------------------------------------------------------
277
+ async function checkOllama(host) {
278
+ try {
279
+ const res = await fetch(`${host}/api/tags`, { signal: AbortSignal.timeout(3000) });
280
+ return res.ok;
281
+ }
282
+ catch {
283
+ return false;
284
+ }
285
+ }
286
+ // ---------------------------------------------------------------------------
287
+ // Text input fallback
288
+ // ---------------------------------------------------------------------------
289
+ function readlineInput(prompt) {
290
+ return new Promise((resolve) => {
291
+ const rl = createInterface({
292
+ input: process.stdin,
293
+ output: process.stdout,
294
+ });
295
+ rl.question(prompt, (answer) => {
296
+ rl.close();
297
+ resolve(answer.trim());
298
+ });
299
+ });
300
+ }
301
+ // ---------------------------------------------------------------------------
302
+ // Voice session logging
303
+ // ---------------------------------------------------------------------------
304
+ function ensureLogDir() {
305
+ if (!existsSync(VOICE_LOG_DIR))
306
+ mkdirSync(VOICE_LOG_DIR, { recursive: true });
307
+ }
308
+ function logVoiceSession(history) {
309
+ ensureLogDir();
310
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
311
+ const logPath = join(VOICE_LOG_DIR, `voice-${timestamp}.json`);
312
+ try {
313
+ writeFileSync(logPath, JSON.stringify({
314
+ timestamp: new Date().toISOString(),
315
+ turns: history.length,
316
+ conversation: history,
317
+ }, null, 2));
318
+ }
319
+ catch { /* non-critical */ }
320
+ }
321
+ // ---------------------------------------------------------------------------
322
+ // Initialize state
323
+ // ---------------------------------------------------------------------------
324
+ function initState(options) {
325
+ const openaiKey = options?.openaiApiKey || loadOpenAIKeyFromConfig() || undefined;
326
+ return {
327
+ running: false,
328
+ voice: options?.voice ?? 'Samantha',
329
+ model: options?.model ?? 'base',
330
+ agent: options?.agent ?? 'auto',
331
+ language: options?.language ?? 'en',
332
+ rate: options?.rate ?? 190,
333
+ maxRecordSeconds: options?.maxRecordSeconds ?? 15,
334
+ silenceThreshold: options?.silenceThreshold ?? '1.5',
335
+ ollamaHost: options?.ollamaHost ?? OLLAMA_HOST_DEFAULT,
336
+ ollamaModel: options?.ollamaModel ?? 'gemma3:12b',
337
+ whisperBackend: detectWhisperBackend(openaiKey),
338
+ recorder: detectRecorder(),
339
+ ttsAvailable: detectTTS(),
340
+ turnCount: 0,
341
+ conversationHistory: [],
342
+ };
343
+ }
344
+ // ---------------------------------------------------------------------------
345
+ // Print status
346
+ // ---------------------------------------------------------------------------
347
+ function printVoiceStatus(state) {
348
+ console.log();
349
+ console.log(ACCENT.bold(' kbot Voice Loop'));
350
+ console.log(ACCENT(' ' + '='.repeat(40)));
351
+ console.log();
352
+ console.log(` ${DIM('TTS:')} ${state.ttsAvailable ? chalk.green('say') + DIM(` (${state.voice}, ${state.rate} wpm)`) : chalk.red('unavailable')}`);
353
+ console.log(` ${DIM('STT:')} ${state.whisperBackend === 'local' ? chalk.green('whisper (local)') : state.whisperBackend === 'api' ? chalk.yellow('OpenAI Whisper API') : chalk.red('unavailable')}`);
354
+ console.log(` ${DIM('Recorder:')} ${state.recorder !== 'none' ? chalk.green(state.recorder) : chalk.red('none — will use text input')}`);
355
+ console.log(` ${DIM('LLM:')} ${chalk.cyan(`${state.ollamaModel} @ ${state.ollamaHost}`)}`);
356
+ console.log(` ${DIM('Agent:')} ${chalk.cyan(state.agent)}`);
357
+ console.log(` ${DIM('Language:')} ${state.language}`);
358
+ console.log();
359
+ console.log(DIM(' Say "exit", "quit", or "goodbye" to end the conversation.'));
360
+ console.log(DIM(' Press Ctrl+C to stop at any time.'));
361
+ console.log();
362
+ }
363
+ // ---------------------------------------------------------------------------
364
+ // Main: runVoiceLoop
365
+ // ---------------------------------------------------------------------------
366
+ /**
367
+ * Run the kbot voice conversation loop.
368
+ *
369
+ * 1. Print status banner
370
+ * 2. Record audio until silence detected (or accept text input)
371
+ * 3. Transcribe with Whisper (local or API)
372
+ * 4. Route to Ollama for agent inference
373
+ * 5. Speak the response with macOS `say`
374
+ * 6. Loop back to step 2
375
+ */
376
+ export async function runVoiceLoop(options) {
377
+ const state = initState(options);
378
+ // Check Ollama availability
379
+ const ollamaUp = await checkOllama(state.ollamaHost);
380
+ if (!ollamaUp) {
381
+ console.error(chalk.red(`\n Ollama is not running at ${state.ollamaHost}`));
382
+ console.error(chalk.yellow(' Start Ollama with: ollama serve'));
383
+ console.error(chalk.yellow(` Then pull a model: ollama pull ${state.ollamaModel}`));
384
+ return;
385
+ }
386
+ printVoiceStatus(state);
387
+ state.running = true;
388
+ // Handle Ctrl+C gracefully
389
+ const cleanup = () => {
390
+ if (state.running) {
391
+ state.running = false;
392
+ console.log(chalk.dim('\n\n Voice loop ended.'));
393
+ logVoiceSession(state.conversationHistory);
394
+ }
395
+ };
396
+ process.on('SIGINT', cleanup);
397
+ process.on('SIGTERM', cleanup);
398
+ // Greeting
399
+ const greeting = 'Hey! I\'m kbot. What can I help you with?';
400
+ console.log(ACCENT(` kbot: `) + greeting);
401
+ if (state.ttsAvailable) {
402
+ await speakText(greeting, state.voice, state.rate);
403
+ }
404
+ // Main conversation loop
405
+ while (state.running) {
406
+ let userText;
407
+ // Step 1: Get user input (audio or text)
408
+ if (state.recorder !== 'none' && state.whisperBackend !== 'none') {
409
+ // Audio path
410
+ console.log(chalk.cyan('\n \uD83C\uDF99 Listening...'));
411
+ const tempFile = join(tmpdir(), `kbot-voice-${Date.now()}.wav`);
412
+ try {
413
+ const recorded = await recordAudio(tempFile, state.recorder, state.maxRecordSeconds, state.silenceThreshold);
414
+ if (!recorded || !existsSync(tempFile)) {
415
+ console.log(chalk.yellow(' No audio captured. Type your message instead:'));
416
+ userText = await readlineInput(chalk.cyan(' You: '));
417
+ }
418
+ else {
419
+ // Step 2: Transcribe
420
+ process.stdout.write(DIM(' Transcribing...'));
421
+ const result = await transcribe(tempFile, state, options?.openaiApiKey);
422
+ if (result.text) {
423
+ process.stdout.write(`\r ${DIM('[')}${DIM(result.source)}${DIM(']')} `);
424
+ console.log(chalk.white(result.text));
425
+ userText = result.text;
426
+ }
427
+ else {
428
+ console.log(chalk.yellow('\r Could not transcribe. Type your message instead:'));
429
+ userText = await readlineInput(chalk.cyan(' You: '));
430
+ }
431
+ }
432
+ // Clean up temp file
433
+ try {
434
+ if (existsSync(tempFile))
435
+ unlinkSync(tempFile);
436
+ }
437
+ catch { /* ignore */ }
438
+ }
439
+ catch {
440
+ console.log(chalk.yellow(' Recording error. Type your message instead:'));
441
+ userText = await readlineInput(chalk.cyan(' You: '));
442
+ }
443
+ }
444
+ else {
445
+ // Text-only mode
446
+ userText = await readlineInput(chalk.cyan('\n You: '));
447
+ }
448
+ if (!userText || !state.running)
449
+ continue;
450
+ // Check for exit commands
451
+ const exitCommands = ['exit', 'quit', 'goodbye', 'bye', 'stop', 'end'];
452
+ if (exitCommands.includes(userText.toLowerCase().trim())) {
453
+ const farewell = 'Goodbye! Talk to you later.';
454
+ console.log(ACCENT(' kbot: ') + farewell);
455
+ if (state.ttsAvailable) {
456
+ await speakText(farewell, state.voice, state.rate);
457
+ }
458
+ state.running = false;
459
+ break;
460
+ }
461
+ // Step 3: Route to Ollama
462
+ state.conversationHistory.push({ role: 'user', content: userText });
463
+ state.turnCount++;
464
+ process.stdout.write(DIM(' Thinking...'));
465
+ try {
466
+ const response = await chatWithOllama(userText, state.conversationHistory, state.ollamaHost, state.ollamaModel, state.agent);
467
+ // Clear "Thinking..." line
468
+ process.stdout.write('\r' + ' '.repeat(40) + '\r');
469
+ // Step 4: Display and speak the response
470
+ console.log(ACCENT(' kbot: ') + response);
471
+ state.conversationHistory.push({ role: 'assistant', content: response });
472
+ // Step 5: Speak
473
+ if (state.ttsAvailable) {
474
+ await speakText(response, state.voice, state.rate);
475
+ }
476
+ }
477
+ catch (err) {
478
+ process.stdout.write('\r' + ' '.repeat(40) + '\r');
479
+ const message = err instanceof Error ? err.message : String(err);
480
+ console.log(chalk.red(` Error: ${message}`));
481
+ // Try to speak the error
482
+ if (state.ttsAvailable) {
483
+ await speakText('Sorry, I encountered an error. Please try again.', state.voice, state.rate);
484
+ }
485
+ }
486
+ }
487
+ // Save session log
488
+ logVoiceSession(state.conversationHistory);
489
+ process.removeListener('SIGINT', cleanup);
490
+ process.removeListener('SIGTERM', cleanup);
491
+ }
492
+ // ---------------------------------------------------------------------------
493
+ // Utility exports
494
+ // ---------------------------------------------------------------------------
495
+ /** Get the current voice loop state description (for diagnostics) */
496
+ export function describeVoiceCapabilities() {
497
+ const state = initState();
498
+ const lines = [
499
+ 'Voice Loop Capabilities:',
500
+ ` TTS: ${state.ttsAvailable ? 'available (macOS say)' : 'unavailable'}`,
501
+ ` STT: ${state.whisperBackend === 'local' ? 'whisper (local)' : state.whisperBackend === 'api' ? 'OpenAI API' : 'unavailable'}`,
502
+ ` Recorder: ${state.recorder !== 'none' ? state.recorder : 'unavailable'}`,
503
+ ];
504
+ return lines.join('\n');
505
+ }
506
+ /** List available macOS voices */
507
+ export function listMacVoices() {
508
+ if (process.platform !== 'darwin')
509
+ return [];
510
+ try {
511
+ const output = execSync('say -v ?', { encoding: 'utf-8' });
512
+ return output
513
+ .split('\n')
514
+ .filter(Boolean)
515
+ .map((line) => {
516
+ const match = line.match(/^(\S+)/);
517
+ return match ? match[1] : '';
518
+ })
519
+ .filter(Boolean);
520
+ }
521
+ catch {
522
+ return [];
523
+ }
524
+ }
525
+ //# sourceMappingURL=voice-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-loop.js","sourceRoot":"","sources":["../src/voice-loop.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kernel.chat/kbot",
3
- "version": "3.36.0",
3
+ "version": "3.38.0",
4
4
  "description": "The only AI agent that builds its own tools — and defends itself. Self-Defense System: HMAC memory integrity, prompt injection detection, knowledge sanitization, forge verification, anomaly detection, incident logging. Cybersecurity tools: dep_audit, secret_scan, ssl_check, headers_check, cve_lookup, port_scan, owasp_check. Machine-aware situated intelligence: full hardware profiling (CPU, GPU, RAM, display, battery, dev tools), resource-adaptive tool pipeline, memory-pressure throttling, GPU-accelerated model routing. Multi-channel cognitive engine: email agent, iMessage agent, consultation pipeline, Trader agent with paper trading & DeFi, 26 specialist agents, 345+ tools, 20 providers. Finance stack: 31 tools across market data, wallet & swaps, stocks, and sentiment. Synthesis Engine: closed-loop intelligence compounding. Runtime tool forging, Forge Registry, autopoietic health, immune self-audit. Cost-aware model routing, fallback chains, Bayesian skill routing. 11 local models (Llama 3.3, Qwen 3, DeepSeek R1, Codestral 22B). Embedded llama.cpp, MCP server, SDK. MIT.",
5
5
  "type": "module",
6
6
  "repository": {