@rubytech/taskmaster 1.0.42 → 1.0.44
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/cli/provision-seed.js +4 -1
- 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/extensions/diagnostics-otel/node_modules/.bin/acorn +0 -0
- package/extensions/googlechat/node_modules/.bin/taskmaster +0 -0
- package/extensions/line/node_modules/.bin/taskmaster +0 -0
- package/extensions/matrix/node_modules/.bin/markdown-it +0 -0
- package/extensions/matrix/node_modules/.bin/taskmaster +0 -0
- package/extensions/memory-lancedb/node_modules/.bin/arrow2csv +0 -0
- package/extensions/memory-lancedb/node_modules/.bin/openai +0 -0
- package/extensions/msteams/node_modules/.bin/taskmaster +0 -0
- package/extensions/nostr/node_modules/.bin/taskmaster +0 -0
- package/extensions/nostr/node_modules/.bin/tsc +0 -0
- package/extensions/nostr/node_modules/.bin/tsserver +0 -0
- package/extensions/zalo/node_modules/.bin/taskmaster +0 -0
- package/extensions/zalouser/node_modules/.bin/taskmaster +0 -0
- package/package.json +54 -64
- package/scripts/install.sh +0 -0
- 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 +36 -10
- package/templates/.DS_Store +0 -0
- package/templates/customer/.DS_Store +0 -0
- package/templates/customer/agents/.DS_Store +0 -0
- package/templates/customer/agents/admin/BOOTSTRAP.md +20 -8
- package/templates/taskmaster/.gitignore +1 -0
- 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,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rubytech/taskmaster",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.44",
|
|
4
4
|
"description": "AI-powered business assistant for small businesses",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -77,66 +77,12 @@
|
|
|
77
77
|
"dist/filler/**",
|
|
78
78
|
"dist/license/**"
|
|
79
79
|
],
|
|
80
|
-
"scripts": {
|
|
81
|
-
"dev": "node scripts/run-node.mjs",
|
|
82
|
-
"postinstall": "node scripts/postinstall.js",
|
|
83
|
-
"prepack": "pnpm build && pnpm ui:build",
|
|
84
|
-
"docs:list": "node scripts/docs-list.js",
|
|
85
|
-
"docs:bin": "node scripts/build-docs-list.mjs",
|
|
86
|
-
"docs:dev": "cd docs && mint dev",
|
|
87
|
-
"docs:build": "cd docs && pnpm dlx --reporter append-only mint broken-links",
|
|
88
|
-
"build": "tsc -p tsconfig.json && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/write-build-info.ts",
|
|
89
|
-
"plugins:sync": "node --import tsx scripts/sync-plugin-versions.ts",
|
|
90
|
-
"release:check": "node --import tsx scripts/release-check.ts",
|
|
91
|
-
"ui:install": "node scripts/ui.js install",
|
|
92
|
-
"ui:dev": "node scripts/ui.js dev",
|
|
93
|
-
"ui:build": "node scripts/ui.js build",
|
|
94
|
-
"start": "node scripts/run-node.mjs",
|
|
95
|
-
"taskmaster": "node scripts/run-node.mjs",
|
|
96
|
-
"gateway:watch": "node scripts/watch-node.mjs gateway --force",
|
|
97
|
-
"logs": "npx tsx scripts/session-viewer.ts",
|
|
98
|
-
"gateway:dev": "TASKMASTER_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway",
|
|
99
|
-
"gateway:dev:reset": "TASKMASTER_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset",
|
|
100
|
-
"tui": "node scripts/run-node.mjs tui",
|
|
101
|
-
"tui:dev": "TASKMASTER_PROFILE=dev node scripts/run-node.mjs tui",
|
|
102
|
-
"taskmaster:rpc": "node scripts/run-node.mjs agent --mode rpc --json",
|
|
103
|
-
"lint": "oxlint --type-aware src test",
|
|
104
|
-
"lint:fix": "pnpm format:fix && oxlint --type-aware --fix src test",
|
|
105
|
-
"format": "oxfmt --check src test",
|
|
106
|
-
"format:fix": "oxfmt --write src test",
|
|
107
|
-
"test": "node scripts/test-parallel.mjs",
|
|
108
|
-
"test:watch": "vitest",
|
|
109
|
-
"test:ui": "pnpm --dir ui test",
|
|
110
|
-
"test:force": "node --import tsx scripts/test-force.ts",
|
|
111
|
-
"test:coverage": "vitest run --coverage",
|
|
112
|
-
"test:e2e": "vitest run --config vitest.e2e.config.ts",
|
|
113
|
-
"test:live": "TASKMASTER_LIVE_TEST=1 vitest run --config vitest.live.config.ts",
|
|
114
|
-
"test:docker:onboard": "bash scripts/e2e/onboard-docker.sh",
|
|
115
|
-
"test:docker:gateway-network": "bash scripts/e2e/gateway-network-docker.sh",
|
|
116
|
-
"test:docker:live-models": "bash scripts/test-live-models-docker.sh",
|
|
117
|
-
"test:docker:live-gateway": "bash scripts/test-live-gateway-models-docker.sh",
|
|
118
|
-
"test:docker:qr": "bash scripts/e2e/qr-import-docker.sh",
|
|
119
|
-
"test:docker:doctor-switch": "bash scripts/e2e/doctor-install-switch-docker.sh",
|
|
120
|
-
"test:docker:plugins": "bash scripts/e2e/plugins-docker.sh",
|
|
121
|
-
"test:docker:cleanup": "bash scripts/test-cleanup-docker.sh",
|
|
122
|
-
"test:docker:all": "pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup",
|
|
123
|
-
"test:all": "pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all",
|
|
124
|
-
"test:install:e2e": "bash scripts/test-install-sh-e2e-docker.sh",
|
|
125
|
-
"test:install:smoke": "bash scripts/test-install-sh-docker.sh",
|
|
126
|
-
"test:install:e2e:openai": "TASKMASTER_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh",
|
|
127
|
-
"test:install:e2e:anthropic": "TASKMASTER_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh",
|
|
128
|
-
"protocol:gen": "node --import tsx scripts/protocol-gen.ts",
|
|
129
|
-
"protocol:check": "pnpm protocol:gen && git diff --exit-code -- dist/protocol.schema.json",
|
|
130
|
-
"canvas:a2ui:bundle": "bash scripts/bundle-a2ui.sh",
|
|
131
|
-
"check:loc": "node --import tsx scripts/check-ts-max-loc.ts --max 500"
|
|
132
|
-
},
|
|
133
80
|
"keywords": [],
|
|
134
81
|
"author": "",
|
|
135
82
|
"license": "MIT",
|
|
136
83
|
"engines": {
|
|
137
84
|
"node": ">=22.12.0"
|
|
138
85
|
},
|
|
139
|
-
"packageManager": "pnpm@10.23.0",
|
|
140
86
|
"dependencies": {
|
|
141
87
|
"@agentclientprotocol/sdk": "0.13.1",
|
|
142
88
|
"@aws-sdk/client-bedrock": "^3.975.0",
|
|
@@ -226,14 +172,6 @@
|
|
|
226
172
|
"vitest": "^4.0.18",
|
|
227
173
|
"wireit": "^0.14.12"
|
|
228
174
|
},
|
|
229
|
-
"pnpm": {
|
|
230
|
-
"minimumReleaseAge": 2880,
|
|
231
|
-
"overrides": {
|
|
232
|
-
"@sinclair/typebox": "0.34.47",
|
|
233
|
-
"hono": "4.11.4",
|
|
234
|
-
"tar": "7.5.4"
|
|
235
|
-
}
|
|
236
|
-
},
|
|
237
175
|
"vitest": {
|
|
238
176
|
"coverage": {
|
|
239
177
|
"provider": "v8",
|
|
@@ -262,5 +200,57 @@
|
|
|
262
200
|
"**/vendor/**",
|
|
263
201
|
"dist/Taskmaster.app/**"
|
|
264
202
|
]
|
|
203
|
+
},
|
|
204
|
+
"scripts": {
|
|
205
|
+
"dev": "node scripts/run-node.mjs",
|
|
206
|
+
"postinstall": "node scripts/postinstall.js",
|
|
207
|
+
"docs:list": "node scripts/docs-list.js",
|
|
208
|
+
"docs:bin": "node scripts/build-docs-list.mjs",
|
|
209
|
+
"docs:dev": "cd docs && mint dev",
|
|
210
|
+
"docs:build": "cd docs && pnpm dlx --reporter append-only mint broken-links",
|
|
211
|
+
"build": "tsc -p tsconfig.json && node --import tsx scripts/canvas-a2ui-copy.ts && node --import tsx scripts/copy-hook-metadata.ts && node --import tsx scripts/write-build-info.ts",
|
|
212
|
+
"plugins:sync": "node --import tsx scripts/sync-plugin-versions.ts",
|
|
213
|
+
"release:check": "node --import tsx scripts/release-check.ts",
|
|
214
|
+
"ui:install": "node scripts/ui.js install",
|
|
215
|
+
"ui:dev": "node scripts/ui.js dev",
|
|
216
|
+
"ui:build": "node scripts/ui.js build",
|
|
217
|
+
"start": "node scripts/run-node.mjs",
|
|
218
|
+
"taskmaster": "node scripts/run-node.mjs",
|
|
219
|
+
"gateway:watch": "node scripts/watch-node.mjs gateway --force",
|
|
220
|
+
"logs": "npx tsx scripts/session-viewer.ts",
|
|
221
|
+
"gateway:dev": "TASKMASTER_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway",
|
|
222
|
+
"gateway:dev:reset": "TASKMASTER_SKIP_CHANNELS=1 node scripts/run-node.mjs --dev gateway --reset",
|
|
223
|
+
"tui": "node scripts/run-node.mjs tui",
|
|
224
|
+
"tui:dev": "TASKMASTER_PROFILE=dev node scripts/run-node.mjs tui",
|
|
225
|
+
"taskmaster:rpc": "node scripts/run-node.mjs agent --mode rpc --json",
|
|
226
|
+
"lint": "oxlint --type-aware src test",
|
|
227
|
+
"lint:fix": "pnpm format:fix && oxlint --type-aware --fix src test",
|
|
228
|
+
"format": "oxfmt --check src test",
|
|
229
|
+
"format:fix": "oxfmt --write src test",
|
|
230
|
+
"test": "node scripts/test-parallel.mjs",
|
|
231
|
+
"test:watch": "vitest",
|
|
232
|
+
"test:ui": "pnpm --dir ui test",
|
|
233
|
+
"test:force": "node --import tsx scripts/test-force.ts",
|
|
234
|
+
"test:coverage": "vitest run --coverage",
|
|
235
|
+
"test:e2e": "vitest run --config vitest.e2e.config.ts",
|
|
236
|
+
"test:live": "TASKMASTER_LIVE_TEST=1 vitest run --config vitest.live.config.ts",
|
|
237
|
+
"test:docker:onboard": "bash scripts/e2e/onboard-docker.sh",
|
|
238
|
+
"test:docker:gateway-network": "bash scripts/e2e/gateway-network-docker.sh",
|
|
239
|
+
"test:docker:live-models": "bash scripts/test-live-models-docker.sh",
|
|
240
|
+
"test:docker:live-gateway": "bash scripts/test-live-gateway-models-docker.sh",
|
|
241
|
+
"test:docker:qr": "bash scripts/e2e/qr-import-docker.sh",
|
|
242
|
+
"test:docker:doctor-switch": "bash scripts/e2e/doctor-install-switch-docker.sh",
|
|
243
|
+
"test:docker:plugins": "bash scripts/e2e/plugins-docker.sh",
|
|
244
|
+
"test:docker:cleanup": "bash scripts/test-cleanup-docker.sh",
|
|
245
|
+
"test:docker:all": "pnpm test:docker:live-models && pnpm test:docker:live-gateway && pnpm test:docker:onboard && pnpm test:docker:gateway-network && pnpm test:docker:qr && pnpm test:docker:doctor-switch && pnpm test:docker:plugins && pnpm test:docker:cleanup",
|
|
246
|
+
"test:all": "pnpm lint && pnpm build && pnpm test && pnpm test:e2e && pnpm test:live && pnpm test:docker:all",
|
|
247
|
+
"test:install:e2e": "bash scripts/test-install-sh-e2e-docker.sh",
|
|
248
|
+
"test:install:smoke": "bash scripts/test-install-sh-docker.sh",
|
|
249
|
+
"test:install:e2e:openai": "TASKMASTER_E2E_MODELS=openai bash scripts/test-install-sh-e2e-docker.sh",
|
|
250
|
+
"test:install:e2e:anthropic": "TASKMASTER_E2E_MODELS=anthropic bash scripts/test-install-sh-e2e-docker.sh",
|
|
251
|
+
"protocol:gen": "node --import tsx scripts/protocol-gen.ts",
|
|
252
|
+
"protocol:check": "pnpm protocol:gen && git diff --exit-code -- dist/protocol.schema.json",
|
|
253
|
+
"canvas:a2ui:bundle": "bash scripts/bundle-a2ui.sh",
|
|
254
|
+
"check:loc": "node --import tsx scripts/check-ts-max-loc.ts --max 500"
|
|
265
255
|
}
|
|
266
|
-
}
|
|
256
|
+
}
|
package/scripts/install.sh
CHANGED
|
File without changes
|
|
@@ -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**
|
|
492
|
+
|
|
493
|
+
You get 1,000 free search credits per month — more than enough for daily business use.
|
|
494
|
+
|
|
495
|
+
#### Getting a Google AI Key (Voice Notes & Video)
|
|
473
496
|
|
|
474
|
-
|
|
475
|
-
|
|
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**
|
|
476
502
|
|
|
477
|
-
|
|
503
|
+
The free tier is generous — no credit card required and sufficient for small business use.
|
|
478
504
|
|
|
479
505
|
---
|
|
480
506
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|