@kernel.chat/kbot 2.9.1 → 2.10.1

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 (54) hide show
  1. package/README.md +5 -5
  2. package/dist/agent.js +1 -1
  3. package/dist/agent.js.map +1 -1
  4. package/dist/cli.js +221 -24
  5. package/dist/cli.js.map +1 -1
  6. package/dist/context-manager.d.ts.map +1 -1
  7. package/dist/context-manager.js +31 -5
  8. package/dist/context-manager.js.map +1 -1
  9. package/dist/context-manager.test.d.ts +2 -0
  10. package/dist/context-manager.test.d.ts.map +1 -0
  11. package/dist/context-manager.test.js +121 -0
  12. package/dist/context-manager.test.js.map +1 -0
  13. package/dist/export.d.ts +20 -0
  14. package/dist/export.d.ts.map +1 -0
  15. package/dist/export.js +301 -0
  16. package/dist/export.js.map +1 -0
  17. package/dist/ide/acp-server.js +2 -2
  18. package/dist/ide/acp-server.js.map +1 -1
  19. package/dist/marketplace.d.ts +25 -0
  20. package/dist/marketplace.d.ts.map +1 -0
  21. package/dist/marketplace.js +327 -0
  22. package/dist/marketplace.js.map +1 -0
  23. package/dist/rate-limiter.d.ts +45 -0
  24. package/dist/rate-limiter.d.ts.map +1 -0
  25. package/dist/rate-limiter.js +200 -0
  26. package/dist/rate-limiter.js.map +1 -0
  27. package/dist/sessions.test.d.ts +2 -0
  28. package/dist/sessions.test.d.ts.map +1 -0
  29. package/dist/sessions.test.js +55 -0
  30. package/dist/sessions.test.js.map +1 -0
  31. package/dist/streaming.d.ts.map +1 -1
  32. package/dist/streaming.js +87 -24
  33. package/dist/streaming.js.map +1 -1
  34. package/dist/streaming.test.d.ts +2 -0
  35. package/dist/streaming.test.d.ts.map +1 -0
  36. package/dist/streaming.test.js +41 -0
  37. package/dist/streaming.test.js.map +1 -0
  38. package/dist/tools/index.d.ts.map +1 -1
  39. package/dist/tools/index.js +3 -1
  40. package/dist/tools/index.js.map +1 -1
  41. package/dist/tools/test-runner.d.ts +2 -0
  42. package/dist/tools/test-runner.d.ts.map +1 -0
  43. package/dist/tools/test-runner.js +550 -0
  44. package/dist/tools/test-runner.js.map +1 -0
  45. package/dist/ui.js +1 -1
  46. package/dist/voice.d.ts +25 -0
  47. package/dist/voice.d.ts.map +1 -0
  48. package/dist/voice.js +336 -0
  49. package/dist/voice.js.map +1 -0
  50. package/dist/watch.d.ts +37 -0
  51. package/dist/watch.d.ts.map +1 -0
  52. package/dist/watch.js +369 -0
  53. package/dist/watch.js.map +1 -0
  54. package/package.json +3 -3
