bloby-bot 0.23.0 → 0.23.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.
package/bin/cli.js CHANGED
@@ -538,6 +538,15 @@ class Stepper {
538
538
  lineCount += 1 + this.infoLines.length;
539
539
  }
540
540
 
541
+ // Clear leftover lines when content shrinks (e.g. info lines removed)
542
+ if (lineCount < this._totalLines) {
543
+ const extra = this._totalLines - lineCount;
544
+ for (let i = 0; i < extra; i++) {
545
+ process.stdout.write('\x1b[2K\n');
546
+ }
547
+ process.stdout.write(`\x1b[${extra}A`);
548
+ }
549
+
541
550
  this._totalLines = lineCount;
542
551
  }
543
552
 
@@ -710,6 +719,17 @@ function finalMessage(tunnelUrl, relayUrl) {
710
719
  }
711
720
  }
712
721
 
722
+ function readyMessage(tunnelUrl, relayUrl) {
723
+ if (relayUrl) {
724
+ console.log(`\n ${c.pink}${c.bold}${link(relayUrl)}${c.reset}`);
725
+ console.log(` ${c.dim}(cmd+click or ctrl+click to open)${c.reset}`);
726
+ }
727
+ if (tunnelUrl && tunnelUrl !== relayUrl) {
728
+ console.log(` ${c.dim}Tunnel:${c.reset} ${c.dim}${link(tunnelUrl)}${c.reset}`);
729
+ }
730
+ console.log('');
731
+ }
732
+
713
733
  function writeVersionFile(version) {
714
734
  try { fs.writeFileSync(path.join(DATA_DIR, 'VERSION'), version); } catch {}
715
735
  }
