zubo 0.1.19 → 0.1.21
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/README.md +2 -2
- package/package.json +1 -1
- package/site/docs/agents.html +2 -2
- package/site/docs/api.html +2 -2
- package/site/docs/cli.html +7 -2
- package/site/docs/config.html +92 -0
- package/site/docs/index.html +8 -6
- package/site/docs/integrations.html +3 -3
- package/site/docs/marketplace.html +9 -9
- package/site/docs/security.html +4 -4
- package/site/docs/skills.html +1 -1
- package/site/docs/webhooks.html +17 -0
- package/site/index.html +4 -4
- package/site/install.sh +11 -5
- package/src/agent/compaction.ts +20 -4
- package/src/agent/history.ts +7 -2
- package/src/agent/loop.ts +50 -18
- package/src/agent/prompts.ts +2 -0
- package/src/agent/session.ts +69 -2
- package/src/agent/summarizer.ts +223 -0
- package/src/channels/dashboard.html.ts +98 -56
- package/src/channels/telegram.ts +10 -1
- package/src/channels/webchat.ts +40 -8
- package/src/llm/claude-code.ts +1 -2
- package/src/llm/codex.ts +3 -3
- package/src/llm/factory.ts +81 -2
- package/src/llm/failover.ts +59 -4
- package/src/llm/smart-router.ts +14 -6
- package/src/memory/knowledge-graph.ts +1 -1
- package/src/memory/vector-index.ts +1 -1
- package/src/scheduler/visual-workflows.ts +1 -1
- package/src/setup-web.html.ts +1371 -0
- package/src/setup-web.ts +165 -0
- package/src/setup.ts +266 -15
- package/src/start.ts +12 -2
- package/src/tools/builtin/config-update.ts +18 -1
- package/src/tools/executor.ts +2 -2
- package/src/tools/mcp-registry.ts +12 -6
- package/src/tools/permissions.ts +2 -2
package/README.md
CHANGED
|
@@ -56,7 +56,7 @@ npm i -g zubo # also works
|
|
|
56
56
|
Then:
|
|
57
57
|
|
|
58
58
|
```bash
|
|
59
|
-
zubo setup # interactive config wizard
|
|
59
|
+
zubo setup # interactive config wizard (terminal or browser)
|
|
60
60
|
zubo start # launch the agent
|
|
61
61
|
```
|
|
62
62
|
|
|
@@ -118,7 +118,7 @@ Set secrets through natural conversation: *"Set my github_token to ghp_..."*
|
|
|
118
118
|
## CLI
|
|
119
119
|
|
|
120
120
|
```
|
|
121
|
-
zubo setup Interactive configuration wizard
|
|
121
|
+
zubo setup Interactive configuration wizard (terminal or browser)
|
|
122
122
|
zubo start [--daemon] Start the agent
|
|
123
123
|
zubo stop Stop the background daemon
|
|
124
124
|
zubo status Show runtime status
|
package/package.json
CHANGED
package/site/docs/agents.html
CHANGED
|
@@ -89,11 +89,11 @@
|
|
|
89
89
|
<p>By default, Zubo operates as a single agent that handles all messages across every connected channel using a unified session identified as "owner." This default agent has access to all registered tools — both built-in tools and any user-installed skills — and its personality and behavior are defined by the system prompt stored at <code>~/.zubo/workspace/SYSTEM.md</code>.</p>
|
|
90
90
|
<p>For many use cases, the default agent is all you need. It can search the web, manage your calendar, write code, read and write memory, and use any skill you install. Custom agents become valuable when you want to restrict tool access, provide specialized instructions, or build multi-step workflows.</p>
|
|
91
91
|
|
|
92
|
-
<h2>
|
|
92
|
+
<h2>Personality</h2>
|
|
93
93
|
<p>The system prompt defines your agent's personality, rules, and background knowledge. There are two ways to customize it:</p>
|
|
94
94
|
<ul>
|
|
95
95
|
<li><strong>Edit the file directly</strong> — Open <code>~/.zubo/workspace/SYSTEM.md</code> in any text editor and modify it.</li>
|
|
96
|
-
<li><strong>Use the dashboard</strong> — Navigate to the
|
|
96
|
+
<li><strong>Use the dashboard</strong> — Navigate to the Personality panel in the web dashboard and edit it there. Changes are saved to <code>SYSTEM.md</code> automatically.</li>
|
|
97
97
|
</ul>
|
|
98
98
|
<p>Here is an example <code>SYSTEM.md</code> that defines a personalized assistant:</p>
|
|
99
99
|
<pre><code># System Prompt
|
package/site/docs/api.html
CHANGED
|
@@ -200,7 +200,7 @@ file: <document></code></pre>
|
|
|
200
200
|
"Status": "running"
|
|
201
201
|
}</code></pre>
|
|
202
202
|
|
|
203
|
-
<h3>
|
|
203
|
+
<h3>Personality</h3>
|
|
204
204
|
<pre><code>GET /api/dashboard/system</code></pre>
|
|
205
205
|
<p>Retrieve the current system prompt.</p>
|
|
206
206
|
<pre><code>PUT /api/dashboard/system
|
|
@@ -583,7 +583,7 @@ Content-Type: application/json
|
|
|
583
583
|
<pre><code>GET /api/dashboard/channel-status</code></pre>
|
|
584
584
|
<p>Returns the configuration and connection status for each channel (webchat, Telegram, Discord, Slack, WhatsApp, Signal). Each channel reports whether it is configured and whether it is currently enabled.</p>
|
|
585
585
|
|
|
586
|
-
<h3>
|
|
586
|
+
<h3>API Keys Management</h3>
|
|
587
587
|
<pre><code>GET /api/dashboard/secrets</code></pre>
|
|
588
588
|
<p>List all stored secrets. Values are masked in the response for security.</p>
|
|
589
589
|
<pre><code>GET /api/dashboard/secrets/:name</code></pre>
|
package/site/docs/cli.html
CHANGED
|
@@ -88,9 +88,14 @@
|
|
|
88
88
|
<h2>Core Commands</h2>
|
|
89
89
|
|
|
90
90
|
<h3>zubo setup</h3>
|
|
91
|
-
<p>Interactive 4-step wizard for first-time configuration.
|
|
91
|
+
<p>Interactive 4-step wizard for first-time configuration. When you run it, you'll be asked to choose between two modes:</p>
|
|
92
|
+
<ul>
|
|
93
|
+
<li><strong>Terminal</strong> — Classic step-by-step prompts right in your terminal.</li>
|
|
94
|
+
<li><strong>Dashboard</strong> — Opens a beautiful browser-based wizard at <code>http://localhost:<port></code> with the same steps, auto-detection of local providers (Ollama, LM Studio), and connection testing. Great for non-technical users or if you prefer a visual UI.</li>
|
|
95
|
+
</ul>
|
|
96
|
+
<p>Both modes walk you through 4 steps:</p>
|
|
92
97
|
<ol>
|
|
93
|
-
<li><strong>LLM Provider</strong> — Choose from
|
|
98
|
+
<li><strong>LLM Provider</strong> — Choose from 15 supported providers (Anthropic, OpenAI, Ollama, Groq, Together, OpenRouter, DeepSeek, xAI, MiniMax, Fireworks, Cerebras, LM Studio, Claude Code, Codex, or any OpenAI-compatible endpoint). Enter your API key and select a model. Optionally add a fallback provider for automatic failover.</li>
|
|
94
99
|
<li><strong>Channels</strong> — Enable any of 7 messaging channels: Telegram, Discord, Slack, WhatsApp, Signal, and Email. WebChat is always enabled by default. Each channel prompts for its required credentials (bot tokens, webhook URLs, etc.).</li>
|
|
95
100
|
<li><strong>Personalization</strong> — Name your agent and optionally describe its personality. The name and personality are used in the system prompt and across all channels.</li>
|
|
96
101
|
<li><strong>Smart Routing</strong> — Optionally set up a fast provider for simple queries (e.g., greetings, factual lookups). Smart routing automatically directs simple messages to a cheaper, faster model while using the primary model for complex tasks — saving 50–80% on costs.</li>
|
package/site/docs/config.html
CHANGED
|
@@ -251,6 +251,98 @@ zubo config get rateLimit # Show all rate limit settings</code></pre>
|
|
|
251
251
|
</tbody>
|
|
252
252
|
</table>
|
|
253
253
|
|
|
254
|
+
<!-- ================================================================ -->
|
|
255
|
+
<h3 id="local-models">Local Models (Ollama & LM Studio)</h3>
|
|
256
|
+
|
|
257
|
+
<p>
|
|
258
|
+
Local models run entirely on your machine — no API keys, no usage fees, and your data never leaves your computer. They're ideal as a primary provider for privacy-focused setups, or as a failover when your internet is down.
|
|
259
|
+
</p>
|
|
260
|
+
|
|
261
|
+
<h4>Ollama</h4>
|
|
262
|
+
|
|
263
|
+
<p><a href="https://ollama.com" target="_blank">Ollama</a> is a lightweight runtime for running open-source models locally. It provides an OpenAI-compatible API out of the box.</p>
|
|
264
|
+
|
|
265
|
+
<p><strong>Installation:</strong></p>
|
|
266
|
+
<pre><code># macOS (Homebrew)
|
|
267
|
+
brew install ollama
|
|
268
|
+
|
|
269
|
+
# Linux
|
|
270
|
+
curl -fsSL https://ollama.com/install.sh | sh
|
|
271
|
+
|
|
272
|
+
# Windows — download from https://ollama.com/download</code></pre>
|
|
273
|
+
|
|
274
|
+
<p><strong>Getting started:</strong></p>
|
|
275
|
+
<pre><code># Start the Ollama server (runs on port 11434)
|
|
276
|
+
ollama serve
|
|
277
|
+
|
|
278
|
+
# Pull a model
|
|
279
|
+
ollama pull llama3.3 # Meta Llama 3.3 (good general-purpose)
|
|
280
|
+
ollama pull mistral # Mistral 7B (fast, lightweight)
|
|
281
|
+
ollama pull qwen2.5 # Qwen 2.5 (strong multilingual)
|
|
282
|
+
ollama pull deepseek-r1 # DeepSeek R1 (strong reasoning)
|
|
283
|
+
ollama pull gemma2 # Google Gemma 2
|
|
284
|
+
|
|
285
|
+
# List downloaded models
|
|
286
|
+
ollama list</code></pre>
|
|
287
|
+
|
|
288
|
+
<p><strong>Zubo configuration:</strong></p>
|
|
289
|
+
<pre><code>"ollama": {
|
|
290
|
+
"baseUrl": "http://localhost:11434/v1",
|
|
291
|
+
"model": "llama3.3",
|
|
292
|
+
"apiKey": "ollama"
|
|
293
|
+
}</code></pre>
|
|
294
|
+
<p>The <code>apiKey</code> field is required by the OpenAI-compatible client but Ollama ignores it — any value works.</p>
|
|
295
|
+
|
|
296
|
+
<h4>LM Studio</h4>
|
|
297
|
+
|
|
298
|
+
<p><a href="https://lmstudio.ai" target="_blank">LM Studio</a> provides a graphical interface for downloading, managing, and running local models. It includes a built-in server that exposes an OpenAI-compatible API.</p>
|
|
299
|
+
|
|
300
|
+
<p><strong>Installation:</strong></p>
|
|
301
|
+
<ol>
|
|
302
|
+
<li>Download LM Studio from <a href="https://lmstudio.ai" target="_blank">lmstudio.ai</a> (macOS, Windows, Linux)</li>
|
|
303
|
+
<li>Open LM Studio and browse the model library to download a model</li>
|
|
304
|
+
<li>Go to the <strong>Local Server</strong> tab in the left sidebar</li>
|
|
305
|
+
<li>Select your model and click <strong>Start Server</strong> — it runs on port 1234 by default</li>
|
|
306
|
+
</ol>
|
|
307
|
+
|
|
308
|
+
<p><strong>Zubo configuration:</strong></p>
|
|
309
|
+
<pre><code>"lmstudio": {
|
|
310
|
+
"baseUrl": "http://localhost:1234/v1",
|
|
311
|
+
"model": "your-model-name",
|
|
312
|
+
"apiKey": "lm-studio"
|
|
313
|
+
}</code></pre>
|
|
314
|
+
|
|
315
|
+
<p><strong>Tip:</strong> Local models work great as a failover. Set a cloud provider as primary and Ollama/LM Studio as the fallback — if your API key runs out or the network drops, Zubo seamlessly falls back to your local model:</p>
|
|
316
|
+
<pre><code>"activeProvider": "anthropic",
|
|
317
|
+
"failover": ["ollama"]</code></pre>
|
|
318
|
+
|
|
319
|
+
<h4>CLI Providers (Claude Code & OpenAI Codex)</h4>
|
|
320
|
+
|
|
321
|
+
<p>These providers use locally installed CLI tools that handle their own authentication — no API key configuration needed in Zubo.</p>
|
|
322
|
+
|
|
323
|
+
<table>
|
|
324
|
+
<thead>
|
|
325
|
+
<tr><th>Provider</th><th>CLI Tool</th><th>Install</th><th>Auth</th></tr>
|
|
326
|
+
</thead>
|
|
327
|
+
<tbody>
|
|
328
|
+
<tr>
|
|
329
|
+
<td><code>claude-code</code></td>
|
|
330
|
+
<td><code>claude</code></td>
|
|
331
|
+
<td><code>npm install -g @anthropic-ai/claude-code</code></td>
|
|
332
|
+
<td>Run <code>claude</code> once to authenticate via browser</td>
|
|
333
|
+
</tr>
|
|
334
|
+
<tr>
|
|
335
|
+
<td><code>codex</code></td>
|
|
336
|
+
<td><code>codex</code></td>
|
|
337
|
+
<td><code>npm install -g @openai/codex</code></td>
|
|
338
|
+
<td>Run <code>codex auth login</code> to authenticate</td>
|
|
339
|
+
</tr>
|
|
340
|
+
</tbody>
|
|
341
|
+
</table>
|
|
342
|
+
|
|
343
|
+
<pre><code>"claude-code": { "model": "claude-sonnet-4-5-20250929" }
|
|
344
|
+
"codex": { "model": "o4-mini" }</code></pre>
|
|
345
|
+
|
|
254
346
|
<h3>Multi-Provider Example with Failover</h3>
|
|
255
347
|
|
|
256
348
|
<pre><code>{
|
package/site/docs/index.html
CHANGED
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
<a href="/docs/conversations">Conversation History</a>
|
|
70
70
|
<a href="/docs/webhooks">Webhooks</a>
|
|
71
71
|
<a href="/docs/workflows">Visual Workflows</a>
|
|
72
|
-
<a href="/docs/marketplace">
|
|
72
|
+
<a href="/docs/marketplace">Extensions Marketplace</a>
|
|
73
73
|
</div>
|
|
74
74
|
</div>
|
|
75
75
|
<div class="docs-sidebar-section">
|
|
@@ -296,12 +296,14 @@ docker compose up -d</code></pre>
|
|
|
296
296
|
|
|
297
297
|
<pre><code>zubo setup</code></pre>
|
|
298
298
|
|
|
299
|
-
<p>
|
|
299
|
+
<p>You'll be asked to choose between <strong>Terminal</strong> (classic prompts) or <strong>Dashboard</strong> (a browser-based wizard with visual provider cards, auto-detection, and connection testing). Both paths configure the same thing — pick whichever you prefer.</p>
|
|
300
|
+
|
|
301
|
+
<p>The wizard walks you through 4 steps:</p>
|
|
300
302
|
<ul>
|
|
301
|
-
<li><strong>Step 1:
|
|
303
|
+
<li><strong>Step 1: AI Provider</strong> — choose from 15 supported providers (Anthropic, OpenAI, Ollama, Groq, Together, OpenRouter, DeepSeek, xAI, MiniMax, Fireworks, Cerebras, LM Studio, Claude Code, Codex, or any OpenAI-compatible endpoint) and enter your API key. Optionally configure a fallback provider for automatic failover.</li>
|
|
302
304
|
<li><strong>Step 2: Channels</strong> — enable any combination of Telegram, Discord, Slack, WhatsApp, Signal, and Email. Enter the required tokens and credentials for each. Web Chat is always on and requires no configuration.</li>
|
|
303
305
|
<li><strong>Step 3: Personalization</strong> — set your agent's name and describe its personality. This shapes how Zubo talks to you across all channels.</li>
|
|
304
|
-
<li><strong>Step 4: Smart
|
|
306
|
+
<li><strong>Step 4: Smart Cost Savings</strong> — optionally configure a fast model (e.g., Groq) for simple queries. Smart routing automatically detects low-complexity messages and routes them to the cheaper, faster model, saving 50–80% on costs without sacrificing quality for complex tasks.</li>
|
|
305
307
|
</ul>
|
|
306
308
|
<p>The wizard also creates the <code>~/.zubo</code> directory and all required subdirectories, generates your <code>~/.zubo/config.json</code> file, and downloads the all-MiniLM-L6-v2 embedding model (~80 MB) for local semantic memory.</p>
|
|
307
309
|
|
|
@@ -622,7 +624,7 @@ zubo start --daemon</code></pre>
|
|
|
622
624
|
<li><strong>Use <code>zubo start --daemon</code></strong> for always-on operation. Zubo writes a PID file and rotates logs automatically.</li>
|
|
623
625
|
<li><strong>Check <code>zubo status</code> and <code>zubo logs</code></strong> for troubleshooting. The status command shows uptime, memory usage, connected channels, and pending scheduled jobs.</li>
|
|
624
626
|
<li><strong>Back up your data</strong> with <code>zubo export</code> for a full JSON export, or rely on the automatic daily SQLite backups in <code>~/.zubo/workspace/backups/</code>.</li>
|
|
625
|
-
<li><strong>Enable smart
|
|
627
|
+
<li><strong>Enable smart cost savings</strong> to automatically send simple queries to fast, cheap models. Set <code>smartRouting.enabled</code> to <code>true</code> and configure a <code>fastProvider</code> (e.g., Groq) alongside your primary. This can cut costs significantly.</li>
|
|
626
628
|
<li><strong>Set a budget</strong> to avoid surprise bills: <code>zubo config set budget.dailyLimit 5</code>. Cost tracking is always active in the dashboard under Analytics → Costs.</li>
|
|
627
629
|
<li><strong>Configure failover providers</strong> so your agent stays available even if your primary LLM provider has an outage. For example, set Anthropic as primary and Ollama as failover for fully offline operation when the cloud is down.</li>
|
|
628
630
|
<li><strong>Keep skills small and focused</strong> — one skill per task. This makes them easier to test, share, and debug.</li>
|
|
@@ -642,7 +644,7 @@ zubo start --daemon</code></pre>
|
|
|
642
644
|
<li><a href="/docs/conversations"><strong>Conversation History</strong></a> — unified cross-channel history with FTS5 search, dashboard browsing, and API access for searching and analyzing past conversations across all channels.</li>
|
|
643
645
|
<li><a href="/docs/webhooks"><strong>Webhooks</strong></a> — create webhook endpoints for GitHub, Stripe, CI/CD, and any external service. HMAC signature verification, prompt templates with <code>{{payload}}</code> substitution, and dashboard management.</li>
|
|
644
646
|
<li><a href="/docs/workflows"><strong>Visual Workflows</strong></a> — build multi-step automations with the drag-and-drop workflow builder. Step types (tool, agent, condition, message, delay), triggers (manual, cron, webhook), and template variables.</li>
|
|
645
|
-
<li><a href="/docs/marketplace"><strong>
|
|
647
|
+
<li><a href="/docs/marketplace"><strong>Extensions Marketplace</strong></a> — browse, install, and manage MCP servers from the official registry. One-click installation with automatic tool registration.</li>
|
|
646
648
|
<li><a href="/docs/integrations"><strong>Integrations</strong></a> — connect Zubo to GitHub, Google Workspace, Notion, Linear, Jira, and more. <a href="/docs/integrations#oauth">OAuth 2.0 authentication</a> with automatic token refresh, API key setup, and usage examples.</li>
|
|
647
649
|
<li><a href="/docs/security"><strong>Security & Auth</strong></a> — harden your Zubo instance: API key management, tool permission levels, confirmation tokens, rate limiting, file access restrictions, and network security.</li>
|
|
648
650
|
<li><a href="/docs/api"><strong>API Reference</strong></a> — complete HTTP API documentation for programmatic access: endpoints, request/response formats, authentication, and WebSocket streaming.</li>
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
<p>There are three ways to connect a service:</p>
|
|
102
102
|
<ol>
|
|
103
103
|
<li><strong>Chat:</strong> Tell Zubo directly — for example, <code>"Connect GitHub with token ghp_abc123"</code>. Zubo will store the secret and install the skill pack automatically.</li>
|
|
104
|
-
<li><strong>Dashboard:</strong> Navigate to Settings →
|
|
104
|
+
<li><strong>Dashboard:</strong> Navigate to Settings → API Keys. Enter the secret name and value, then Zubo detects the associated integration and installs the skills.</li>
|
|
105
105
|
<li><strong>CLI:</strong> Run <code>zubo start</code>, then use the <code>connect_service</code> tool programmatically to provide the credentials.</li>
|
|
106
106
|
</ol>
|
|
107
107
|
<p>When you connect a service, Zubo performs the following steps:</p>
|
|
@@ -384,11 +384,11 @@ zubo mcp-serve</code></pre>
|
|
|
384
384
|
</tbody>
|
|
385
385
|
</table>
|
|
386
386
|
|
|
387
|
-
<h2 id="managing-secrets">Managing
|
|
387
|
+
<h2 id="managing-secrets">Managing API Keys</h2>
|
|
388
388
|
<p>All integration secrets are managed through the same unified secret system.</p>
|
|
389
389
|
<h3>Dashboard</h3>
|
|
390
390
|
<ul>
|
|
391
|
-
<li>Navigate to Settings →
|
|
391
|
+
<li>Navigate to Settings → API Keys</li>
|
|
392
392
|
<li>Values are displayed as <code>••••••••</code> by default</li>
|
|
393
393
|
<li>Click <strong>“Reveal”</strong> to show the actual secret value</li>
|
|
394
394
|
<li>Click <strong>“Edit”</strong> to update a secret with a new value</li>
|
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>
|
|
6
|
+
<title>Extensions Marketplace — Zubo Docs</title>
|
|
7
7
|
<meta name="description" content="Browse, install, and manage MCP servers from the built-in marketplace. Extend Zubo with community-built tools, one-click installs, and automatic configuration.">
|
|
8
8
|
<meta name="theme-color" content="#060608">
|
|
9
9
|
<link rel="canonical" href="https://zubo.bot/docs/marketplace">
|
|
10
|
-
<meta property="og:title" content="
|
|
10
|
+
<meta property="og:title" content="Extensions Marketplace — Zubo Docs">
|
|
11
11
|
<meta property="og:description" content="Browse, install, and manage MCP servers from the built-in marketplace. Extend Zubo with community-built tools, one-click installs, and automatic configuration.">
|
|
12
12
|
<meta property="og:type" content="website">
|
|
13
13
|
<meta property="og:url" content="https://zubo.bot/docs/marketplace">
|
|
14
14
|
<meta property="og:image" content="https://zubo.bot/og-image.png">
|
|
15
15
|
<meta property="og:site_name" content="Zubo">
|
|
16
16
|
<meta name="twitter:card" content="summary_large_image">
|
|
17
|
-
<meta name="twitter:title" content="
|
|
17
|
+
<meta name="twitter:title" content="Extensions Marketplace — Zubo Docs">
|
|
18
18
|
<meta name="twitter:description" content="Browse, install, and manage MCP servers from the built-in marketplace. Extend Zubo with community-built tools, one-click installs, and automatic configuration.">
|
|
19
19
|
<meta name="twitter:image" content="https://zubo.bot/og-image.png">
|
|
20
20
|
<meta name="twitter:creator" content="@thomaskanze">
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
<a href="/docs/conversations">Conversation History</a>
|
|
68
68
|
<a href="/docs/webhooks">Webhooks</a>
|
|
69
69
|
<a href="/docs/workflows">Visual Workflows</a>
|
|
70
|
-
<a href="/docs/marketplace" class="active">
|
|
70
|
+
<a href="/docs/marketplace" class="active">Extensions Marketplace</a>
|
|
71
71
|
</div>
|
|
72
72
|
</div>
|
|
73
73
|
<div class="docs-sidebar-section">
|
|
@@ -89,12 +89,12 @@
|
|
|
89
89
|
</aside>
|
|
90
90
|
|
|
91
91
|
<main class="docs-content">
|
|
92
|
-
<div class="docs-breadcrumb"><a href="/">Home</a><span>/</span><a href="/docs/">Docs</a><span>/</span>
|
|
92
|
+
<div class="docs-breadcrumb"><a href="/">Home</a><span>/</span><a href="/docs/">Docs</a><span>/</span>Extensions Marketplace</div>
|
|
93
93
|
|
|
94
|
-
<h1>
|
|
94
|
+
<h1>Extensions Marketplace</h1>
|
|
95
95
|
|
|
96
96
|
<p>
|
|
97
|
-
The
|
|
97
|
+
The Extensions Marketplace lets you browse, install, and manage MCP (Model Context Protocol) servers from the official registry directly through the Zubo dashboard or API. Instead of manually configuring MCP server commands and arguments, you can discover servers from the community, install them with one click, and have their tools automatically registered in Zubo.
|
|
98
98
|
</p>
|
|
99
99
|
|
|
100
100
|
<!-- ================================================================ -->
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
<h3>Via the Dashboard</h3>
|
|
108
108
|
|
|
109
109
|
<ol>
|
|
110
|
-
<li>Open the web dashboard and navigate to the <strong>
|
|
110
|
+
<li>Open the web dashboard and navigate to the <strong>Extensions</strong> panel in the sidebar.</li>
|
|
111
111
|
<li>Click the <strong>Marketplace</strong> tab to view the available servers from the registry.</li>
|
|
112
112
|
<li>Use the search bar to filter servers by name or keyword (e.g., "filesystem", "database", "github").</li>
|
|
113
113
|
<li>Each server card shows the name, description, author, tool count, and install status.</li>
|
|
@@ -291,7 +291,7 @@ Content-Type: application/json
|
|
|
291
291
|
"itemListElement": [
|
|
292
292
|
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://zubo.bot/" },
|
|
293
293
|
{ "@type": "ListItem", "position": 2, "name": "Docs", "item": "https://zubo.bot/docs/" },
|
|
294
|
-
{ "@type": "ListItem", "position": 3, "name": "
|
|
294
|
+
{ "@type": "ListItem", "position": 3, "name": "Extensions Marketplace", "item": "https://zubo.bot/docs/marketplace" }
|
|
295
295
|
]
|
|
296
296
|
}
|
|
297
297
|
</script>
|
package/site/docs/security.html
CHANGED
|
@@ -169,18 +169,18 @@
|
|
|
169
169
|
|
|
170
170
|
<h2 id="secret-management">Secret Management</h2>
|
|
171
171
|
<p>Secrets (API keys, tokens, passwords) are stored securely in the local SQLite <code>secrets</code> table. The agent can use secrets by name but <strong>never sees their actual values</strong> in conversation context.</p>
|
|
172
|
-
<h3>Storing
|
|
172
|
+
<h3>Storing API Keys</h3>
|
|
173
173
|
<p>There are three ways to store a secret:</p>
|
|
174
174
|
<ul>
|
|
175
175
|
<li><strong>Chat:</strong> Tell Zubo directly — <code>"Store my GitHub token: ghp_abc123xyz"</code></li>
|
|
176
176
|
<li><strong>Tool:</strong> The <code>secret_set</code> tool can be called programmatically</li>
|
|
177
|
-
<li><strong>Dashboard:</strong> Navigate to Settings →
|
|
177
|
+
<li><strong>Dashboard:</strong> Navigate to Settings → API Keys and use the form</li>
|
|
178
178
|
</ul>
|
|
179
|
-
<h3>Accessing
|
|
179
|
+
<h3>Accessing API Keys in Skills</h3>
|
|
180
180
|
<p>User-installed skills can access secrets via environment variables:</p>
|
|
181
181
|
<pre><code>const token = process.env.ZUBO_SECRET_GITHUB_TOKEN;</code></pre>
|
|
182
182
|
<p>Only secrets explicitly declared in the skill manifest are passed to the skill process.</p>
|
|
183
|
-
<h3>Managing
|
|
183
|
+
<h3>Managing API Keys</h3>
|
|
184
184
|
<ul>
|
|
185
185
|
<li><strong>Dashboard:</strong> View masked values (<code>••••••••</code>), click “Reveal” to show the actual value, click “Edit” to update, or “Delete” to remove</li>
|
|
186
186
|
<li><strong>Naming:</strong> Secret names must match the pattern <code>[a-z0-9_]+</code> (lowercase alphanumeric and underscores only)</li>
|
package/site/docs/skills.html
CHANGED
|
@@ -162,7 +162,7 @@ export default async function (input: Record<string, unknown>): Promise<
|
|
|
162
162
|
<li><strong>Cannot import from Zubo internals</strong> — skills run in a sandboxed subprocess and have no access to Zubo's core modules, database, or session state</li>
|
|
163
163
|
</ul>
|
|
164
164
|
|
|
165
|
-
<h2>Accessing
|
|
165
|
+
<h2>Accessing API Keys</h2>
|
|
166
166
|
<p>Skills often need API keys or credentials to call external services. Zubo provides a secure way to pass secrets to skill handlers via environment variables:</p>
|
|
167
167
|
<pre><code>export default async function (input: Record<string, unknown>): Promise<string> {
|
|
168
168
|
const apiKey = process.env.ZUBO_SECRET_WEATHER_API_KEY;
|
package/site/docs/webhooks.html
CHANGED
|
@@ -97,6 +97,23 @@
|
|
|
97
97
|
Webhooks let external services push events to Zubo in real time. When a webhook receives an event, Zubo processes the payload through a configurable prompt template and takes action automatically. This turns Zubo into a reactive automation hub — connect GitHub for push notifications, Stripe for payment events, CI/CD pipelines for build results, or any service that can send HTTP POST requests.
|
|
98
98
|
</p>
|
|
99
99
|
|
|
100
|
+
<!-- ================================================================ -->
|
|
101
|
+
<h2 id="network-requirements">Network Requirements</h2>
|
|
102
|
+
|
|
103
|
+
<div style="background: rgba(245,166,35,0.08); border-left: 3px solid #f5a623; padding: 14px 18px; border-radius: 6px; margin: 16px 0; font-size: 14px; line-height: 1.6;">
|
|
104
|
+
<strong style="color: #f5a623;">Localhost won't work for external services.</strong> Webhook URLs like <code>http://localhost:61939/api/webhook/...</code> are only reachable from your own machine. External services (GitHub, Stripe, etc.) cannot send events to localhost.
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
<p>To receive webhooks from external services, you need a publicly reachable URL. Options:</p>
|
|
108
|
+
|
|
109
|
+
<ul>
|
|
110
|
+
<li><strong>ngrok</strong> — Run <code>ngrok http 61939</code> to get a public HTTPS URL that tunnels to your local Zubo instance. Free tier available.</li>
|
|
111
|
+
<li><strong>Cloudflare Tunnel</strong> — Run <code>cloudflared tunnel --url http://localhost:61939</code> for a free, fast tunnel.</li>
|
|
112
|
+
<li><strong>Deploy Zubo</strong> — Run Zubo on a VPS or cloud server with a public IP and domain name.</li>
|
|
113
|
+
</ul>
|
|
114
|
+
|
|
115
|
+
<p>Once you have a public URL, configure the external service to send events to <code>https://your-public-url/api/webhook/<webhook-id></code>.</p>
|
|
116
|
+
|
|
100
117
|
<!-- ================================================================ -->
|
|
101
118
|
<h2 id="creating-webhooks">Creating Webhooks</h2>
|
|
102
119
|
|
package/site/index.html
CHANGED
|
@@ -4,18 +4,18 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Zubo — Your AI Agent. Your Machine. Your Rules.</title>
|
|
7
|
-
<meta name="description" content="Open-source AI agent that runs on your machine. One command to install, one file to configure. Persistent memory, 25+ tools, 7 messaging channels, 12+
|
|
7
|
+
<meta name="description" content="Open-source AI agent that runs on your machine. One command to install, one file to configure. Persistent memory, 25+ tools, 7 messaging channels, 12+ AI providers. Extension compatible. Zero complexity.">
|
|
8
8
|
<meta name="theme-color" content="#060608">
|
|
9
9
|
<link rel="canonical" href="https://zubo.bot/">
|
|
10
10
|
<meta property="og:title" content="Zubo — Your AI Agent. Your Machine. Your Rules.">
|
|
11
|
-
<meta property="og:description" content="Open-source AI agent that runs on your machine. Persistent memory, 25+ tools, works across Telegram, Discord, Slack, WhatsApp, Email, and more.
|
|
11
|
+
<meta property="og:description" content="Open-source AI agent that runs on your machine. Persistent memory, 25+ tools, works across Telegram, Discord, Slack, WhatsApp, Email, and more. Extension compatible. One install, zero cloud.">
|
|
12
12
|
<meta property="og:type" content="website">
|
|
13
13
|
<meta property="og:url" content="https://zubo.bot/">
|
|
14
14
|
<meta property="og:image" content="https://zubo.bot/og-image.png">
|
|
15
15
|
<meta property="og:site_name" content="Zubo">
|
|
16
16
|
<meta name="twitter:card" content="summary_large_image">
|
|
17
17
|
<meta name="twitter:title" content="Zubo — Your AI Agent. Your Machine. Your Rules.">
|
|
18
|
-
<meta name="twitter:description" content="Open-source AI agent that runs on your machine. Persistent memory, 25+ tools, works across Telegram, Discord, Slack, WhatsApp, Email, and more.
|
|
18
|
+
<meta name="twitter:description" content="Open-source AI agent that runs on your machine. Persistent memory, 25+ tools, works across Telegram, Discord, Slack, WhatsApp, Email, and more. Extension compatible. One install, zero cloud.">
|
|
19
19
|
<meta name="twitter:image" content="https://zubo.bot/og-image.png">
|
|
20
20
|
<meta name="twitter:creator" content="@thomaskanze">
|
|
21
21
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
@@ -264,7 +264,7 @@
|
|
|
264
264
|
<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg>
|
|
265
265
|
</div>
|
|
266
266
|
<h3>25+ Smart Tools</h3>
|
|
267
|
-
<p>Web search, file operations, code interpreter, image generation, APIs, webhooks, and more. Knowledge graph memory,
|
|
267
|
+
<p>Web search, file operations, code interpreter, image generation, APIs, webhooks, and more. Knowledge graph memory, extension support, and sub-agent delegation for complex tasks.</p>
|
|
268
268
|
</div>
|
|
269
269
|
|
|
270
270
|
<div class="bento-card tilt-card" data-feature="privacy">
|
package/site/install.sh
CHANGED
|
@@ -29,7 +29,9 @@ ARCH="$(uname -m)"
|
|
|
29
29
|
case "$OS" in
|
|
30
30
|
Linux*) PLATFORM="linux" ;;
|
|
31
31
|
Darwin*) PLATFORM="darwin" ;;
|
|
32
|
-
*)
|
|
32
|
+
MINGW*|MSYS*|CYGWIN*)
|
|
33
|
+
fail "Windows detected. Use WSL (Windows Subsystem for Linux) to run Zubo:\n\n ${DIM}wsl --install${RESET}\n Then run this installer inside WSL." ;;
|
|
34
|
+
*) fail "Unsupported OS: $OS. Zubo supports macOS, Linux, and Windows (via WSL)." ;;
|
|
33
35
|
esac
|
|
34
36
|
|
|
35
37
|
case "$ARCH" in
|
|
@@ -45,7 +47,7 @@ if command -v bun &>/dev/null; then
|
|
|
45
47
|
BUN_VERSION=$(bun --version 2>/dev/null || echo "unknown")
|
|
46
48
|
ok "Bun already installed (v${BUN_VERSION})"
|
|
47
49
|
else
|
|
48
|
-
info "Installing Bun runtime..."
|
|
50
|
+
info "Installing Bun (a fast JavaScript runtime Zubo needs)..."
|
|
49
51
|
curl -fsSL https://bun.sh/install | bash
|
|
50
52
|
|
|
51
53
|
# Source the updated profile so bun is on PATH
|
|
@@ -55,7 +57,7 @@ else
|
|
|
55
57
|
if command -v bun &>/dev/null; then
|
|
56
58
|
ok "Bun installed (v$(bun --version))"
|
|
57
59
|
else
|
|
58
|
-
fail "Bun installation failed.
|
|
60
|
+
fail "Bun installation failed. Visit https://bun.sh for manual install instructions."
|
|
59
61
|
fi
|
|
60
62
|
fi
|
|
61
63
|
|
|
@@ -78,9 +80,13 @@ else
|
|
|
78
80
|
# Bun global bin might not be on PATH yet
|
|
79
81
|
ZUBO_BIN="${HOME}/.bun/bin/zubo"
|
|
80
82
|
if [ -f "$ZUBO_BIN" ]; then
|
|
81
|
-
warn "Zubo installed but
|
|
83
|
+
warn "Zubo installed but your terminal can't find it yet."
|
|
82
84
|
echo ""
|
|
83
|
-
echo -e "
|
|
85
|
+
echo -e " Run this command, then restart your terminal:"
|
|
86
|
+
echo ""
|
|
87
|
+
echo -e " ${BOLD}echo 'export PATH=\"\$HOME/.bun/bin:\$PATH\"' >> ~/.bashrc && source ~/.bashrc${RESET}"
|
|
88
|
+
echo ""
|
|
89
|
+
echo -e " ${DIM}(On macOS with zsh, use ~/.zshrc instead of ~/.bashrc)${RESET}"
|
|
84
90
|
echo ""
|
|
85
91
|
else
|
|
86
92
|
fail "Zubo binary not found after install"
|
package/src/agent/compaction.ts
CHANGED
|
@@ -35,19 +35,35 @@ export function compactMessages(
|
|
|
35
35
|
contextWindow: maxTokens,
|
|
36
36
|
});
|
|
37
37
|
|
|
38
|
+
// Check if first message is a summary (preserve it during truncation)
|
|
39
|
+
const hasSummary =
|
|
40
|
+
messages.length > 0 &&
|
|
41
|
+
messages[0].role === "user" &&
|
|
42
|
+
typeof messages[0].content !== "string" &&
|
|
43
|
+
Array.isArray(messages[0].content) &&
|
|
44
|
+
messages[0].content.some(
|
|
45
|
+
(b: any) =>
|
|
46
|
+
b.type === "text" &&
|
|
47
|
+
typeof b.text === "string" &&
|
|
48
|
+
b.text.includes("Previous conversation summary:")
|
|
49
|
+
);
|
|
50
|
+
|
|
38
51
|
// Find the start index where cumulative remaining tokens fit under target
|
|
39
|
-
|
|
52
|
+
// Skip index 0 if it's a summary message — we want to keep it
|
|
53
|
+
let startIdx = hasSummary ? 1 : 0;
|
|
40
54
|
while (startIdx < messages.length - 2 && tokens > target) {
|
|
41
55
|
tokens -= costs[startIdx];
|
|
42
56
|
startIdx++;
|
|
43
57
|
}
|
|
44
58
|
|
|
45
|
-
// Ensure first message is from user (Claude API requirement)
|
|
59
|
+
// Ensure first kept message (after summary) is from user (Claude API requirement)
|
|
46
60
|
while (startIdx < messages.length && messages[startIdx].role !== "user") {
|
|
47
61
|
startIdx++;
|
|
48
62
|
}
|
|
49
63
|
|
|
50
|
-
const compacted =
|
|
51
|
-
|
|
64
|
+
const compacted = hasSummary
|
|
65
|
+
? [messages[0], ...messages.slice(startIdx)]
|
|
66
|
+
: messages.slice(startIdx);
|
|
67
|
+
logger.info("Compaction done", { remainingMessages: compacted.length, preservedSummary: hasSummary });
|
|
52
68
|
return compacted;
|
|
53
69
|
}
|
package/src/agent/history.ts
CHANGED
|
@@ -14,13 +14,18 @@ export function recordMessage(
|
|
|
14
14
|
): void {
|
|
15
15
|
try {
|
|
16
16
|
const db = getDb();
|
|
17
|
+
// Ensure thread exists before inserting message
|
|
18
|
+
db.run(
|
|
19
|
+
"INSERT OR IGNORE INTO threads (id, title, channel, message_count, created_at, updated_at) VALUES (?, ?, ?, 0, datetime('now'), datetime('now'))",
|
|
20
|
+
[threadId, threadId, channel ?? "webchat"]
|
|
21
|
+
);
|
|
17
22
|
db.run(
|
|
18
23
|
"INSERT INTO conversation_messages (thread_id, role, content, channel, timestamp) VALUES (?, ?, ?, ?, datetime('now'))",
|
|
19
24
|
[threadId, role, content, channel ?? null]
|
|
20
25
|
);
|
|
21
26
|
db.run(
|
|
22
|
-
"UPDATE threads SET message_count = message_count + 1, updated_at = datetime('now') WHERE id = ?",
|
|
23
|
-
[threadId]
|
|
27
|
+
"UPDATE threads SET message_count = message_count + 1, updated_at = datetime('now'), channel = COALESCE(channel, ?) WHERE id = ?",
|
|
28
|
+
[channel ?? "webchat", threadId]
|
|
24
29
|
);
|
|
25
30
|
db.run(
|
|
26
31
|
"INSERT INTO conversation_search (content, thread_id, role) VALUES (?, ?, ?)",
|