wolfpack-mcp 1.0.79 → 1.0.80

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.
@@ -116,7 +116,8 @@ export const AGENT_BUILDER_TOOLS = [
116
116
  description: 'Create an alias of an agent, so the same definition can run work in parallel. ' +
117
117
  'An agent runs one session at a time, so N concurrent workers means N aliases. ' +
118
118
  'The alias live-tracks the source for container image, prompts, instructions, LLM, tools, skills and tasks — edit those once on the source. ' +
119
- 'It does NOT inherit project assignment, API key permissions, secrets or schedules: set those on the alias afterwards, or it will start with a read-only key and no repository. ' +
119
+ 'It does NOT inherit project assignment, API key permissions or schedules: set those on the alias afterwards, or it will start with a read-only key and no repository. ' +
120
+ 'Secrets are inherited only when marked shared_with_aliases on the source (same-org only); an alias-local secret of the same name overrides. ' +
120
121
  'Aliases are auto-named from the source (e.g. "Coder (2)"). You cannot alias an alias.',
121
122
  inputSchema: {
122
123
  type: 'object',
@@ -714,16 +715,21 @@ export const AGENT_BUILDER_TOOLS = [
714
715
  {
715
716
  name: 'set_agent_secret',
716
717
  description: 'Create or update a secret for an agent. ' +
717
- 'Name must be uppercase letters, digits, and underscores (e.g. MY_API_KEY).',
718
+ 'Name must be uppercase letters, digits, and underscores (e.g. MY_API_KEY). ' +
719
+ 'Omit value to change only shared_with_aliases on an existing secret.',
718
720
  inputSchema: {
719
721
  type: 'object',
720
722
  properties: {
721
723
  agent_id: { type: 'string', description: 'Agent profile ID' },
722
724
  name: { type: 'string', description: 'Secret name (e.g. MY_API_KEY)' },
723
725
  value: { type: 'string', description: 'Secret value (encrypted at rest)' },
726
+ shared_with_aliases: {
727
+ type: 'boolean',
728
+ description: 'Share with same-org aliases of this agent (default false)',
729
+ },
724
730
  ...ORG_SLUG_PROP,
725
731
  },
726
- required: ['agent_id', 'name', 'value'],
732
+ required: ['agent_id', 'name'],
727
733
  },
728
734
  },
729
735
  // ─── Group 7: Discovery ───────────────────────────────────────────────────
@@ -1315,11 +1321,12 @@ export async function handleAgentBuilderTool(name, args, client) {
1315
1321
  .object({
1316
1322
  agent_id: z.string(),
1317
1323
  name: z.string(),
1318
- value: z.string(),
1324
+ value: z.string().optional(),
1325
+ shared_with_aliases: z.boolean().optional(),
1319
1326
  org_slug: orgSlugField,
1320
1327
  })
1321
1328
  .parse(args);
1322
- const secret = await client.setAgentSecret(parsed.agent_id, parsed.name, parsed.value, resolveOrg(parsed));
1329
+ const secret = await client.setAgentSecret(parsed.agent_id, parsed.name, parsed.value, parsed.shared_with_aliases, resolveOrg(parsed));
1323
1330
  return { content: [{ type: 'text', text: `Set secret "${secret.name}"` }] };
1324
1331
  }
1325
1332
  // ─── Discovery ────────────────────────────────────────────────────────────
@@ -0,0 +1,19 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { AGENT_SELF_TOOLS, AGENT_MEMORY_TOOLS } from './agentSelfTools.js';
3
+ const names = (tools) => tools.map((t) => t.name);
4
+ describe('agent self and memory tool split (#1776)', () => {
5
+ it('keeps the memory tools out of the self tools, so they can be withheld separately', () => {
6
+ expect(names(AGENT_SELF_TOOLS)).toEqual(['get_self', 'get_own_sessions']);
7
+ });
8
+ it('groups every memory tool under the separately gated set', () => {
9
+ expect(names(AGENT_MEMORY_TOOLS).sort()).toEqual([
10
+ 'get_memory',
11
+ 'list_memories',
12
+ 'save_memory',
13
+ ]);
14
+ });
15
+ it('never lists the same tool twice', () => {
16
+ const all = [...names(AGENT_SELF_TOOLS), ...names(AGENT_MEMORY_TOOLS)];
17
+ expect(new Set(all).size).toBe(all.length);
18
+ });
19
+ });
@@ -23,6 +23,12 @@ export const AGENT_SELF_TOOLS = [
23
23
  },
24
24
  },
25
25
  },
26
+ ];
27
+ /**
28
+ * Memory tools, gated by the `agent_memory` capability so an agent whose
29
+ * memory is disabled (#1776) is never offered them.
30
+ */
31
+ export const AGENT_MEMORY_TOOLS = [
26
32
  {
27
33
  name: 'list_memories',
28
34
  description: 'List all your persistent memory entries. Memory persists across sessions and is scoped to you. ' +
package/dist/client.js CHANGED
@@ -762,8 +762,12 @@ export class WolfpackClient {
762
762
  async listAgentSecrets(agentId, orgSlug) {
763
763
  return this.api.get(this.withOrgSlug(`/agents/${agentId}/secrets`, orgSlug));
764
764
  }
765
- async setAgentSecret(agentId, name, value, orgSlug) {
766
- return this.api.post(this.withOrgSlug(`/agents/${agentId}/secrets`, orgSlug), { name, value });
765
+ async setAgentSecret(agentId, name, value, sharedWithAliases, orgSlug) {
766
+ return this.api.post(this.withOrgSlug(`/agents/${agentId}/secrets`, orgSlug), {
767
+ name,
768
+ value,
769
+ sharedWithAliases,
770
+ });
767
771
  }
768
772
  // ─── Agent Builder: Skills (write) ────────────────────────────────────────
769
773
  async createSkill(body, orgSlug) {
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ import { allTasksChecked, getWorkItemReminders } from './workItemReminders.js';
11
11
  import { validateConfig, config } from './config.js';
12
12
  import { AGENT_BUILDER_TOOLS, handleAgentBuilderTool } from './agentBuilderTools.js';
13
13
  import { PROCEDURE_TOOLS, handleProcedureTool } from './procedureTools.js';
14
- import { AGENT_SELF_TOOLS, handleAgentSelfTool } from './agentSelfTools.js';
14
+ import { AGENT_SELF_TOOLS, AGENT_MEMORY_TOOLS, handleAgentSelfTool } from './agentSelfTools.js';
15
15
  import { resolveRadarItemId } from './resolveRadarItemId.js';
16
16
  import { fetch as proxyFetch } from './proxyFetch.js';
17
17
  // Get current package version
@@ -758,6 +758,8 @@ class WolfpackMCPServer {
758
758
  'AGENTS: unless granted the mcp:work_items:read_all permission, your results are always ' +
759
759
  'narrowed to items assigned to you or routed to a work pool you belong to, whatever ' +
760
760
  'assigned_to_id you pass; the response says so when this applies. ' +
761
+ 'AGENTS: when more than one item is claimable, the response also states the order to take ' +
762
+ 'them in (bug fixes first, then higher priority, then oldest) and which to pull next. ' +
761
763
  'TERMINOLOGY: "board" and "kanban" are synonymous - both refer to the Kanban board of work items. ' +
762
764
  'The board has columns: "new" (to do), "doing" (in progress), "review" (pending review), "ready" (code done, awaiting deployment), "blocked", "completed" (deployed). ' +
763
765
  'The "backlog" or "pending" status represents items not yet on the board. ' +
@@ -986,6 +988,8 @@ class WolfpackMCPServer {
986
988
  'agent and will return 403: ask a human to route it to your pool or assign it to you. ' +
987
989
  'AGENTS: pulling puts the item straight into "doing" — you are taking it to start on it ' +
988
990
  'now — so there is no separate "move it to doing" step. Move it to "review" when done. ' +
991
+ 'AGENTS: with more than one item claimable, take them in the order list_work_items gives ' +
992
+ 'you: bug fixes first, then higher priority, then oldest. ' +
989
993
  'If no assignee is specified, assigns to the API key owner. ' +
990
994
  'In personal projects, items are always assigned to the owner.',
991
995
  inputSchema: {
@@ -2040,6 +2044,7 @@ class WolfpackMCPServer {
2040
2044
  },
2041
2045
  ...(this.capabilities.includes('procedures') ? PROCEDURE_TOOLS : []),
2042
2046
  ...(this.capabilities.includes('agent_self') ? AGENT_SELF_TOOLS : []),
2047
+ ...(this.capabilities.includes('agent_memory') ? AGENT_MEMORY_TOOLS : []),
2043
2048
  ...(this.capabilities.includes('agent_builder') ? AGENT_BUILDER_TOOLS : []),
2044
2049
  ],
2045
2050
  };
@@ -2965,6 +2970,13 @@ class WolfpackMCPServer {
2965
2970
  return handleAgentSelfTool(name, args, this.client);
2966
2971
  }
2967
2972
  }
2973
+ // Check memory tools (separately gated — #1776)
2974
+ if (this.capabilities.includes('agent_memory')) {
2975
+ const memoryToolNames = AGENT_MEMORY_TOOLS.map((t) => t.name);
2976
+ if (memoryToolNames.includes(name)) {
2977
+ return handleAgentSelfTool(name, args, this.client);
2978
+ }
2979
+ }
2968
2980
  // Check agent builder tools
2969
2981
  if (this.capabilities.includes('agent_builder')) {
2970
2982
  return handleAgentBuilderTool(name, args, this.client);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wolfpack-mcp",
3
- "version": "1.0.79",
3
+ "version": "1.0.80",
4
4
  "description": "MCP server for Wolfpack AI-enhanced software delivery tools",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",