@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.
@@ -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,
@@ -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 fileEntries = await Promise.all(files.map(async (file) => buildFileEntry(file, this.workspaceDir)));
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/taskmaster",
3
- "version": "1.0.41",
3
+ "version": "1.0.43",
4
4
  "description": "AI-powered business assistant for small businesses",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -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 keys (see API Keys below). Image descriptions use your Claude connection.
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
- - "Sign up for a free Brave Search API key for me"
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
- | **Brave** | Web search — lets your assistant search the internet | Yes (free plan available) |
456
- | **Tavily** | Web search alternative search provider | Yes (free plan available) |
457
- | **Google** | Voice note transcription, video analysis, alternative AI models | Yes (limited free tier) |
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
- - **Brave Search**sign up at [brave.com/search/api](https://brave.com/search/api) for free web search
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
- > **Tip:** Your assistant can help you sign up for these accounts and get the API keys. Just ask — for example, "Sign up for a free Brave Search 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.
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 relink
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: Explain What's Next
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 7: Delete This File
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: Explain What's Next
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 7: Delete This File
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