limbo-ai 1.22.0 → 1.22.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 (3) hide show
  1. package/README.md +31 -0
  2. package/cli.js +26 -3
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -58,10 +58,39 @@ npx limbo-ai@latest update # Pull latest image and restart
58
58
  npx limbo-ai@latest status # Show container status
59
59
  npx limbo-ai@latest logs # Tail container logs
60
60
  npx limbo-ai@latest start --reconfigure # Change API keys or settings
61
+ npx limbo-ai@latest config # Configure optional features (voice, web-search)
61
62
  ```
62
63
 
63
64
  ---
64
65
 
66
+ ## Optional Features
67
+
68
+ Limbo supports optional features that can be enabled during the setup wizard (step 7) or anytime via the CLI.
69
+
70
+ ### Voice Messages
71
+
72
+ Transcribe Telegram voice notes using [Groq](https://groq.com) Whisper. Requires a Groq API key (`gsk_...`).
73
+
74
+ ```sh
75
+ npx limbo-ai@latest config voice --enable --api-key gsk_xxx
76
+ npx limbo-ai@latest config voice --status
77
+ npx limbo-ai@latest config voice --disable
78
+ ```
79
+
80
+ ### Web Search
81
+
82
+ Give Limbo real-time web search via the [Brave Search API](https://brave.com/search/api/). Requires a Brave API key (`BSA...`).
83
+
84
+ ```sh
85
+ npx limbo-ai@latest config web-search --enable --api-key BSAxxx
86
+ npx limbo-ai@latest config web-search --status
87
+ npx limbo-ai@latest config web-search --disable
88
+ ```
89
+
90
+ Both features store API keys as Docker secrets and toggle config sections in the container on restart.
91
+
92
+ ---
93
+
65
94
  ## Updating
66
95
 
67
96
  ```sh
@@ -124,6 +153,8 @@ Managed automatically by `npx limbo-ai start`, stored in `~/.limbo/.env`.
124
153
  | `MODEL_NAME` | no | `claude-opus-4-6` | Model name (e.g. `claude-opus-4-6`, `claude-sonnet-4-6`, `gpt-5.4`) |
125
154
  | `TELEGRAM_ENABLED` | no | `false` | Enable Telegram bot integration |
126
155
  | `TELEGRAM_BOT_TOKEN` | no | — | Telegram bot token (required if `TELEGRAM_ENABLED=true`) |
156
+ | `VOICE_ENABLED` | no | `false` | Enable voice transcription (requires Groq API key as Docker secret) |
157
+ | `WEB_SEARCH_ENABLED` | no | `false` | Enable web search (requires Brave API key as Docker secret) |
127
158
 
128
159
  > \* API keys are required only for `AUTH_MODE=api-key`. Subscription auth uses ZeroClaw auth profiles instead.
129
160
 
package/cli.js CHANGED
@@ -1067,7 +1067,7 @@ function teardownSetupTunnel(tunnel) {
1067
1067
  function installGlobalAlias() {
1068
1068
  // Create a `limbo` shell wrapper so users don't have to type `npx limbo-ai` every time.
1069
1069
  // Tries /usr/local/bin first (macOS, Linux with sudo), falls back to ~/.local/bin (no sudo).
1070
- const wrapper = '#!/bin/sh\nexec npx limbo-ai "$@"\n';
1070
+ const wrapper = '#!/bin/sh\nexec npx limbo-ai@latest "$@"\n';
1071
1071
  const candidates = [
1072
1072
  path.join(os.homedir(), '.local', 'bin', 'limbo'),
1073
1073
  '/usr/local/bin/limbo',
@@ -1075,10 +1075,10 @@ function installGlobalAlias() {
1075
1075
 
1076
1076
  for (const target of candidates) {
1077
1077
  try {
1078
- // Skip if already installed and current
1078
+ // Skip if already installed and current (must include @latest)
1079
1079
  if (fs.existsSync(target)) {
1080
1080
  const existing = fs.readFileSync(target, 'utf8');
1081
- if (existing.includes('limbo-ai')) return;
1081
+ if (existing.includes('limbo-ai@latest')) return;
1082
1082
  }
1083
1083
  const dir = path.dirname(target);
1084
1084
  if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
@@ -1670,9 +1670,32 @@ function cmdLogs() {
1670
1670
  run('docker compose logs -f');
1671
1671
  }
1672
1672
 
1673
+ function selfUpdateCli() {
1674
+ const pkg = require('./package.json');
1675
+ try {
1676
+ const latest = execSync('npm view limbo-ai version', { encoding: 'utf8', timeout: 10000 }).trim();
1677
+ if (!latest || latest === pkg.version) return;
1678
+ const cur = pkg.version.split('.').map(Number);
1679
+ const lat = latest.split('.').map(Number);
1680
+ const isNewer = lat[0] > cur[0] || (lat[0] === cur[0] && lat[1] > cur[1]) ||
1681
+ (lat[0] === cur[0] && lat[1] === cur[1] && lat[2] > cur[2]);
1682
+ if (!isNewer) return;
1683
+
1684
+ log(`Updating CLI: ${pkg.version} → ${latest}...`);
1685
+ execSync('npm install -g limbo-ai@latest', { stdio: 'inherit', timeout: 60000 });
1686
+ ok(`CLI updated to ${latest}.`);
1687
+ } catch {
1688
+ warn('Could not self-update CLI. Run: npm install -g limbo-ai@latest');
1689
+ }
1690
+ }
1691
+
1673
1692
  function cmdUpdate() {
1674
1693
  if (!fs.existsSync(COMPOSE_FILE)) die(t('en', 'installMissing'));
1675
1694
 
1695
+ // Self-update the CLI if installed globally
1696
+ const isGlobal = !process.argv[1].includes('npx') && !process.argv[1].includes('node_modules/.cache');
1697
+ if (isGlobal) selfUpdateCli();
1698
+
1676
1699
  // Patch image tag to :latest in existing compose files (handles upgrades from pinned tags)
1677
1700
  let compose = fs.readFileSync(COMPOSE_FILE, 'utf8');
1678
1701
  const patched = compose.replace(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "limbo-ai",
3
- "version": "1.22.0",
3
+ "version": "1.22.1",
4
4
  "description": "Your personal AI memory agent — install and manage Limbo via npx",
5
5
  "type": "commonjs",
6
6
  "bin": {