@stevederico/dotbot 0.20.0 → 0.20.2
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/CHANGELOG.md +8 -0
- package/bin/dotbot.js +48 -12
- package/dotbot.db +0 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/bin/dotbot.js
CHANGED
|
@@ -22,9 +22,17 @@ process.emit = function (event, error) {
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import { parseArgs } from 'node:util';
|
|
25
|
+
import { readFileSync } from 'node:fs';
|
|
26
|
+
import { fileURLToPath } from 'node:url';
|
|
27
|
+
import { dirname, join } from 'node:path';
|
|
25
28
|
import * as readline from 'node:readline';
|
|
26
29
|
import { createServer } from 'node:http';
|
|
27
30
|
|
|
31
|
+
// Read version from package.json
|
|
32
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
33
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8'));
|
|
34
|
+
const VERSION = pkg.version;
|
|
35
|
+
|
|
28
36
|
// Lazy-loaded modules (avoid SQLite import on --help)
|
|
29
37
|
let stores = null;
|
|
30
38
|
let coreTools = null;
|
|
@@ -49,11 +57,30 @@ async function loadModules() {
|
|
|
49
57
|
AI_PROVIDERS = mod.AI_PROVIDERS;
|
|
50
58
|
agentLoop = mod.agentLoop;
|
|
51
59
|
}
|
|
52
|
-
|
|
53
|
-
const VERSION = '0.19';
|
|
54
60
|
const DEFAULT_PORT = 3000;
|
|
55
61
|
const DEFAULT_DB = './dotbot.db';
|
|
56
62
|
|
|
63
|
+
// Spinner for tool execution feedback
|
|
64
|
+
let spinnerInterval = null;
|
|
65
|
+
|
|
66
|
+
function startSpinner() {
|
|
67
|
+
spinnerInterval = setInterval(() => {
|
|
68
|
+
process.stdout.write('.');
|
|
69
|
+
}, 300);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function stopSpinner(text = 'done') {
|
|
73
|
+
if (spinnerInterval) {
|
|
74
|
+
clearInterval(spinnerInterval);
|
|
75
|
+
spinnerInterval = null;
|
|
76
|
+
if (text) {
|
|
77
|
+
process.stdout.write(` ${text}\n`);
|
|
78
|
+
} else {
|
|
79
|
+
process.stdout.write('\n');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
57
84
|
/**
|
|
58
85
|
* Print help message.
|
|
59
86
|
*/
|
|
@@ -210,7 +237,8 @@ async function runChat(message, options) {
|
|
|
210
237
|
|
|
211
238
|
const messages = [{ role: 'user', content: message }];
|
|
212
239
|
|
|
213
|
-
process.stdout.write('\n');
|
|
240
|
+
process.stdout.write('\n[thinking] ');
|
|
241
|
+
startSpinner();
|
|
214
242
|
|
|
215
243
|
for await (const event of agentLoop({
|
|
216
244
|
model: options.model,
|
|
@@ -221,18 +249,21 @@ async function runChat(message, options) {
|
|
|
221
249
|
})) {
|
|
222
250
|
switch (event.type) {
|
|
223
251
|
case 'thinking':
|
|
224
|
-
|
|
225
|
-
process.stdout.write(`\x1b[2m${event.text}\x1b[0m`);
|
|
226
|
-
}
|
|
252
|
+
// Already showing spinner, ignore thinking events
|
|
227
253
|
break;
|
|
228
254
|
case 'text_delta':
|
|
255
|
+
stopSpinner(''); // Stop thinking spinner silently
|
|
229
256
|
process.stdout.write(event.text);
|
|
230
257
|
break;
|
|
231
258
|
case 'tool_start':
|
|
232
259
|
process.stdout.write(`\n[${event.name}] `);
|
|
260
|
+
startSpinner();
|
|
233
261
|
break;
|
|
234
262
|
case 'tool_result':
|
|
235
|
-
|
|
263
|
+
stopSpinner('done');
|
|
264
|
+
break;
|
|
265
|
+
case 'tool_error':
|
|
266
|
+
stopSpinner('error');
|
|
236
267
|
break;
|
|
237
268
|
case 'error':
|
|
238
269
|
console.error(`\nError: ${event.error}`);
|
|
@@ -295,7 +326,8 @@ async function runRepl(options) {
|
|
|
295
326
|
|
|
296
327
|
messages.push({ role: 'user', content: trimmed });
|
|
297
328
|
|
|
298
|
-
process.stdout.write('\n');
|
|
329
|
+
process.stdout.write('\n[thinking] ');
|
|
330
|
+
startSpinner();
|
|
299
331
|
let assistantContent = '';
|
|
300
332
|
|
|
301
333
|
try {
|
|
@@ -308,21 +340,25 @@ async function runRepl(options) {
|
|
|
308
340
|
})) {
|
|
309
341
|
switch (event.type) {
|
|
310
342
|
case 'thinking':
|
|
311
|
-
|
|
312
|
-
process.stdout.write(`\x1b[2m${event.text}\x1b[0m`);
|
|
313
|
-
}
|
|
343
|
+
// Already showing spinner, ignore thinking events
|
|
314
344
|
break;
|
|
315
345
|
case 'text_delta':
|
|
346
|
+
stopSpinner(''); // Stop thinking spinner silently
|
|
316
347
|
process.stdout.write(event.text);
|
|
317
348
|
assistantContent += event.text;
|
|
318
349
|
break;
|
|
319
350
|
case 'tool_start':
|
|
320
351
|
process.stdout.write(`\n[${event.name}] `);
|
|
352
|
+
startSpinner();
|
|
321
353
|
break;
|
|
322
354
|
case 'tool_result':
|
|
323
|
-
|
|
355
|
+
stopSpinner('done');
|
|
356
|
+
break;
|
|
357
|
+
case 'tool_error':
|
|
358
|
+
stopSpinner('error');
|
|
324
359
|
break;
|
|
325
360
|
case 'error':
|
|
361
|
+
stopSpinner();
|
|
326
362
|
console.error(`\nError: ${event.error}`);
|
|
327
363
|
break;
|
|
328
364
|
}
|
package/dotbot.db
CHANGED
|
Binary file
|
package/package.json
CHANGED