zubo 0.1.20 → 0.1.22
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/migrations/024_personal_features.sql +96 -0
- package/package.json +1 -1
- package/site/docs/agents.html +2 -2
- package/site/docs/api.html +2 -2
- package/site/docs/index.html +16 -5
- 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 +108 -1
- package/site/index.html +13 -5
- package/site/install.sh +11 -5
- package/src/agent/context.ts +3 -3
- package/src/agent/loop.ts +1 -1
- package/src/agent/prompts.ts +42 -1
- package/src/channels/dashboard.html.ts +86 -54
- package/src/channels/webchat.ts +42 -18
- package/src/llm/claude-code.ts +1 -2
- package/src/llm/codex.ts +1 -2
- package/src/setup-web.html.ts +9 -9
- package/src/setup.ts +6 -6
- package/src/start.ts +12 -0
- package/src/tools/builtin/follow-ups.ts +189 -0
- package/src/tools/builtin/notes.ts +207 -0
- package/src/tools/builtin/preferences.ts +173 -0
- package/src/tools/builtin/todos.ts +270 -0
- package/src/tools/builtin/topics.ts +166 -0
- package/src/tools/executor.ts +2 -2
- package/src/tools/mcp-registry.ts +1 -1
- package/src/tools/permissions.ts +7 -0
- package/tests/agent/session.test.ts +43 -45
- package/tests/mcp-registry.test.ts +32 -35
- package/tests/personal-features.test.ts +1251 -0
- package/tests/skill-registry.test.ts +1 -7
- package/tests/db/export.test.ts +0 -219
- package/tests/session.test.ts +0 -58
- package/tests/tools/executor.test.ts +0 -150
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
-- Personal agent features: todos, notes, preferences, topics, follow-ups
|
|
2
|
+
|
|
3
|
+
CREATE TABLE IF NOT EXISTS todos (
|
|
4
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5
|
+
title TEXT NOT NULL,
|
|
6
|
+
description TEXT,
|
|
7
|
+
priority TEXT NOT NULL DEFAULT 'medium' CHECK(priority IN ('low', 'medium', 'high', 'urgent')),
|
|
8
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'in_progress', 'done')),
|
|
9
|
+
due_date TEXT,
|
|
10
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
11
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
12
|
+
completed_at TEXT
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
CREATE INDEX IF NOT EXISTS idx_todos_status ON todos(status);
|
|
16
|
+
CREATE INDEX IF NOT EXISTS idx_todos_priority ON todos(priority);
|
|
17
|
+
CREATE INDEX IF NOT EXISTS idx_todos_due ON todos(due_date);
|
|
18
|
+
|
|
19
|
+
CREATE TABLE IF NOT EXISTS notes (
|
|
20
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
21
|
+
title TEXT NOT NULL,
|
|
22
|
+
content TEXT NOT NULL,
|
|
23
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
24
|
+
pinned INTEGER NOT NULL DEFAULT 0,
|
|
25
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
26
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS notes_fts USING fts5(
|
|
30
|
+
title,
|
|
31
|
+
content,
|
|
32
|
+
tags,
|
|
33
|
+
content='notes',
|
|
34
|
+
content_rowid='id'
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
CREATE TRIGGER IF NOT EXISTS notes_ai AFTER INSERT ON notes BEGIN
|
|
38
|
+
INSERT INTO notes_fts(rowid, title, content, tags)
|
|
39
|
+
VALUES (new.id, new.title, new.content, new.tags);
|
|
40
|
+
END;
|
|
41
|
+
|
|
42
|
+
CREATE TRIGGER IF NOT EXISTS notes_ad AFTER DELETE ON notes BEGIN
|
|
43
|
+
INSERT INTO notes_fts(notes_fts, rowid, title, content, tags)
|
|
44
|
+
VALUES ('delete', old.id, old.title, old.content, old.tags);
|
|
45
|
+
END;
|
|
46
|
+
|
|
47
|
+
CREATE TRIGGER IF NOT EXISTS notes_au AFTER UPDATE ON notes BEGIN
|
|
48
|
+
INSERT INTO notes_fts(notes_fts, rowid, title, content, tags)
|
|
49
|
+
VALUES ('delete', old.id, old.title, old.content, old.tags);
|
|
50
|
+
INSERT INTO notes_fts(rowid, title, content, tags)
|
|
51
|
+
VALUES (new.id, new.title, new.content, new.tags);
|
|
52
|
+
END;
|
|
53
|
+
|
|
54
|
+
-- Upgrade user_preferences from migration 008 (simple key/value)
|
|
55
|
+
-- to the expanded schema with category, confidence, source
|
|
56
|
+
CREATE TABLE IF NOT EXISTS _user_preferences_new (
|
|
57
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
58
|
+
category TEXT NOT NULL DEFAULT 'general',
|
|
59
|
+
key TEXT NOT NULL,
|
|
60
|
+
value TEXT NOT NULL,
|
|
61
|
+
confidence REAL NOT NULL DEFAULT 0.8,
|
|
62
|
+
source TEXT NOT NULL DEFAULT 'inferred',
|
|
63
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
64
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
65
|
+
UNIQUE(category, key)
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
INSERT OR IGNORE INTO _user_preferences_new (key, value, updated_at)
|
|
69
|
+
SELECT key, value, updated_at FROM user_preferences;
|
|
70
|
+
|
|
71
|
+
DROP TABLE IF EXISTS user_preferences;
|
|
72
|
+
|
|
73
|
+
ALTER TABLE _user_preferences_new RENAME TO user_preferences;
|
|
74
|
+
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_prefs_category ON user_preferences(category);
|
|
76
|
+
|
|
77
|
+
CREATE TABLE IF NOT EXISTS conversation_topics (
|
|
78
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
79
|
+
name TEXT NOT NULL UNIQUE,
|
|
80
|
+
description TEXT,
|
|
81
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'archived')),
|
|
82
|
+
last_message_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
83
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
CREATE TABLE IF NOT EXISTS follow_ups (
|
|
87
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
88
|
+
context TEXT NOT NULL,
|
|
89
|
+
message TEXT NOT NULL,
|
|
90
|
+
follow_up_at TEXT NOT NULL,
|
|
91
|
+
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'sent', 'cancelled')),
|
|
92
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
CREATE INDEX IF NOT EXISTS idx_followups_status ON follow_ups(status);
|
|
96
|
+
CREATE INDEX IF NOT EXISTS idx_followups_time ON follow_ups(follow_up_at);
|
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/index.html
CHANGED
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
<a href="/docs/agents">Agents & Workflows</a>
|
|
62
62
|
<a href="/docs/memory">Memory System</a>
|
|
63
63
|
<a href="/docs/skills">Skills</a>
|
|
64
|
+
<a href="/docs/skills#personal-features">Personal Features</a>
|
|
64
65
|
</div>
|
|
65
66
|
</div>
|
|
66
67
|
<div class="docs-sidebar-section">
|
|
@@ -69,7 +70,7 @@
|
|
|
69
70
|
<a href="/docs/conversations">Conversation History</a>
|
|
70
71
|
<a href="/docs/webhooks">Webhooks</a>
|
|
71
72
|
<a href="/docs/workflows">Visual Workflows</a>
|
|
72
|
-
<a href="/docs/marketplace">
|
|
73
|
+
<a href="/docs/marketplace">Extensions Marketplace</a>
|
|
73
74
|
</div>
|
|
74
75
|
</div>
|
|
75
76
|
<div class="docs-sidebar-section">
|
|
@@ -154,6 +155,15 @@
|
|
|
154
155
|
<li><strong>Skill sandboxing</strong> — user-installed skills run in isolated subprocesses with configurable timeouts, preventing runaway code from affecting the main process.</li>
|
|
155
156
|
</ul>
|
|
156
157
|
|
|
158
|
+
<h3>Personal Features</h3>
|
|
159
|
+
<ul>
|
|
160
|
+
<li><strong>Todos</strong> — add, list, complete, update, and remove tasks with priorities (<code>low</code> / <code>medium</code> / <code>high</code>), due dates, and tags. A full task manager inside your agent.</li>
|
|
161
|
+
<li><strong>Notes</strong> — save, search (FTS5), list, update, delete, and pin notes with tags. Fast full-text search across all your notes.</li>
|
|
162
|
+
<li><strong>Preferences</strong> — store user preferences as category/key/value pairs. Preferences are automatically injected into the system prompt so the agent always respects your settings.</li>
|
|
163
|
+
<li><strong>Topics</strong> — create, switch, list, and archive conversation topics. Each topic scopes a separate session, keeping context focused when you juggle multiple projects.</li>
|
|
164
|
+
<li><strong>Follow-ups</strong> — schedule proactive follow-up messages at a specific time or delay. Uses one-shot cron jobs that fire once and auto-delete.</li>
|
|
165
|
+
</ul>
|
|
166
|
+
|
|
157
167
|
<h3>Agents</h3>
|
|
158
168
|
<ul>
|
|
159
169
|
<li><strong>Custom sub-agents</strong> with focused system prompts, restricted tool access, and specialized behavior. Define a “code-reviewer” agent that only has access to file and git tools, or a “researcher” agent that only has web search.</li>
|
|
@@ -300,10 +310,10 @@ docker compose up -d</code></pre>
|
|
|
300
310
|
|
|
301
311
|
<p>The wizard walks you through 4 steps:</p>
|
|
302
312
|
<ul>
|
|
303
|
-
<li><strong>Step 1:
|
|
313
|
+
<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>
|
|
304
314
|
<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>
|
|
305
315
|
<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>
|
|
306
|
-
<li><strong>Step 4: Smart
|
|
316
|
+
<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>
|
|
307
317
|
</ul>
|
|
308
318
|
<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>
|
|
309
319
|
|
|
@@ -624,7 +634,7 @@ zubo start --daemon</code></pre>
|
|
|
624
634
|
<li><strong>Use <code>zubo start --daemon</code></strong> for always-on operation. Zubo writes a PID file and rotates logs automatically.</li>
|
|
625
635
|
<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>
|
|
626
636
|
<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>
|
|
627
|
-
<li><strong>Enable smart
|
|
637
|
+
<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>
|
|
628
638
|
<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>
|
|
629
639
|
<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>
|
|
630
640
|
<li><strong>Keep skills small and focused</strong> — one skill per task. This makes them easier to test, share, and debug.</li>
|
|
@@ -640,11 +650,12 @@ zubo start --daemon</code></pre>
|
|
|
640
650
|
<li><a href="/docs/agents"><strong>Agents & Workflows</strong></a> — learn how to create custom sub-agents with focused system prompts and restricted tools, and build multi-agent pipelines with dependency resolution and parallel execution.</li>
|
|
641
651
|
<li><a href="/docs/memory"><strong>Memory System</strong></a> — understand how semantic memory works, how to ingest documents, search your knowledge base, and tune the hybrid search weights.</li>
|
|
642
652
|
<li><a href="/docs/skills"><strong>Skills</strong></a> — write, install, and share single-file TypeScript skills. Learn the skill manifest format, the sandbox environment, and the community registry.</li>
|
|
653
|
+
<li><a href="/docs/skills#personal-features"><strong>Personal Features</strong></a> — built-in tools for todos, notes, preferences, conversation topics, and scheduled follow-ups. Your personal productivity layer, stored locally.</li>
|
|
643
654
|
<li><a href="/docs/channels"><strong>Channel Setup</strong></a> — step-by-step guides for configuring each channel: creating bots, obtaining tokens, setting up webhooks, and configuring allow-lists.</li>
|
|
644
655
|
<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>
|
|
645
656
|
<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>
|
|
646
657
|
<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>
|
|
647
|
-
<li><a href="/docs/marketplace"><strong>
|
|
658
|
+
<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>
|
|
648
659
|
<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>
|
|
649
660
|
<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>
|
|
650
661
|
<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
|
@@ -65,6 +65,7 @@
|
|
|
65
65
|
<a href="/docs/agents">Agents & Workflows</a>
|
|
66
66
|
<a href="/docs/memory">Memory System</a>
|
|
67
67
|
<a href="/docs/skills" class="active">Skills</a>
|
|
68
|
+
<a href="/docs/skills#personal-features">Personal Features</a>
|
|
68
69
|
</div>
|
|
69
70
|
</div>
|
|
70
71
|
<div class="docs-sidebar-section">
|
|
@@ -162,7 +163,7 @@ export default async function (input: Record<string, unknown>): Promise<
|
|
|
162
163
|
<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
164
|
</ul>
|
|
164
165
|
|
|
165
|
-
<h2>Accessing
|
|
166
|
+
<h2>Accessing API Keys</h2>
|
|
166
167
|
<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
168
|
<pre><code>export default async function (input: Record<string, unknown>): Promise<string> {
|
|
168
169
|
const apiKey = process.env.ZUBO_SECRET_WEATHER_API_KEY;
|
|
@@ -295,10 +296,116 @@ zubo publish my_skill # Publish your skill to the registry</code></pre>
|
|
|
295
296
|
<tr><td><code>image_generate</code></td><td>Generate images using AI (DALL-E, etc.)</td><td>auto</td></tr>
|
|
296
297
|
<tr><td><code>webhook_manage</code></td><td>Create, list, or remove incoming webhooks</td><td>auto</td></tr>
|
|
297
298
|
<tr><td><code>oauth_manage</code></td><td>Manage OAuth provider connections</td><td>auto</td></tr>
|
|
299
|
+
<tr><td><code>todos</code></td><td>Add, list, complete, update, and remove tasks with priorities, due dates, and tags</td><td>auto</td></tr>
|
|
300
|
+
<tr><td><code>notes</code></td><td>Save, search (FTS5), list, update, delete, and pin notes with tags</td><td>auto</td></tr>
|
|
301
|
+
<tr><td><code>preferences</code></td><td>Set, get, list, and remove user preferences (injected into system prompt)</td><td>auto</td></tr>
|
|
302
|
+
<tr><td><code>topics</code></td><td>Create, switch, list, and archive conversation topics</td><td>auto</td></tr>
|
|
303
|
+
<tr><td><code>follow_ups</code></td><td>Schedule, list, and cancel proactive follow-up messages</td><td>auto</td></tr>
|
|
298
304
|
</tbody>
|
|
299
305
|
</table>
|
|
300
306
|
<p>Tools marked <strong>confirm</strong> require user confirmation before execution. Tools marked <strong>auto</strong> run immediately without prompting.</p>
|
|
301
307
|
|
|
308
|
+
<h2 id="personal-features">Personal Features</h2>
|
|
309
|
+
<p>Built-in tools for personal productivity — todos, notes, preferences, conversation topics, and scheduled follow-ups. These run in the main process (not sandboxed) and store data in your local SQLite database.</p>
|
|
310
|
+
|
|
311
|
+
<h3><code>todos</code></h3>
|
|
312
|
+
<p>A full task manager built into your agent. Add tasks, set priorities and due dates, tag them for organization, and check them off when done.</p>
|
|
313
|
+
<table>
|
|
314
|
+
<thead>
|
|
315
|
+
<tr><th>Action</th><th>Description</th></tr>
|
|
316
|
+
</thead>
|
|
317
|
+
<tbody>
|
|
318
|
+
<tr><td><code>add</code></td><td>Create a new task with an optional priority (<code>low</code>, <code>medium</code>, <code>high</code>), due date, and tags.</td></tr>
|
|
319
|
+
<tr><td><code>list</code></td><td>List tasks, optionally filtered by status, priority, tag, or due date.</td></tr>
|
|
320
|
+
<tr><td><code>complete</code></td><td>Mark a task as done by ID.</td></tr>
|
|
321
|
+
<tr><td><code>update</code></td><td>Update a task's text, priority, due date, or tags.</td></tr>
|
|
322
|
+
<tr><td><code>remove</code></td><td>Delete a task by ID.</td></tr>
|
|
323
|
+
</tbody>
|
|
324
|
+
</table>
|
|
325
|
+
<p><strong>Key parameters:</strong> <code>text</code> (string), <code>priority</code> (<code>"low"</code> | <code>"medium"</code> | <code>"high"</code>), <code>due</code> (date string), <code>tags</code> (comma-separated), <code>id</code> (task ID for update/complete/remove).</p>
|
|
326
|
+
<p><strong>Example:</strong></p>
|
|
327
|
+
<pre><code>"Add a todo: finish the API docs, high priority, due Friday, tag: work"
|
|
328
|
+
"Show my todos tagged work"
|
|
329
|
+
"Complete todo #3"</code></pre>
|
|
330
|
+
|
|
331
|
+
<h3><code>notes</code></h3>
|
|
332
|
+
<p>Save, search, and organize notes with full-text search (FTS5). Pin important notes so they surface first.</p>
|
|
333
|
+
<table>
|
|
334
|
+
<thead>
|
|
335
|
+
<tr><th>Action</th><th>Description</th></tr>
|
|
336
|
+
</thead>
|
|
337
|
+
<tbody>
|
|
338
|
+
<tr><td><code>save</code></td><td>Create a new note with optional title, tags, and pinned status.</td></tr>
|
|
339
|
+
<tr><td><code>search</code></td><td>Full-text search across all notes using FTS5.</td></tr>
|
|
340
|
+
<tr><td><code>list</code></td><td>List all notes, optionally filtered by tag or pinned status.</td></tr>
|
|
341
|
+
<tr><td><code>update</code></td><td>Update a note's content, title, tags, or pinned status.</td></tr>
|
|
342
|
+
<tr><td><code>delete</code></td><td>Delete a note by ID.</td></tr>
|
|
343
|
+
<tr><td><code>pin</code></td><td>Toggle the pinned status of a note.</td></tr>
|
|
344
|
+
</tbody>
|
|
345
|
+
</table>
|
|
346
|
+
<p><strong>Key parameters:</strong> <code>title</code> (string), <code>content</code> (string), <code>tags</code> (comma-separated), <code>pinned</code> (boolean), <code>query</code> (search string), <code>id</code> (note ID).</p>
|
|
347
|
+
<p><strong>Example:</strong></p>
|
|
348
|
+
<pre><code>"Save a note: meeting with design team moved to Thursday 2pm, tag: meetings"
|
|
349
|
+
"Search my notes for API design"
|
|
350
|
+
"Pin note #5"</code></pre>
|
|
351
|
+
|
|
352
|
+
<h3><code>preferences</code></h3>
|
|
353
|
+
<p>Store user preferences as category/key/value pairs. Preferences are automatically injected into the system prompt so the agent always knows your settings.</p>
|
|
354
|
+
<table>
|
|
355
|
+
<thead>
|
|
356
|
+
<tr><th>Action</th><th>Description</th></tr>
|
|
357
|
+
</thead>
|
|
358
|
+
<tbody>
|
|
359
|
+
<tr><td><code>set</code></td><td>Set a preference value for a given category and key.</td></tr>
|
|
360
|
+
<tr><td><code>get</code></td><td>Retrieve a specific preference by category and key.</td></tr>
|
|
361
|
+
<tr><td><code>list</code></td><td>List all preferences, optionally filtered by category.</td></tr>
|
|
362
|
+
<tr><td><code>remove</code></td><td>Delete a preference by category and key.</td></tr>
|
|
363
|
+
</tbody>
|
|
364
|
+
</table>
|
|
365
|
+
<p><strong>Key parameters:</strong> <code>category</code> (string, e.g. <code>"display"</code>, <code>"communication"</code>, <code>"coding"</code>), <code>key</code> (string), <code>value</code> (string).</p>
|
|
366
|
+
<p><strong>Example:</strong></p>
|
|
367
|
+
<pre><code>"Set my preference: coding/language = TypeScript"
|
|
368
|
+
"What are my communication preferences?"
|
|
369
|
+
"Remove preference coding/editor"</code></pre>
|
|
370
|
+
|
|
371
|
+
<h3><code>topics</code></h3>
|
|
372
|
+
<p>Organize conversations into named topics. Each topic scopes a separate session, so context stays focused and you can switch between projects easily.</p>
|
|
373
|
+
<table>
|
|
374
|
+
<thead>
|
|
375
|
+
<tr><th>Action</th><th>Description</th></tr>
|
|
376
|
+
</thead>
|
|
377
|
+
<tbody>
|
|
378
|
+
<tr><td><code>create</code></td><td>Create a new topic with a name and optional description.</td></tr>
|
|
379
|
+
<tr><td><code>switch</code></td><td>Switch the active conversation to a different topic.</td></tr>
|
|
380
|
+
<tr><td><code>list</code></td><td>List all topics, including archived ones.</td></tr>
|
|
381
|
+
<tr><td><code>archive</code></td><td>Archive a topic to keep things tidy without deleting history.</td></tr>
|
|
382
|
+
</tbody>
|
|
383
|
+
</table>
|
|
384
|
+
<p><strong>Key parameters:</strong> <code>name</code> (string), <code>description</code> (string), <code>id</code> (topic ID for switch/archive).</p>
|
|
385
|
+
<p><strong>Example:</strong></p>
|
|
386
|
+
<pre><code>"Create a topic called 'Website Redesign'"
|
|
387
|
+
"Switch to the API project topic"
|
|
388
|
+
"List my topics"
|
|
389
|
+
"Archive the old marketing topic"</code></pre>
|
|
390
|
+
|
|
391
|
+
<h3><code>follow_ups</code></h3>
|
|
392
|
+
<p>Schedule proactive follow-up messages that Zubo sends to you at a specified time. Uses one-shot cron jobs under the hood — the job fires once and auto-deletes.</p>
|
|
393
|
+
<table>
|
|
394
|
+
<thead>
|
|
395
|
+
<tr><th>Action</th><th>Description</th></tr>
|
|
396
|
+
</thead>
|
|
397
|
+
<tbody>
|
|
398
|
+
<tr><td><code>schedule</code></td><td>Schedule a follow-up message for a specific time or delay.</td></tr>
|
|
399
|
+
<tr><td><code>list</code></td><td>List all pending follow-ups.</td></tr>
|
|
400
|
+
<tr><td><code>cancel</code></td><td>Cancel a scheduled follow-up by ID.</td></tr>
|
|
401
|
+
</tbody>
|
|
402
|
+
</table>
|
|
403
|
+
<p><strong>Key parameters:</strong> <code>message</code> (string — what Zubo should say), <code>time</code> (date/time string or natural language like <code>"in 2 hours"</code>, <code>"tomorrow at 9am"</code>), <code>id</code> (follow-up ID for cancel).</p>
|
|
404
|
+
<p><strong>Example:</strong></p>
|
|
405
|
+
<pre><code>"Follow up with me tomorrow at 10am about the deployment"
|
|
406
|
+
"List my pending follow-ups"
|
|
407
|
+
"Cancel follow-up #2"</code></pre>
|
|
408
|
+
|
|
302
409
|
<h2>Legacy Format (SKILL.md)</h2>
|
|
303
410
|
<p>Earlier versions of Zubo used a Markdown-based skill definition file called <code>SKILL.md</code>. This format is still fully supported for backward compatibility:</p>
|
|
304
411
|
<pre><code># weather
|
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">
|
|
@@ -300,7 +300,15 @@
|
|
|
300
300
|
<p>Build your own tools in TypeScript and share them with the community. A sandboxed skill system with scoped secrets, hot-reload, and a public registry.</p>
|
|
301
301
|
</div>
|
|
302
302
|
|
|
303
|
-
<div class="bento-card
|
|
303
|
+
<div class="bento-card tilt-card" data-feature="personal">
|
|
304
|
+
<div class="bento-icon">
|
|
305
|
+
<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="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg>
|
|
306
|
+
</div>
|
|
307
|
+
<h3>Personal Features</h3>
|
|
308
|
+
<p>Built-in todos, notes, preferences, conversation topics, and scheduled follow-ups. Your personal productivity layer, stored locally and always in context.</p>
|
|
309
|
+
</div>
|
|
310
|
+
|
|
311
|
+
<div class="bento-card tilt-card" data-feature="llm">
|
|
304
312
|
<div class="bento-icon">
|
|
305
313
|
<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="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/><polyline points="7.5 4.21 12 6.81 16.5 4.21"/><polyline points="7.5 19.79 7.5 14.6 3 12"/><polyline points="21 12 16.5 14.6 16.5 19.79"/><polyline points="3.27 6.96 12 12.01 20.73 6.96"/><line x1="12" y1="22.08" x2="12" y2="12"/></svg>
|
|
306
314
|
</div>
|
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/context.ts
CHANGED
|
@@ -7,12 +7,12 @@ export interface AgentContext {
|
|
|
7
7
|
messages: LlmMessage[];
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
export function assembleContext(
|
|
10
|
+
export async function assembleContext(
|
|
11
11
|
sessionId: string,
|
|
12
12
|
maxTurns: number = 50,
|
|
13
13
|
memories: string = ""
|
|
14
|
-
): AgentContext {
|
|
14
|
+
): Promise<AgentContext> {
|
|
15
15
|
const messages = loadSession(sessionId, maxTurns);
|
|
16
|
-
const system = buildSystemPrompt(memories);
|
|
16
|
+
const system = await buildSystemPrompt(memories);
|
|
17
17
|
return { system, messages };
|
|
18
18
|
}
|
package/src/agent/loop.ts
CHANGED
|
@@ -79,7 +79,7 @@ async function prepareLoop(
|
|
|
79
79
|
// Assemble context (uses static import — no dynamic import overhead)
|
|
80
80
|
const ctx = options.systemPromptOverride
|
|
81
81
|
? { system: options.systemPromptOverride, messages: loadSession(sessionId, 50) }
|
|
82
|
-
: assembleContext(sessionId, 50, fullMemories);
|
|
82
|
+
: await assembleContext(sessionId, 50, fullMemories);
|
|
83
83
|
|
|
84
84
|
const messages = compactMessages(ctx.messages, llm.contextWindow);
|
|
85
85
|
|