@rubytech/taskmaster 1.0.41 → 1.0.43
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/dist/agents/skills/refresh.js +7 -1
- package/dist/agents/skills/workspace.js +47 -11
- package/dist/agents/system-prompt.js +2 -2
- package/dist/agents/tools/web-search.js +1 -1
- package/dist/build-info.json +3 -3
- package/dist/control-ui/assets/{index-kKBJzIuf.js → index-CpAWYZjj.js} +55 -48
- package/dist/control-ui/assets/index-CpAWYZjj.js.map +1 -0
- package/dist/control-ui/assets/{index-BfV0Mtl7.css → index-D5w5UtCL.css} +1 -1
- package/dist/control-ui/index.html +2 -2
- package/dist/gateway/server/ws-connection/message-handler.js +1 -0
- package/dist/gateway/server-broadcast.js +15 -1
- package/dist/gateway/server-constants.js +1 -1
- package/dist/gateway/server-methods/apikeys.js +3 -3
- package/dist/gateway/server.impl.js +32 -1
- package/dist/memory/manager.js +37 -1
- package/package.json +1 -1
- package/skills/google-ai/SKILL.md +29 -0
- package/skills/google-ai/references/browser-setup.md +90 -0
- package/skills/tavily/SKILL.md +28 -0
- package/skills/tavily/references/browser-setup.md +100 -0
- package/taskmaster-docs/USER-GUIDE.md +79 -12
- package/templates/customer/agents/admin/BOOTSTRAP.md +13 -2
- package/templates/tradesupport/agents/admin/BOOTSTRAP.md +13 -2
- package/dist/control-ui/assets/index-kKBJzIuf.js.map +0 -1
|
@@ -14,12 +14,12 @@ import { readConfigFileSnapshot, writeConfigFile } from "../../config/config.js"
|
|
|
14
14
|
import { ErrorCodes, errorShape } from "../protocol/index.js";
|
|
15
15
|
import { formatForLog } from "../ws-log.js";
|
|
16
16
|
const PROVIDER_CATALOG = [
|
|
17
|
-
{ id: "anthropic", name: "Anthropic", category: "AI Model" },
|
|
17
|
+
{ id: "anthropic", name: "Anthropic", category: "AI Model", primary: true },
|
|
18
|
+
{ id: "google", name: "Google", category: "Voice & Video", primary: true },
|
|
19
|
+
{ id: "tavily", name: "Tavily", category: "Web Search", primary: true },
|
|
18
20
|
{ id: "openai", name: "OpenAI", category: "AI Model" },
|
|
19
|
-
{ id: "google", name: "Google", category: "AI Model" },
|
|
20
21
|
{ id: "replicate", name: "Replicate", category: "AI Model" },
|
|
21
22
|
{ id: "hume", name: "Hume", category: "Voice" },
|
|
22
|
-
{ id: "tavily", name: "Tavily", category: "Web Search" },
|
|
23
23
|
{ id: "brave", name: "Brave", category: "Web Search" },
|
|
24
24
|
{ id: "elevenlabs", name: "ElevenLabs", category: "Voice" },
|
|
25
25
|
];
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { listAgentIds, resolveAgentWorkspaceDir, resolveDefaultAgentId, } from "../agents/agent-scope.js";
|
|
2
2
|
import { initSubagentRegistry } from "../agents/subagent-registry.js";
|
|
3
|
-
import { registerSkillsChangeListener } from "../agents/skills/refresh.js";
|
|
3
|
+
import { bumpSkillsSnapshotVersion, registerSkillsChangeListener, } from "../agents/skills/refresh.js";
|
|
4
|
+
import { syncBundledSkillsToWorkspace } from "../agents/skills/workspace.js";
|
|
4
5
|
import { listChannelPlugins } from "../channels/plugins/index.js";
|
|
5
6
|
import { createDefaultDeps } from "../cli/deps.js";
|
|
6
7
|
import { formatCliCommand } from "../cli/command-format.js";
|
|
@@ -146,6 +147,36 @@ export async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
146
147
|
initSubagentRegistry();
|
|
147
148
|
const defaultAgentId = resolveDefaultAgentId(cfgAtStart);
|
|
148
149
|
const defaultWorkspaceDir = resolveAgentWorkspaceDir(cfgAtStart, defaultAgentId);
|
|
150
|
+
// Sync bundled skills to each workspace root (new skills only, never overwrites).
|
|
151
|
+
// Agent workspace dirs may point to subdirs (e.g. ~/taskmaster/agents/public);
|
|
152
|
+
// skills/ lives at the root (e.g. ~/taskmaster/skills/), so strip /agents/{id}.
|
|
153
|
+
{
|
|
154
|
+
const roots = new Set();
|
|
155
|
+
for (const agentId of listAgentIds(cfgAtStart)) {
|
|
156
|
+
const agentWs = resolveAgentWorkspaceDir(cfgAtStart, agentId);
|
|
157
|
+
const rootMatch = agentWs.replace(/\/+$/, "").match(/^(.+)\/agents\/[^/]+$/);
|
|
158
|
+
roots.add(rootMatch ? rootMatch[1] : agentWs);
|
|
159
|
+
}
|
|
160
|
+
let anySynced = false;
|
|
161
|
+
for (const root of roots) {
|
|
162
|
+
try {
|
|
163
|
+
const { synced } = await syncBundledSkillsToWorkspace(root);
|
|
164
|
+
if (synced.length > 0) {
|
|
165
|
+
anySynced = true;
|
|
166
|
+
log.info(`synced bundled skills to ${root}: ${synced.join(", ")}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
log.warn(`failed to sync bundled skills to ${root}: ${String(err)}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Force existing sessions to rebuild their skills snapshot on the next message.
|
|
174
|
+
// Without this, sessions from a previous boot keep stale snapshots because
|
|
175
|
+
// their version (a high timestamp) exceeds the post-restart globalVersion (1).
|
|
176
|
+
if (anySynced) {
|
|
177
|
+
bumpSkillsSnapshotVersion({ reason: "manual" });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
149
180
|
const baseMethods = listGatewayMethods();
|
|
150
181
|
const { pluginRegistry, gatewayMethods: baseGatewayMethods } = loadGatewayPlugins({
|
|
151
182
|
cfg: cfgAtStart,
|
package/dist/memory/manager.js
CHANGED
|
@@ -140,6 +140,34 @@ function isPathAllowedByScope(relPath, scope, ctx, operation = "read") {
|
|
|
140
140
|
// Read uses read scope
|
|
141
141
|
return checkPatterns(relPath, scope.read, ctx);
|
|
142
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Check if a file path could ever be accessible under any session context.
|
|
145
|
+
* Used during indexing where no peer/channel context is available.
|
|
146
|
+
* Template placeholders ({peer}, {channel}, {agentId}) are expanded to wildcards
|
|
147
|
+
* so that files reachable by any peer are still indexed.
|
|
148
|
+
*/
|
|
149
|
+
function isPathIndexableByScope(relPath, scope) {
|
|
150
|
+
if (!scope)
|
|
151
|
+
return true;
|
|
152
|
+
const patterns = scope.read;
|
|
153
|
+
if (!patterns)
|
|
154
|
+
return true;
|
|
155
|
+
const { include, exclude } = patterns;
|
|
156
|
+
if (!include || include.length === 0)
|
|
157
|
+
return true;
|
|
158
|
+
// Expand template variables to wildcards — any peer could connect
|
|
159
|
+
const expandTemplates = (p) => p.replaceAll("{peer}", "*").replaceAll("{channel}", "*").replaceAll("{agentId}", "*");
|
|
160
|
+
const matchesInclude = include.some((p) => matchGlobPattern(expandTemplates(p), relPath));
|
|
161
|
+
if (!matchesInclude)
|
|
162
|
+
return false;
|
|
163
|
+
// Only apply static excludes (no templates) — template excludes are session-specific
|
|
164
|
+
if (exclude && exclude.length > 0) {
|
|
165
|
+
const staticExcludes = exclude.filter((p) => !p.includes("{"));
|
|
166
|
+
if (staticExcludes.some((p) => matchGlobPattern(p, relPath)))
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
143
171
|
/**
|
|
144
172
|
* Check if a DM peer has virtual group membership for a given group path.
|
|
145
173
|
* If the path is inside memory/groups/{groupId}/ and a member file exists
|
|
@@ -1137,7 +1165,15 @@ export class MemoryIndexManager {
|
|
|
1137
1165
|
}
|
|
1138
1166
|
async syncMemoryFiles(params) {
|
|
1139
1167
|
const files = await listMemoryFiles(this.workspaceDir);
|
|
1140
|
-
const
|
|
1168
|
+
const allEntries = await Promise.all(files.map(async (file) => buildFileEntry(file, this.workspaceDir)));
|
|
1169
|
+
// Filter to files this agent's scope can access — prevents cross-agent indexing
|
|
1170
|
+
const scope = this.settings.scope;
|
|
1171
|
+
const fileEntries = scope
|
|
1172
|
+
? allEntries.filter((entry) => isPathIndexableByScope(entry.path, scope))
|
|
1173
|
+
: allEntries;
|
|
1174
|
+
if (scope && fileEntries.length < allEntries.length) {
|
|
1175
|
+
log.debug(`memory sync: scope filtered ${allEntries.length - fileEntries.length} files for ${this.agentId}`);
|
|
1176
|
+
}
|
|
1141
1177
|
log.debug("memory sync: indexing memory files", {
|
|
1142
1178
|
files: fileEntries.length,
|
|
1143
1179
|
needsFullReindex: params.needsFullReindex,
|
package/package.json
CHANGED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: google-ai
|
|
3
|
+
description: Help users get a free Google AI (Gemini) API key via browser automation.
|
|
4
|
+
metadata: {"taskmaster":{"emoji":"🔑"}}
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Google AI Setup
|
|
8
|
+
|
|
9
|
+
Guides users through obtaining a Google AI (Gemini) API key using browser automation, with real-time screenshots sent via WhatsApp so the user can see what's happening.
|
|
10
|
+
|
|
11
|
+
## When to activate
|
|
12
|
+
|
|
13
|
+
- BOOTSTRAP detects missing Google/Gemini API key
|
|
14
|
+
- User needs voice note transcription or video analysis
|
|
15
|
+
- User asks for help getting a Google AI key
|
|
16
|
+
|
|
17
|
+
## What it unlocks
|
|
18
|
+
|
|
19
|
+
- Voice note transcription (audio to text)
|
|
20
|
+
- Video analysis (key frame extraction + description)
|
|
21
|
+
- Free tier with generous monthly quota, no credit card required
|
|
22
|
+
|
|
23
|
+
## References
|
|
24
|
+
|
|
25
|
+
| Task | When to use | Reference |
|
|
26
|
+
|------|-------------|-----------|
|
|
27
|
+
| Browser-assisted setup | User wants help getting the key | `references/browser-setup.md` |
|
|
28
|
+
|
|
29
|
+
Load the reference and follow its instructions. Send screenshots at each step so the user can see progress.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Google AI API Key — Browser Setup
|
|
2
|
+
|
|
3
|
+
Step-by-step browser automation to obtain a Google AI (Gemini) API key. Send screenshots at each step so the user can follow along.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- User has a Google account (Gmail or business email)
|
|
10
|
+
- Browser tool available
|
|
11
|
+
- WhatsApp or chat channel for sending screenshots
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Step 1: Explain
|
|
16
|
+
|
|
17
|
+
Tell the user what you're doing and why:
|
|
18
|
+
|
|
19
|
+
> "I need a Google AI key so I can understand voice notes and videos you send me. Let me get you a free one — I'll do it in the browser and show you what's happening."
|
|
20
|
+
|
|
21
|
+
Ask which Google account to use. If they don't have one, guide them to accounts.google.com first.
|
|
22
|
+
|
|
23
|
+
## Step 2: Open Google AI Studio
|
|
24
|
+
|
|
25
|
+
Navigate to `https://aistudio.google.com` and take a screenshot. Send it to the user.
|
|
26
|
+
|
|
27
|
+
## Step 3: Sign in (if needed)
|
|
28
|
+
|
|
29
|
+
If a login page appears:
|
|
30
|
+
|
|
31
|
+
1. Tell the user you see the sign-in page
|
|
32
|
+
2. Enter their email address
|
|
33
|
+
3. Ask the user for their password — type it and continue
|
|
34
|
+
4. If 2FA is required, ask the user to complete it on their device, then continue
|
|
35
|
+
5. Screenshot after login
|
|
36
|
+
|
|
37
|
+
## Step 4: Navigate to API Keys
|
|
38
|
+
|
|
39
|
+
Navigate to `https://aistudio.google.com/api-keys` and take a screenshot. Send it: "Here's your API keys dashboard."
|
|
40
|
+
|
|
41
|
+
## Step 5: Get the key
|
|
42
|
+
|
|
43
|
+
Take a snapshot and check the page content.
|
|
44
|
+
|
|
45
|
+
**If a key already exists in the table:**
|
|
46
|
+
- Click the key name to view details
|
|
47
|
+
- Copy the key from the modal (starts with `AIza`, ~39 characters)
|
|
48
|
+
- Screenshot: "You already have a key — I've grabbed it."
|
|
49
|
+
|
|
50
|
+
**If no key exists:**
|
|
51
|
+
- Click "Create API key"
|
|
52
|
+
- Follow any prompts (usually instant)
|
|
53
|
+
- Copy the new key
|
|
54
|
+
- Screenshot: "Created a new key for you."
|
|
55
|
+
|
|
56
|
+
## Step 6: Add to Taskmaster
|
|
57
|
+
|
|
58
|
+
Tell the user how to add the key:
|
|
59
|
+
|
|
60
|
+
> "Open your browser and go to your Taskmaster setup page.
|
|
61
|
+
>
|
|
62
|
+
> 1. Click **'Manage'** in the API Keys section
|
|
63
|
+
> 2. Find the **Google** row (says 'Voice & Video')
|
|
64
|
+
> 3. Paste your key into the field
|
|
65
|
+
> 4. Click **Save**
|
|
66
|
+
>
|
|
67
|
+
> Let me know when it's done and I'll test it!"
|
|
68
|
+
|
|
69
|
+
## Step 7: Confirm
|
|
70
|
+
|
|
71
|
+
Once the user confirms the key is saved:
|
|
72
|
+
|
|
73
|
+
> "Google AI is now enabled. You can send me voice notes and videos — I'll understand them both."
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Troubleshooting
|
|
78
|
+
|
|
79
|
+
| Problem | Solution |
|
|
80
|
+
|---------|----------|
|
|
81
|
+
| Sign-in fails / 2FA required | Ask user to complete 2FA on their device |
|
|
82
|
+
| "Enable API" prompt appears | Click the enable button, wait, proceed |
|
|
83
|
+
| Key exists but not visible | Navigate to the key via table, click to reveal |
|
|
84
|
+
| Browser automation fails | Fall back to manual: "Can you go to aistudio.google.com and..." |
|
|
85
|
+
|
|
86
|
+
## What the user gets
|
|
87
|
+
|
|
88
|
+
- Free tier: image analysis, video analysis, audio transcription
|
|
89
|
+
- Generous monthly quota sufficient for small business use
|
|
90
|
+
- No credit card required
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tavily
|
|
3
|
+
description: Help users get a free Tavily API key for web search via browser automation.
|
|
4
|
+
metadata: {"taskmaster":{"emoji":"🔑"}}
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Tavily Setup
|
|
8
|
+
|
|
9
|
+
Guides users through obtaining a Tavily API key using browser automation, with real-time screenshots sent via WhatsApp so the user can see what's happening.
|
|
10
|
+
|
|
11
|
+
## When to activate
|
|
12
|
+
|
|
13
|
+
- BOOTSTRAP detects missing Tavily API key
|
|
14
|
+
- User needs web search capabilities
|
|
15
|
+
- User asks for help getting a Tavily key
|
|
16
|
+
|
|
17
|
+
## What it unlocks
|
|
18
|
+
|
|
19
|
+
- Web search (look up prices, suppliers, regulations, opening hours)
|
|
20
|
+
- 1,000 free search credits per month, no credit card required
|
|
21
|
+
|
|
22
|
+
## References
|
|
23
|
+
|
|
24
|
+
| Task | When to use | Reference |
|
|
25
|
+
|------|-------------|-----------|
|
|
26
|
+
| Browser-assisted setup | User wants help getting the key | `references/browser-setup.md` |
|
|
27
|
+
|
|
28
|
+
Load the reference and follow its instructions. Send screenshots at each step so the user can see progress.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Tavily API Key — Browser Setup
|
|
2
|
+
|
|
3
|
+
Step-by-step browser automation to obtain a Tavily API key. Send screenshots at each step so the user can follow along.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- User has a Google account (ideally the same one used for Google AI setup)
|
|
10
|
+
- Browser tool available
|
|
11
|
+
- WhatsApp or chat channel for sending screenshots
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Step 1: Explain
|
|
16
|
+
|
|
17
|
+
Tell the user what you're doing and why:
|
|
18
|
+
|
|
19
|
+
> "I need web search so I can look things up for you — prices, suppliers, your website, anything online. Let me get you a free Tavily key. Takes about 2 minutes."
|
|
20
|
+
|
|
21
|
+
## Step 2: Open Tavily
|
|
22
|
+
|
|
23
|
+
Navigate to `https://app.tavily.com` and take a screenshot. Send it to the user.
|
|
24
|
+
|
|
25
|
+
## Step 3: Sign up via Google OAuth (preferred)
|
|
26
|
+
|
|
27
|
+
Google OAuth avoids CAPTCHAs — always try this first.
|
|
28
|
+
|
|
29
|
+
1. Take a snapshot and find the "Continue with Google" button
|
|
30
|
+
2. Click it and screenshot
|
|
31
|
+
3. If multiple Google accounts appear, select the one used for Google AI setup
|
|
32
|
+
4. Grant permissions when the consent screen appears
|
|
33
|
+
5. Screenshot at each stage
|
|
34
|
+
|
|
35
|
+
## Step 4: Dismiss modals
|
|
36
|
+
|
|
37
|
+
After signup, modals may appear ("Stay updated", "Welcome"). Close or skip each one.
|
|
38
|
+
|
|
39
|
+
## Step 5: Extract the API key
|
|
40
|
+
|
|
41
|
+
Take a snapshot of the dashboard.
|
|
42
|
+
|
|
43
|
+
- Find the API key in the table (starts with `tvly-`, ~40 characters)
|
|
44
|
+
- If the key is masked, click the eye icon to reveal it
|
|
45
|
+
- Screenshot: "Here's your Tavily dashboard. Copying your API key..."
|
|
46
|
+
- Copy the key value
|
|
47
|
+
|
|
48
|
+
## Step 6: Add to Taskmaster
|
|
49
|
+
|
|
50
|
+
Tell the user how to add the key:
|
|
51
|
+
|
|
52
|
+
> "Open your browser and go to your Taskmaster setup page.
|
|
53
|
+
>
|
|
54
|
+
> 1. Click **'Manage'** in the API Keys section
|
|
55
|
+
> 2. Find the **Tavily** row (says 'Web Search')
|
|
56
|
+
> 3. Paste your key into the field
|
|
57
|
+
> 4. Click **Save**
|
|
58
|
+
>
|
|
59
|
+
> Let me know when it's done and I'll test it!"
|
|
60
|
+
|
|
61
|
+
## Step 7: Confirm
|
|
62
|
+
|
|
63
|
+
Once the user confirms the key is saved:
|
|
64
|
+
|
|
65
|
+
> "Web search is now enabled. Try asking me to look something up — 'What's the price of 15mm copper pipe?' or 'Search for the best coffee machines.'"
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Alternative: Email signup (if Google OAuth fails)
|
|
70
|
+
|
|
71
|
+
Use only if the user refuses Google account or OAuth fails.
|
|
72
|
+
|
|
73
|
+
1. Navigate to app.tavily.com and click "Sign up"
|
|
74
|
+
2. Enter the user's email address
|
|
75
|
+
3. **Stop at the CAPTCHA** — screenshot it and send to the user
|
|
76
|
+
4. Ask: "What's the code shown in the image?"
|
|
77
|
+
5. Enter the code and submit
|
|
78
|
+
6. Ask the user to check their email for a verification link
|
|
79
|
+
7. Once verified, sign in and extract the API key from the dashboard
|
|
80
|
+
|
|
81
|
+
**Common issues with email signup:**
|
|
82
|
+
- CAPTCHA wrong — refresh page, get new CAPTCHA, try again
|
|
83
|
+
- Email not arriving — check spam, wait 5 minutes, resend
|
|
84
|
+
- Verification link expired — request new one from Tavily login page
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Troubleshooting
|
|
89
|
+
|
|
90
|
+
| Problem | Solution |
|
|
91
|
+
|---------|----------|
|
|
92
|
+
| Already logged in from a previous session | Extract the key directly from the dashboard |
|
|
93
|
+
| "Account already exists" | Switch to login flow, sign in, extract key |
|
|
94
|
+
| Browser stuck or page won't load | Fall back to manual: "Can you go to app.tavily.com and..." |
|
|
95
|
+
|
|
96
|
+
## What the user gets
|
|
97
|
+
|
|
98
|
+
- Free tier: 1,000 search credits per month
|
|
99
|
+
- Sufficient for small business onboarding and daily use
|
|
100
|
+
- No credit card required
|
|
@@ -328,7 +328,7 @@ When someone sends a voice note, image, or video, your assistant processes it au
|
|
|
328
328
|
| Images | Automatically described — your assistant sees what's in the picture |
|
|
329
329
|
| Video | Key frames extracted and described — your assistant understands the content |
|
|
330
330
|
|
|
331
|
-
Voice note transcription and video analysis require API
|
|
331
|
+
Voice note transcription and video analysis require a Google AI (Gemini) API key (see API Keys below). Image analysis uses your Claude connection directly — no extra key needed.
|
|
332
332
|
|
|
333
333
|
### Customer Records
|
|
334
334
|
|
|
@@ -427,7 +427,7 @@ Your assistant can open and interact with websites in a built-in browser — fil
|
|
|
427
427
|
| Complete multi-step tasks | Navigate through checkout flows, registration pages, or dashboards |
|
|
428
428
|
|
|
429
429
|
**Try asking:**
|
|
430
|
-
- "
|
|
430
|
+
- "Help me get a free Tavily API key"
|
|
431
431
|
- "Go to the Travis Perkins website and find the price of 15mm copper pipe"
|
|
432
432
|
- "Log into my supplier portal and check my order status"
|
|
433
433
|
|
|
@@ -448,13 +448,20 @@ During setup, you connect to Claude in one of two ways:
|
|
|
448
448
|
|
|
449
449
|
#### Optional API Keys
|
|
450
450
|
|
|
451
|
-
These unlock additional capabilities. All are optional — your assistant works without them.
|
|
451
|
+
These unlock additional capabilities. All are optional — your assistant works without them. The Setup page shows the recommended keys prominently, with additional keys available under "Additional keys".
|
|
452
452
|
|
|
453
453
|
| Provider | What it unlocks | Free tier? |
|
|
454
454
|
|----------|----------------|------------|
|
|
455
|
-
| **
|
|
456
|
-
| **
|
|
457
|
-
|
|
455
|
+
| **Tavily** | Web search — lets your assistant search the internet | Yes (free plan available) |
|
|
456
|
+
| **Google** | Voice note transcription and video analysis | Yes (limited free tier) |
|
|
457
|
+
|
|
458
|
+
> **Note:** Image analysis does not need an extra API key — Claude has built-in vision and analyses images directly.
|
|
459
|
+
|
|
460
|
+
Additional keys for advanced use cases:
|
|
461
|
+
|
|
462
|
+
| Provider | What it unlocks | Free tier? |
|
|
463
|
+
|----------|----------------|------------|
|
|
464
|
+
| **Brave** | Web search — alternative to Tavily | Yes (free plan available) |
|
|
458
465
|
| **OpenAI** | Voice note transcription, alternative AI models | No |
|
|
459
466
|
| **ElevenLabs** | Text-to-speech (for future voice features) | Yes (limited free tier) |
|
|
460
467
|
| **Replicate** | Image and media AI models | No |
|
|
@@ -469,12 +476,31 @@ These unlock additional capabilities. All are optional — your assistant works
|
|
|
469
476
|
|
|
470
477
|
#### Recommended Free Keys
|
|
471
478
|
|
|
472
|
-
To get the most out of your assistant at no extra cost:
|
|
479
|
+
To get the most out of your assistant at no extra cost, we recommend signing up for two free services: **Tavily** (web search) and **Google AI** (voice notes and video). Both are free and take a couple of minutes each.
|
|
480
|
+
|
|
481
|
+
> **Tip:** Your assistant can do this for you. Just ask — for example, "Help me get a Tavily API key" — and it will use the browser to walk through the process. You can watch on the Browser page and step in if needed. The instructions below are for doing it yourself.
|
|
482
|
+
|
|
483
|
+
#### Getting a Tavily Key (Web Search)
|
|
484
|
+
|
|
485
|
+
1. Go to [app.tavily.com](https://app.tavily.com)
|
|
486
|
+
2. Click **"Continue with Google"** (easiest — no CAPTCHA) or sign up with your email
|
|
487
|
+
3. If using Google, select your Google account and grant permission
|
|
488
|
+
4. You'll land on the Tavily dashboard — your API key is shown in the **API Keys** table
|
|
489
|
+
5. If the key is hidden, click the **eye icon** to reveal it
|
|
490
|
+
6. **Copy the key** (it starts with `tvly-`)
|
|
491
|
+
7. Go to your Taskmaster **Setup** page, click the **API Keys** row, find **Tavily**, paste the key, and click **Save**
|
|
473
492
|
|
|
474
|
-
|
|
475
|
-
- **Google AI** — sign up at [aistudio.google.com](https://aistudio.google.com) for voice note transcription and video analysis
|
|
493
|
+
You get 1,000 free search credits per month — more than enough for daily business use.
|
|
476
494
|
|
|
477
|
-
|
|
495
|
+
#### Getting a Google AI Key (Voice Notes & Video)
|
|
496
|
+
|
|
497
|
+
1. Go to [aistudio.google.com](https://aistudio.google.com) and sign in with your Google account
|
|
498
|
+
2. Click **API keys** in the left sidebar (or go directly to [aistudio.google.com/api-keys](https://aistudio.google.com/api-keys))
|
|
499
|
+
3. If you already have a key listed, click the key name to view it. If not, click **"Create API key"**
|
|
500
|
+
4. **Copy the key** (it starts with `AIza`)
|
|
501
|
+
5. Go to your Taskmaster **Setup** page, click the **API Keys** row, find **Google**, paste the key, and click **Save**
|
|
502
|
+
|
|
503
|
+
The free tier is generous — no credit card required and sufficient for small business use.
|
|
478
504
|
|
|
479
505
|
---
|
|
480
506
|
|
|
@@ -526,6 +552,23 @@ The setup page shows a **Status Dashboard** with status indicators for each serv
|
|
|
526
552
|
|
|
527
553
|
Each service has a refresh button (circular arrow icon) you can tap to reconnect or restart. Tap the small **(i)** button next to any service to see detailed status information.
|
|
528
554
|
|
|
555
|
+
### Refresh vs. Re-pair Buttons
|
|
556
|
+
|
|
557
|
+
The status dashboard has **two different refresh mechanisms** — use the right one to avoid creating unnecessary QR codes:
|
|
558
|
+
|
|
559
|
+
**Refresh Status button (top of dashboard):**
|
|
560
|
+
- **What it does:** Checks all services and refreshes their connection status
|
|
561
|
+
- **Use when:** WhatsApp shows yellow (linked but disconnected), or any service seems stuck
|
|
562
|
+
- **Does NOT create a new QR code** — just refreshes the existing connection
|
|
563
|
+
|
|
564
|
+
**Circular arrow next to each service:**
|
|
565
|
+
- **What it does:** Resets that specific service and generates a new QR code (for WhatsApp)
|
|
566
|
+
- **Use when:** You need to completely re-pair WhatsApp from scratch
|
|
567
|
+
- **Creates a new QR code** — you'll need to scan it again
|
|
568
|
+
|
|
569
|
+
**Rule of thumb:** Try the **Refresh Status** button first. Only use the circular arrow next to WhatsApp if you need to re-pair from scratch.
|
|
570
|
+
|
|
571
|
+
|
|
529
572
|
### WhatsApp Settings
|
|
530
573
|
|
|
531
574
|
When WhatsApp is connected, you'll see a small gear icon next to the WhatsApp label. Tap it to open the Public Agent Settings panel, which has three options:
|
|
@@ -589,8 +632,32 @@ Both views support **auto-follow** (keeps the view scrolled to the latest entrie
|
|
|
589
632
|
WhatsApp is linked but the connection dropped. This often resolves itself. If not:
|
|
590
633
|
|
|
591
634
|
1. Go to **http://taskmaster.local:18789/setup**
|
|
592
|
-
2. Tap **"Refresh Status"** — it may reconnect automatically
|
|
593
|
-
3. If still yellow after a minute, tap the circular arrow next to WhatsApp to
|
|
635
|
+
2. Tap **"Refresh Status"** (top of dashboard) — it may reconnect automatically
|
|
636
|
+
3. If still yellow after a minute, **then** tap the circular arrow next to WhatsApp to generate a new QR code and re-pair
|
|
637
|
+
|
|
638
|
+
> **Important:** The top Refresh Status button refreshes the existing connection without creating a new QR code. Only use the WhatsApp circular arrow button if you need to completely re-pair from scratch.
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
### WhatsApp messages failing with "No sessions" or "Bad MAC" errors?
|
|
643
|
+
|
|
644
|
+
The WhatsApp connection for one of your accounts has lost sync. This can happen after a power cut, an unclean shutdown, or when WhatsApp rotates its security keys. Other accounts on the same device are not affected — only the account with the problem stops sending or receiving.
|
|
645
|
+
|
|
646
|
+
**Try a restart first:**
|
|
647
|
+
|
|
648
|
+
1. Go to **http://taskmaster.local:18789/setup**
|
|
649
|
+
2. Tap the circular arrow next to **Gateway** to restart it
|
|
650
|
+
3. Wait 30 seconds — if WhatsApp reconnects and turns green, you're done
|
|
651
|
+
|
|
652
|
+
On a Raspberry Pi, you can also just unplug the device, wait 10 seconds, and plug it back in.
|
|
653
|
+
|
|
654
|
+
**If restarting doesn't fix it**, the encryption keys are permanently corrupted and need to be cleared:
|
|
655
|
+
|
|
656
|
+
1. Select the **affected account** from the account dropdown at the top
|
|
657
|
+
2. Tap **"Reset WhatsApp"** (red button) for that account
|
|
658
|
+
3. **On your phone:** WhatsApp → Settings → Linked Devices
|
|
659
|
+
4. **Remove** "Taskmaster" from the list for that number (if present)
|
|
660
|
+
5. **Scan** the new QR code
|
|
594
661
|
|
|
595
662
|
### WhatsApp linking keeps failing?
|
|
596
663
|
|
|
@@ -46,7 +46,18 @@ The paired device (self-chat) already has admin access. Ask if they want to add
|
|
|
46
46
|
|
|
47
47
|
If yes, use the `authorize_admin` tool with their phone number (international format, e.g., +447504472444).
|
|
48
48
|
|
|
49
|
-
## Step 6:
|
|
49
|
+
## Step 6: Help with API Keys
|
|
50
|
+
|
|
51
|
+
Two free API keys unlock important capabilities. Offer to help the admin get them — use the browser to walk through signup and show screenshots so the user can follow along.
|
|
52
|
+
|
|
53
|
+
- **Tavily** (web search) — load the `tavily` skill's `references/browser-setup.md` and follow its steps
|
|
54
|
+
- **Google AI** (voice notes + video) — load the `google-ai` skill's `references/browser-setup.md` and follow its steps
|
|
55
|
+
|
|
56
|
+
If the admin prefers to do it themselves, direct them to their Taskmaster setup page (API Keys section) and explain where to sign up: [app.tavily.com](https://app.tavily.com) for Tavily, [aistudio.google.com](https://aistudio.google.com) for Google AI.
|
|
57
|
+
|
|
58
|
+
These keys are optional — the assistant works without them. Don't pressure. If the admin wants to skip this and come back later, that's fine.
|
|
59
|
+
|
|
60
|
+
## Step 7: Explain What's Next
|
|
50
61
|
|
|
51
62
|
Tell them:
|
|
52
63
|
- They can message anytime to update business info
|
|
@@ -54,7 +65,7 @@ Tell them:
|
|
|
54
65
|
- They (admin) get full access to configure everything
|
|
55
66
|
- You'll learn their business as you go
|
|
56
67
|
|
|
57
|
-
## Step
|
|
68
|
+
## Step 8: Delete This File
|
|
58
69
|
|
|
59
70
|
Once setup is complete, create a file called `.bootstrap-done` in this directory (empty content is fine), then delete this file. The `.bootstrap-done` marker prevents this onboarding from reappearing.
|
|
60
71
|
|
|
@@ -47,7 +47,18 @@ The paired device (self-chat) already has admin access. Ask if they want to add
|
|
|
47
47
|
|
|
48
48
|
If yes, use the `authorize_admin` tool with their phone number (international format, e.g., +447504472444).
|
|
49
49
|
|
|
50
|
-
## Step 6:
|
|
50
|
+
## Step 6: Help with API Keys
|
|
51
|
+
|
|
52
|
+
Two free API keys unlock important capabilities. Offer to help the admin get them — use the browser to walk through signup and show screenshots so the user can follow along.
|
|
53
|
+
|
|
54
|
+
- **Tavily** (web search) — load the `tavily` skill's `references/browser-setup.md` and follow its steps
|
|
55
|
+
- **Google AI** (voice notes + video) — load the `google-ai` skill's `references/browser-setup.md` and follow its steps
|
|
56
|
+
|
|
57
|
+
If the admin prefers to do it themselves, direct them to their Taskmaster setup page (API Keys section) and explain where to sign up: [app.tavily.com](https://app.tavily.com) for Tavily, [aistudio.google.com](https://aistudio.google.com) for Google AI.
|
|
58
|
+
|
|
59
|
+
These keys are optional — the assistant works without them. Don't pressure. If the admin wants to skip this and come back later, that's fine.
|
|
60
|
+
|
|
61
|
+
## Step 7: Explain What's Next
|
|
51
62
|
|
|
52
63
|
Tell them:
|
|
53
64
|
- They can message anytime to update business info
|
|
@@ -55,7 +66,7 @@ Tell them:
|
|
|
55
66
|
- They (admin) get full access to configure everything
|
|
56
67
|
- You'll learn their business as you go
|
|
57
68
|
|
|
58
|
-
## Step
|
|
69
|
+
## Step 8: Delete This File
|
|
59
70
|
|
|
60
71
|
Once setup is complete, create a file called `.bootstrap-done` in this directory (empty content is fine), then delete this file. The `.bootstrap-done` marker prevents this onboarding from reappearing.
|
|
61
72
|
|