package/dist/voice.js ADDED
@@ -0,0 +1,336 @@
1
+ import { execSync, spawn } from 'node:child_process';
2
+ import { createInterface } from 'node:readline';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { existsSync, unlinkSync } from 'node:fs';
6
+ import chalk from 'chalk';
7
+ // ---------------------------------------------------------------------------
8
+ // Platform detection helpers
9
+ // ---------------------------------------------------------------------------
10
+ const platform = process.platform;
11
+ function commandExists(cmd) {
12
+ try {
13
+ execSync(`which ${cmd}`, { stdio: 'ignore' });
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ function detectTTSEngine() {
21
+ if (platform === 'darwin')
22
+ return 'say';
23
+ if (commandExists('espeak'))
24
+ return 'espeak';
25
+ if (commandExists('festival'))
26
+ return 'festival';
27
+ return null;
28
+ }
29
+ function detectSTT() {
30
+ return commandExists('whisper') || commandExists('whisper.cpp');
31
+ }
32
+ function detectRecorder() {
33
+ if (commandExists('rec'))
34
+ return 'rec';
35
+ if (commandExists('arecord'))
36
+ return 'arecord';
37
+ return null;
38
+ }
39
+ // ---------------------------------------------------------------------------
40
+ // Text sanitization
41
+ // ---------------------------------------------------------------------------
42
+ /** Strip markdown formatting so TTS reads clean prose. */
43
+ function stripMarkdown(text) {
44
+ let cleaned = text;
45
+ // Replace code blocks with a spoken description of the language
46
+ cleaned = cleaned.replace(/```(\w+)?\n[\s\S]*?```/g, (_match, lang) => {
47
+ return lang
48
+ ? `Here's a ${lang} snippet.`
49
+ : 'Here\'s a code snippet.';
50
+ });
51
+ // Remove inline code
52
+ cleaned = cleaned.replace(/`([^`]+)`/g, '$1');
53
+ // Remove headings markers
54
+ cleaned = cleaned.replace(/^#{1,6}\s+/gm, '');
55
+ // Remove bold / italic markers
56
+ cleaned = cleaned.replace(/\*{1,3}([^*]+)\*{1,3}/g, '$1');
57
+ cleaned = cleaned.replace(/_{1,3}([^_]+)_{1,3}/g, '$1');
58
+ // Remove strikethrough
59
+ cleaned = cleaned.replace(/~~([^~]+)~~/g, '$1');
60
+ // Remove links — keep the label
61
+ cleaned = cleaned.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1');
62
+ // Remove images
63
+ cleaned = cleaned.replace(/!\[([^\]]*)\]\([^)]+\)/g, '$1');
64
+ // Remove blockquote markers
65
+ cleaned = cleaned.replace(/^>\s+/gm, '');
66
+ // Remove horizontal rules
67
+ cleaned = cleaned.replace(/^[-*_]{3,}\s*$/gm, '');
68
+ // Remove list markers (unordered)
69
+ cleaned = cleaned.replace(/^[\s]*[-*+]\s+/gm, '');
70
+ // Remove list markers (ordered)
71
+ cleaned = cleaned.replace(/^[\s]*\d+\.\s+/gm, '');
72
+ // Collapse multiple newlines
73
+ cleaned = cleaned.replace(/\n{3,}/g, '\n\n');
74
+ return cleaned.trim();
75
+ }
76
+ /** Sanitize text for safe shell usage — strip characters that could be interpreted. */
77
+ function sanitizeForShell(text) {
78
+ // Remove characters that are dangerous in shell context
79
+ return text.replace(/[;&|`$(){}[\]!#\\]/g, '');
80
+ }
81
+ // ---------------------------------------------------------------------------
82
+ // 1. initVoice
83
+ // ---------------------------------------------------------------------------
84
+ export function initVoice(options) {
85
+ const ttsEngine = detectTTSEngine();
86
+ const sttAvailable = options?.stt ? detectSTT() : false;
87
+ const enabled = options?.tts !== false && ttsEngine !== null;
88
+ if (!ttsEngine) {
89
+ console.warn(chalk.yellow('⚠ No TTS engine found. ') +
90
+ (platform === 'darwin'
91
+ ? 'Expected "say" — this should be available on macOS.'
92
+ : 'Install espeak or festival for TTS support.'));
93
+ }
94
+ if (options?.stt && !sttAvailable) {
95
+ console.warn(chalk.yellow('⚠ STT requested but whisper not found. ') +
96
+ 'Install whisper.cpp or openai-whisper for speech-to-text.');
97
+ }
98
+ const defaultVoice = platform === 'darwin' ? 'Alex' : 'default';
99
+ return {
100
+ enabled,
101
+ sttAvailable,
102
+ voice: options?.voice ?? defaultVoice,
103
+ rate: options?.rate ?? 200,
104
+ };
105
+ }
106
+ // ---------------------------------------------------------------------------
107
+ // 2. speak
108
+ // ---------------------------------------------------------------------------
109
+ export async function speak(text, state) {
110
+ if (!state.enabled)
111
+ return;
112
+ // Kill any in-progress speech first
113
+ stopSpeaking(state);
114
+ const cleaned = sanitizeForShell(stripMarkdown(text));
115
+ if (!cleaned)
116
+ return;
117
+ const ttsEngine = detectTTSEngine();
118
+ if (!ttsEngine)
119
+ return;
120
+ return new Promise((resolve) => {
121
+ let proc;
122
+ switch (ttsEngine) {
123
+ case 'say':
124
+ proc = spawn('say', ['-v', state.voice, '-r', String(state.rate), cleaned], {
125
+ stdio: 'ignore',
126
+ });
127
+ break;
128
+ case 'espeak':
129
+ proc = spawn('espeak', [cleaned], {
130
+ stdio: 'ignore',
131
+ });
132
+ break;
133
+ case 'festival': {
134
+ proc = spawn('festival', ['--tts'], {
135
+ stdio: ['pipe', 'ignore', 'ignore'],
136
+ });
137
+ proc.stdin?.write(cleaned);
138
+ proc.stdin?.end();
139
+ break;
140
+ }
141
+ default:
142
+ resolve();
143
+ return;
144
+ }
145
+ state.ttsProcess = proc;
146
+ proc.on('close', () => {
147
+ if (state.ttsProcess === proc) {
148
+ state.ttsProcess = undefined;
149
+ }
150
+ resolve();
151
+ });
152
+ proc.on('error', () => {
153
+ if (state.ttsProcess === proc) {
154
+ state.ttsProcess = undefined;
155
+ }
156
+ resolve();
157
+ });
158
+ });
159
+ }
160
+ // ---------------------------------------------------------------------------
161
+ // 3. stopSpeaking
162
+ // ---------------------------------------------------------------------------
163
+ export function stopSpeaking(state) {
164
+ if (state.ttsProcess) {
165
+ state.ttsProcess.kill('SIGTERM');
166
+ state.ttsProcess = undefined;
167
+ }
168
+ }
169
+ // ---------------------------------------------------------------------------
170
+ // 4. listen
171
+ // ---------------------------------------------------------------------------
172
+ export async function listen(state) {
173
+ if (!state.sttAvailable) {
174
+ // Fall back to readline text input
175
+ return readlineInput();
176
+ }
177
+ const recorder = detectRecorder();
178
+ if (!recorder) {
179
+ console.warn(chalk.yellow('⚠ No audio recorder found (rec or arecord). Falling back to text input.'));
180
+ return readlineInput();
181
+ }
182
+ const tempFile = join(tmpdir(), `kbot-voice-${Date.now()}.wav`);
183
+ try {
184
+ // Record audio (up to 10 seconds)
185
+ console.log(chalk.cyan('🎙 Listening... (up to 10s, press Ctrl+C to stop)'));
186
+ await new Promise((resolve, reject) => {
187
+ let proc;
188
+ if (recorder === 'rec') {
189
+ // sox rec: record 16kHz mono WAV, max 10 seconds
190
+ proc = spawn('rec', [
191
+ tempFile,
192
+ 'rate', '16k',
193
+ 'channels', '1',
194
+ 'trim', '0', '10',
195
+ ], {
196
+ stdio: ['ignore', 'ignore', 'ignore'],
197
+ });
198
+ }
199
+ else {
200
+ // arecord: record 16kHz mono WAV, max 10 seconds
201
+ proc = spawn('arecord', [
202
+ '-f', 'S16_LE',
203
+ '-r', '16000',
204
+ '-c', '1',
205
+ '-d', '10',
206
+ tempFile,
207
+ ], {
208
+ stdio: ['ignore', 'ignore', 'ignore'],
209
+ });
210
+ }
211
+ proc.on('close', (code) => {
212
+ if (code === 0 || code === null) {
213
+ resolve();
214
+ }
215
+ else {
216
+ reject(new Error(`Recording failed with exit code ${code}`));
217
+ }
218
+ });
219
+ proc.on('error', (err) => reject(err));
220
+ });
221
+ if (!existsSync(tempFile)) {
222
+ console.warn(chalk.yellow('⚠ Recording failed — no audio file produced.'));
223
+ return readlineInput();
224
+ }
225
+ // Transcribe with whisper
226
+ console.log(chalk.dim('Transcribing...'));
227
+ const whisperCmd = commandExists('whisper') ? 'whisper' : 'whisper.cpp';
228
+ const transcription = execSync(`${whisperCmd} "${tempFile}" --model base --output_format txt --language en 2>/dev/null`, { encoding: 'utf-8', timeout: 30_000 }).trim();
229
+ return transcription || await readlineInput();
230
+ }
231
+ catch (err) {
232
+ const message = err instanceof Error ? err.message : String(err);
233
+ console.warn(chalk.yellow(`⚠ STT failed: ${message}. Falling back to text input.`));
234
+ return readlineInput();
235
+ }
236
+ finally {
237
+ // Clean up temp file
238
+ try {
239
+ if (existsSync(tempFile))
240
+ unlinkSync(tempFile);
241
+ }
242
+ catch {
243
+ // ignore cleanup errors
244
+ }
245
+ }
246
+ }
247
+ /** Readline fallback for text input when STT is unavailable. */
248
+ function readlineInput() {
249
+ return new Promise((resolve) => {
250
+ const rl = createInterface({
251
+ input: process.stdin,
252
+ output: process.stdout,
253
+ });
254
+ rl.question(chalk.cyan('You: '), (answer) => {
255
+ rl.close();
256
+ resolve(answer.trim());
257
+ });
258
+ });
259
+ }
260
+ // ---------------------------------------------------------------------------
261
+ // 5. listVoices
262
+ // ---------------------------------------------------------------------------
263
+ export function listVoices() {
264
+ const ttsEngine = detectTTSEngine();
265
+ if (!ttsEngine)
266
+ return [];
267
+ try {
268
+ switch (ttsEngine) {
269
+ case 'say': {
270
+ // macOS: `say -v ?` outputs lines like "Alex en_US # Most people recognize me by my voice."
271
+ const output = execSync('say -v ?', { encoding: 'utf-8' });
272
+ return output
273
+ .split('\n')
274
+ .filter(Boolean)
275
+ .map((line) => {
276
+ const match = line.match(/^(\S+)/);
277
+ return match ? match[1] : '';
278
+ })
279
+ .filter(Boolean);
280
+ }
281
+ case 'espeak': {
282
+ const output = execSync('espeak --voices', { encoding: 'utf-8' });
283
+ return output
284
+ .split('\n')
285
+ .slice(1) // skip header
286
+ .filter(Boolean)
287
+ .map((line) => {
288
+ const parts = line.trim().split(/\s+/);
289
+ // voice name is typically the 4th column
290
+ return parts[3] ?? '';
291
+ })
292
+ .filter(Boolean);
293
+ }
294
+ case 'festival': {
295
+ try {
296
+ const output = execSync('echo "(voice.list)" | festival --pipe 2>/dev/null', { encoding: 'utf-8' });
297
+ const match = output.match(/\(([^)]+)\)/);
298
+ if (match) {
299
+ return match[1].split(/\s+/).filter(Boolean);
300
+ }
301
+ }
302
+ catch {
303
+ // festival voice listing can be finicky
304
+ }
305
+ return [];
306
+ }
307
+ default:
308
+ return [];
309
+ }
310
+ }
311
+ catch {
312
+ return [];
313
+ }
314
+ }
315
+ // ---------------------------------------------------------------------------
316
+ // 6. formatVoiceStatus
317
+ // ---------------------------------------------------------------------------
318
+ export function formatVoiceStatus(state) {
319
+ const lines = [];
320
+ lines.push(chalk.bold('Voice Mode'));
321
+ lines.push('');
322
+ const ttsEngine = detectTTSEngine();
323
+ lines.push(` TTS: ${state.enabled
324
+ ? chalk.green('enabled') + chalk.dim(` (${ttsEngine ?? 'unknown'})`)
325
+ : chalk.red('disabled')}`);
326
+ lines.push(` Voice: ${chalk.cyan(state.voice)}`);
327
+ lines.push(` Rate: ${state.rate} wpm`);
328
+ lines.push(` STT: ${state.sttAvailable
329
+ ? chalk.green('available') + chalk.dim(' (whisper)')
330
+ : chalk.dim('not available')}`);
331
+ lines.push(` Speaking: ${state.ttsProcess
332
+ ? chalk.yellow('in progress')
333
+ : chalk.dim('idle')}`);
334
+ return lines.join('\n');
335
+ }
336
+ //# sourceMappingURL=voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.js","sourceRoot":"","sources":["../src/voice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export interface WatchOptions {
2
+ /** Directory to watch (default: cwd) */
3
+ path?: string;
4
+ /** File extensions to watch (default: common source extensions) */
5
+ extensions?: string[];
6
+ /** Whether to run analysis on changes (default: true) */
7
+ analyze?: boolean;
8
+ /** Callback for change events */
9
+ onChange?: (event: WatchEvent) => void;
10
+ }
11
+ export interface WatchEvent {
12
+ file: string;
13
+ type: 'change' | 'rename';
14
+ timestamp: Date;
15
+ analysis?: FileAnalysis;
16
+ }
17
+ export interface FileAnalysis {
18
+ todos: number;
19
+ debugStatements: number;
20
+ syntaxIssues: string[];
21
+ lineCount: number;
22
+ }
23
+ export declare function startWatch(path?: string, options?: WatchOptions): Promise<void>;
24
+ export declare function stopWatch(): void;
25
+ /**
26
+ * Get the recent change log (last 20 file changes).
27
+ */
28
+ export declare function getChangeLog(): WatchEvent[];
29
+ /**
30
+ * Clear the change log.
31
+ */
32
+ export declare function clearChangeLog(): void;
33
+ /**
34
+ * Check whether the watcher is currently active.
35
+ */
36
+ export declare function isWatching(): boolean;
37
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;CACvC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAA;IACzB,SAAS,EAAE,IAAI,CAAA;IACf,QAAQ,CAAC,EAAE,YAAY,CAAA;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAySD,wBAAsB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgGrF;AAED,wBAAgB,SAAS,IAAI,IAAI,CAahC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,UAAU,EAAE,CAE3C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC"}