@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 CHANGED
@@ -1,3 +1,11 @@
1
+ 0.20.2
2
+
3
+ Add spinner for thinking/tools
4
+
5
+ 0.20.1
6
+
7
+ Read version from package.json
8
+
1
9
  0.20
2
10
 
3
11
  Zero npm dependencies
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
- if (event.text) {
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
- process.stdout.write(`done\n`);
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
- if (event.text) {
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
- process.stdout.write(`done\n`);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stevederico/dotbot",
3
- "version": "0.20.0",
3
+ "version": "0.20.2",
4
4
  "description": "AI agent CLI and library for Node.js — streaming, multi-provider, tool execution, autonomous tasks",
5
5
  "type": "module",
6
6
  "main": "index.js",