@rubytech/taskmaster 1.0.75 → 1.0.76

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.
@@ -26,6 +26,7 @@ import { createCustomerLookupTool } from "./tools/customer-lookup-tool.js";
26
26
  import { createCustomerUpdateTool } from "./tools/customer-update-tool.js";
27
27
  import { createRelayMessageTool } from "./tools/relay-message-tool.js";
28
28
  import { createSkillReadTool } from "./tools/skill-read-tool.js";
29
+ import { createApiKeysTool } from "./tools/apikeys-tool.js";
29
30
  export function createTaskmasterTools(options) {
30
31
  const imageTool = options?.agentDir?.trim()
31
32
  ? createImageTool({
@@ -129,6 +130,7 @@ export function createTaskmasterTools(options) {
129
130
  createCustomerLookupTool(),
130
131
  createCustomerUpdateTool(),
131
132
  createRelayMessageTool(),
133
+ createApiKeysTool(),
132
134
  ];
133
135
  // Add scoped skill_read tool when skill directories are provided
134
136
  const skillDirs = (options?.skillBaseDirs ?? []).filter(Boolean);
@@ -31,7 +31,7 @@ export const TOOL_GROUPS = {
31
31
  // UI helpers
32
32
  "group:ui": ["browser", "canvas"],
33
33
  // Automation + infra
34
- "group:automation": ["cron", "gateway"],
34
+ "group:automation": ["cron", "gateway", "api_keys"],
35
35
  // Messaging surface
36
36
  "group:messaging": ["message"],
37
37
  // Nodes + device tools
@@ -64,6 +64,7 @@ export const TOOL_GROUPS = {
64
64
  "authorize_admin",
65
65
  "revoke_admin",
66
66
  "list_admins",
67
+ "api_keys",
67
68
  ],
68
69
  };
69
70
  // Tools that are never granted by profiles — must be explicitly added to the
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Agent tool for managing API keys.
3
+ *
4
+ * Wraps the gateway `apikeys.set`, `apikeys.list`, and `apikeys.remove` RPC
5
+ * methods so the agent can store, check, and remove API keys directly during
6
+ * onboarding or configuration — without asking the user to open the Setup UI.
7
+ */
8
+ import { Type } from "@sinclair/typebox";
9
+ import { jsonResult, readStringParam } from "./common.js";
10
+ import { callGatewayTool } from "./gateway.js";
11
+ const ApiKeysSchema = Type.Object({
12
+ action: Type.Union([Type.Literal("set"), Type.Literal("list"), Type.Literal("remove")], {
13
+ description: 'Action to perform: "set" stores a key, "list" shows which providers have keys configured, "remove" deletes a stored key.',
14
+ }),
15
+ provider: Type.Optional(Type.String({
16
+ description: "Provider ID (required for set/remove). Valid providers: anthropic, google, tavily, openai, replicate, hume, brave, elevenlabs.",
17
+ })),
18
+ apiKey: Type.Optional(Type.String({
19
+ description: "The API key value (required for set).",
20
+ })),
21
+ });
22
+ export function createApiKeysTool() {
23
+ return {
24
+ label: "API Keys",
25
+ name: "api_keys",
26
+ description: "Manage API keys for external providers. Use action 'set' to store a key (provider + apiKey required), 'list' to check which providers have keys configured, or 'remove' to delete a stored key. Valid providers: anthropic, google, tavily, openai, replicate, hume, brave, elevenlabs. Keys are applied immediately without restart.",
27
+ parameters: ApiKeysSchema,
28
+ execute: async (_toolCallId, args) => {
29
+ const params = args;
30
+ const action = readStringParam(params, "action", { required: true });
31
+ switch (action) {
32
+ case "list": {
33
+ const result = await callGatewayTool("apikeys.list", {});
34
+ return jsonResult(result);
35
+ }
36
+ case "set": {
37
+ const provider = readStringParam(params, "provider", { required: true });
38
+ const apiKey = readStringParam(params, "apiKey", { required: true });
39
+ const result = await callGatewayTool("apikeys.set", {}, { provider, apiKey });
40
+ return jsonResult(result);
41
+ }
42
+ case "remove": {
43
+ const provider = readStringParam(params, "provider", { required: true });
44
+ const result = await callGatewayTool("apikeys.remove", {}, { provider });
45
+ return jsonResult(result);
46
+ }
47
+ default:
48
+ throw new Error(`Unknown action: ${action}. Use "set", "list", or "remove".`);
49
+ }
50
+ },
51
+ };
52
+ }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.75",
3
- "commit": "235e8707128fc515a032d2c9dabc6d3f552c44fe",
4
- "builtAt": "2026-02-20T12:28:27.962Z"
2
+ "version": "1.0.76",
3
+ "commit": "5295efe0026f10b84e556b9bef3f4097a879e342",
4
+ "builtAt": "2026-02-20T17:49:56.005Z"
5
5
  }