@@ -1552,13 +1572,7 @@ async function update() {
1552
1572
  if (daemonWasRunning) {
1553
1573
  if (updateResult && updateResult.healthOk) {
1554
1574
  console.log(` ${c.blue}✔${c.reset} Daemon restarted with new version.`);
1555
- if (updateResult.tunnelUrl) {
1556
- console.log(` ${c.dim}Tunnel:${c.reset} ${c.blue}${link(updateResult.tunnelUrl)}${c.reset}`);
1557
- }
1558
- if (updateResult.relayUrl) {
1559
- console.log(` ${c.dim}URL:${c.reset} ${c.pink}${link(updateResult.relayUrl)}${c.reset}`);
1560
- }
1561
- console.log('');
1575
+ readyMessage(updateResult.tunnelUrl, updateResult.relayUrl);
1562
1576
  } else {
1563
1577
  console.log(` ${c.yellow}⚠${c.reset} Daemon may still be starting. Check ${c.pink}bloby daemon status${c.reset}\n`);
1564
1578
  }
@@ -1690,14 +1704,8 @@ async function daemon(sub) {
1690
1704
  const restartResult = await waitForDaemonHealth(restartStepper, restartConfig, restartHasTunnel, restartLogOffset);
1691
1705
  restartStepper.finish();
1692
1706
 
1693
- console.log(`\n ${c.blue}✔${c.reset} Bloby daemon restarted.\n`);
1694
- if (restartResult.tunnelUrl) {
1695
- console.log(` ${c.dim}Tunnel:${c.reset} ${c.blue}${link(restartResult.tunnelUrl)}${c.reset}`);
1696
- }
1697
- if (restartResult.relayUrl) {
1698
- console.log(` ${c.dim}URL:${c.reset} ${c.pink}${link(restartResult.relayUrl)}${c.reset}`);
1699
- }
1700
- if (restartResult.tunnelUrl || restartResult.relayUrl) console.log('');
1707
+ console.log(`\n ${c.blue}✔${c.reset} Bloby daemon restarted.`);
1708
+ readyMessage(restartResult.tunnelUrl, restartResult.relayUrl);
1701
1709
  break;
1702
1710
  }
1703
1711
 
@@ -1830,14 +1838,8 @@ async function daemon(sub) {
1830
1838
  const sysRestartResult = await waitForDaemonHealth(sysRestartStepper, sysRestartConfig, sysRestartHasTunnel, 0);
1831
1839
  sysRestartStepper.finish();
1832
1840
 
1833
- console.log(`\n ${c.blue}✔${c.reset} Bloby daemon restarted.\n`);
1834
- if (sysRestartResult.tunnelUrl) {
1835
- console.log(` ${c.dim}Tunnel:${c.reset} ${c.blue}${link(sysRestartResult.tunnelUrl)}${c.reset}`);
1836
- }
1837
- if (sysRestartResult.relayUrl) {
1838
- console.log(` ${c.dim}URL:${c.reset} ${c.pink}${link(sysRestartResult.relayUrl)}${c.reset}`);
1839
- }
1840
- if (sysRestartResult.tunnelUrl || sysRestartResult.relayUrl) console.log('');
1841
+ console.log(`\n ${c.blue}✔${c.reset} Bloby daemon restarted.`);
1842
+ readyMessage(sysRestartResult.tunnelUrl, sysRestartResult.relayUrl);
1841
1843
  break;
1842
1844
  }
1843
1845
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bloby-bot",
3
- "version": "0.23.0",
3
+ "version": "0.23.1",
4
4
  "releaseNotes": [
5
5
  "1. new stuff",
6
6
  "2. ",
@@ -293,7 +293,6 @@ export default function InputBar({ onSend, onStop, streaming, whisperEnabled, on
293
293
  isHolding.current = true;
294
294
  setIsRecording(true);
295
295
  setRecordingTime(0);
296
- if (isMobile) try { navigator.vibrate?.(50); } catch {}
297
296
  } catch (err) {
298
297
  console.error('[InputBar] recording setup failed:', err);
299
298
  }
@@ -321,6 +320,7 @@ export default function InputBar({ onSend, onStop, streaming, whisperEnabled, on
321
320
  (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);
322
321
 
323
322
  holdTimerRef.current = setTimeout(() => {
323
+ try { navigator.vibrate?.(50); } catch {}
324
324
  beginRecording();
325
325
  }, 200);
326
326
  }, [isMobile, isRecording, voiceEnabled, beginRecording, stopRecording]);
@@ -537,8 +537,8 @@ export default function InputBar({ onSend, onStop, streaming, whisperEnabled, on
537
537
  onPointerCancel={handleMicCancel}
538
538
  >
539
539
  <div
540
- className="flex items-center justify-center h-11 w-11 rounded-full bg-destructive text-destructive-foreground animate-mic-pulse transition-transform duration-200"
541
- style={{ transform: 'scale(1.1) translateY(-6px)' }}
540
+ className="flex items-center justify-center h-11 w-11 rounded-full bg-destructive text-destructive-foreground"
541
+ style={{ animation: 'mic-pulse-scale 2s ease-in-out infinite' }}
542
542
  >
543
543
  <Mic className="h-5 w-5" />
544
544
  </div>
@@ -131,10 +131,7 @@ body {
131
131
  100% { transform: rotate(360deg); }
132
132
  }
133
133
 
134
- @keyframes mic-pulse {
135
- 0%, 100% { box-shadow: 0 0 0 0 rgba(240, 77, 104, 0.4); }
136
- 50% { box-shadow: 0 0 0 12px rgba(240, 77, 104, 0); }
137
- }
138
- .animate-mic-pulse {
139
- animation: mic-pulse 1.5s ease-in-out infinite;
134
+ @keyframes mic-pulse-scale {
135
+ 0%, 100% { transform: scale(1.1) translateY(-6px); }
136
+ 50% { transform: scale(1.15) translateY(-8px); }
140
137
  }
@@ -13,8 +13,7 @@
13
13
  '#bloby-widget-panel.open{transform:translateX(0)}',
14
14
  '#bloby-widget-panel iframe{width:100%;height:100%;border:none;background:#212121}',
15
15
  '@media(max-width:480px){#bloby-widget-panel{width:100vw}}',
16
- '@keyframes bloby-mic-pulse{0%,100%{box-shadow:0 0 0 0 rgba(240,77,104,0.4)}50%{box-shadow:0 0 0 14px rgba(240,77,104,0)}}',
17
- '#bloby-widget-bubble.recording{animation:bloby-mic-pulse 1.5s ease-in-out infinite}',
16
+ '@keyframes bloby-bubble-record{0%,100%{transform:scale(1.2) translateY(-12px)}50%{transform:scale(1.25) translateY(-14px)}}',
18
17
  ].join('\n');
19
18
  document.head.appendChild(style);
20
19
 
@@ -479,9 +478,15 @@
479
478
  }
480
479
  try { navigator.vibrate(50); } catch(e) {}
481
480
  badgeEl.style.display = 'none';
481
+ // Grow + shift up, then start pulsating after the transition
482
482
  canvas.style.transition = 'transform 0.2s ease';
483
- canvas.style.transform = 'scale(1.1) translateY(-8px)';
484
- canvas.classList.add('recording');
483
+ canvas.style.transform = 'scale(1.2) translateY(-12px)';
484
+ setTimeout(function() {
485
+ if (hpState === 'activating' || hpState === 'recording') {
486
+ canvas.style.transition = 'none';
487
+ canvas.style.animation = 'bloby-bubble-record 2s ease-in-out infinite';
488
+ }
489
+ }, 220);
485
490
  hpState = 'activating';
486
491
  hpFrame = HP_ACTIVATE_START;
487
492
  hpPingPong = 1;
@@ -530,9 +535,10 @@
530
535
  }
531
536
  }
532
537
 
533
- // Shrink back + remove pulse
538
+ // Shrink back smoothly
539
+ canvas.style.animation = '';
540
+ canvas.style.transition = 'transform 0.2s ease';
534
541
  canvas.style.transform = '';
535
- canvas.classList.remove('recording');
536
542
 
537
543
  // v2 deactivation: reverse 40→11 (activate played backwards)
538
544
  if (hpState === 'activating') {