Skip to content

Commit 2e67805

Browse files
dcramercodex
andcommitted
ref(slack): Remove channel member listing tool
Remove the slackChannelListMembers tool and its underlying Slack action path because the tool only exposed member IDs and provided low user value. Prune related status labels, mock fixtures, and integration/unit coverage tied to the removed tool to keep the Slack tool surface smaller and explicit. Co-Authored-By: GPT-5 Codex <noreply@openai.com>
1 parent 404de40 commit 2e67805

8 files changed

Lines changed: 0 additions & 158 deletions

File tree

packages/junior/src/chat/respond.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,6 @@ function formatToolStatus(toolName: string): string {
223223
webFetch: "Reading source pages",
224224
slackChannelPostMessage: "Posting message to channel",
225225
slackMessageAddReaction: "Adding emoji reaction",
226-
slackChannelListMembers: "Listing channel members",
227226
slackChannelListMessages: "Listing channel messages",
228227
slackCanvasCreate: "Creating detailed brief",
229228
slackCanvasUpdate: "Updating detailed brief",
@@ -278,7 +277,6 @@ function formatToolResultStatus(toolName: string): string {
278277
webFetch: "Reviewing page content",
279278
slackChannelPostMessage: "Posted message to channel",
280279
slackMessageAddReaction: "Added emoji reaction",
281-
slackChannelListMembers: "Reviewed channel members",
282280
slackChannelListMessages: "Reviewed channel messages",
283281
slackCanvasCreate: "Preparing canvas response",
284282
slackCanvasUpdate: "Preparing canvas update",

packages/junior/src/chat/slack-actions/channel.ts

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,6 @@ export interface SlackThreadReply {
3030
files?: SlackFileRef[];
3131
}
3232

33-
export interface SlackChannelMemberProfile {
34-
user_id: string;
35-
}
36-
3733
export async function postMessageToChannel(input: {
3834
channelId: string;
3935
text: string;
@@ -191,34 +187,6 @@ export async function listChannelMessages(input: {
191187
};
192188
}
193189

194-
export async function listChannelMembers(input: {
195-
channelId: string;
196-
limit: number;
197-
cursor?: string;
198-
}): Promise<{ members: SlackChannelMemberProfile[]; nextCursor?: string }> {
199-
const client = getSlackClient();
200-
const channelId = normalizeSlackConversationId(input.channelId);
201-
if (!channelId) {
202-
throw new Error("Slack channel member lookup requires a valid channel ID");
203-
}
204-
const targetLimit = Math.max(1, Math.min(input.limit, 200));
205-
const response = await withSlackRetries(() =>
206-
client.conversations.members({
207-
channel: channelId,
208-
limit: targetLimit,
209-
cursor: input.cursor
210-
}),
211-
3,
212-
{ action: "conversations.members" }
213-
);
214-
215-
const members = (response.members ?? []).slice(0, targetLimit);
216-
return {
217-
members: members.map((userId) => ({ user_id: userId })),
218-
nextCursor: response.response_metadata?.next_cursor || undefined
219-
};
220-
}
221-
222190
export async function listThreadReplies(input: {
223191
channelId: string;
224192
threadTs: string;

packages/junior/src/chat/tools/index.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import type { SkillMetadata } from "@/chat/skills";
33
import { createImageGenerateTool } from "@/chat/tools/image-generate";
44
import { createLoadSkillTool } from "@/chat/tools/load-skill";
55
import { createReadFileTool } from "@/chat/tools/read-file";
6-
import { createSlackChannelListMembersTool } from "@/chat/tools/slack-channel-list-members";
76
import { createSlackChannelListMessagesTool } from "@/chat/tools/slack-channel-list-messages";
87
import { createSlackChannelPostMessageTool } from "@/chat/tools/slack-channel-post-message";
98
import { createSlackMessageAddReactionTool } from "@/chat/tools/slack-message-add-reaction";
@@ -136,11 +135,6 @@ export function createTools(
136135
createSlackChannelPostMessageTool(context, state),
137136
hooks
138137
);
139-
tools.slackChannelListMembers = wrapToolExecution(
140-
"slackChannelListMembers",
141-
createSlackChannelListMembersTool(context),
142-
hooks
143-
);
144138
tools.slackChannelListMessages = wrapToolExecution(
145139
"slackChannelListMessages",
146140
createSlackChannelListMessagesTool(context),

packages/junior/src/chat/tools/slack-channel-list-members.ts

Lines changed: 0 additions & 46 deletions
This file was deleted.

packages/junior/tests/fixtures/slack/factories/api.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,6 @@ export function conversationsHistoryPage(input: {
6161
});
6262
}
6363

64-
export function conversationsMembersPage(input: { members?: string[]; nextCursor?: string } = {}): {
65-
ok: true;
66-
members: string[];
67-
response_metadata: { next_cursor: string };
68-
} {
69-
return slackOk({
70-
members: input.members ?? [TEST_USER_ID],
71-
response_metadata: {
72-
next_cursor: input.nextCursor ?? ""
73-
}
74-
});
75-
}
76-
7764
export function conversationsRepliesPage(input: {
7865
messages?: Array<Record<string, unknown>>;
7966
nextCursor?: string;

packages/junior/tests/integration/slack-channel-tools.test.ts

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { describe, expect, it } from "vitest";
2-
import { createSlackChannelListMembersTool } from "@/chat/tools/slack-channel-list-members";
32
import { createSlackChannelListMessagesTool } from "@/chat/tools/slack-channel-list-messages";
43
import { createSlackChannelPostMessageTool } from "@/chat/tools/slack-channel-post-message";
54
import { createSlackMessageAddReactionTool } from "@/chat/tools/slack-message-add-reaction";
@@ -8,7 +7,6 @@ import {
87
chatGetPermalinkOk,
98
chatPostMessageOk,
109
conversationsHistoryPage,
11-
conversationsMembersPage,
1210
reactionsAddOk
1311
} from "../fixtures/slack/factories/api";
1412
import { getCapturedSlackApiCalls, queueSlackApiError, queueSlackApiResponse } from "../msw/handlers/slack-api";
@@ -122,37 +120,6 @@ describe("slack channel tools", () => {
122120
expect(getCapturedSlackApiCalls("chat.getPermalink")).toHaveLength(1);
123121
});
124122

125-
it("lists channel members and forwards request parameters", async () => {
126-
queueSlackApiResponse("conversations.members", {
127-
body: conversationsMembersPage({
128-
members: ["U1"],
129-
nextCursor: "next-members"
130-
})
131-
});
132-
const tool = createSlackChannelListMembersTool(createContext("who is in this channel?"));
133-
134-
const result = await executeTool(tool, {
135-
limit: 25
136-
});
137-
138-
expect(result).toMatchObject({
139-
ok: true,
140-
channel_id: "C123",
141-
count: 1,
142-
next_cursor: "next-members"
143-
});
144-
expect(result).toMatchObject({
145-
members: [{ user_id: "U1" }]
146-
});
147-
148-
const memberCalls = getCapturedSlackApiCalls("conversations.members");
149-
expect(memberCalls).toHaveLength(1);
150-
expect(memberCalls[0]?.params).toMatchObject({
151-
channel: "C123"
152-
});
153-
expect(String(memberCalls[0]?.params.limit)).toBe("25");
154-
});
155-
156123
it("lists channel messages across history parameters and forwards filters", async () => {
157124
queueSlackApiResponse("conversations.history", {
158125
body: conversationsHistoryPage({
@@ -306,23 +273,4 @@ describe("slack channel tools", () => {
306273
expect(getCapturedSlackApiCalls("reactions.add")).toHaveLength(1);
307274
});
308275

309-
it("propagates missing_scope when members API fails", async () => {
310-
queueSlackApiError("conversations.members", {
311-
error: "missing_scope",
312-
needed: "channels:read",
313-
provided: "chat:write"
314-
});
315-
const tool = createSlackChannelListMembersTool(createContext("who is in this channel?"));
316-
317-
await expect(
318-
executeTool(tool, {
319-
limit: 10
320-
})
321-
).rejects.toMatchObject({
322-
name: "SlackActionError",
323-
code: "missing_scope",
324-
needed: "channels:read",
325-
provided: "chat:write"
326-
});
327-
});
328276
});

packages/junior/tests/msw/handlers/slack-api.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
chatPostMessageOk,
88
conversationsCanvasesCreateOk,
99
conversationsHistoryPage,
10-
conversationsMembersPage,
1110
conversationsRepliesPage,
1211
filesCompleteUploadOk,
1312
filesGetUploadUrlOk,
@@ -29,7 +28,6 @@ export const SUPPORTED_SLACK_API_METHODS = [
2928
"reactions.add",
3029
"reactions.remove",
3130
"conversations.history",
32-
"conversations.members",
3331
"conversations.replies",
3432
"canvases.create",
3533
"conversations.canvases.create",
@@ -170,8 +168,6 @@ function defaultSlackApiResponse(method: SlackApiMethod): SlackMockHttpResponse
170168
return { body: reactionsAddOk() };
171169
case "conversations.history":
172170
return { body: conversationsHistoryPage() };
173-
case "conversations.members":
174-
return { body: conversationsMembersPage() };
175171
case "conversations.replies":
176172
return { body: conversationsRepliesPage() };
177173
case "canvases.create":

packages/junior/tests/unit/slack/tool-registration.test.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ describe("Slack tool registration", () => {
88
const tools = createTools([], {}, { channelId: "D12345", sandbox: noopSandbox });
99

1010
expect(tools).not.toHaveProperty("slackChannelPostMessage");
11-
expect(tools).not.toHaveProperty("slackChannelListMembers");
1211
expect(tools).not.toHaveProperty("slackChannelListMessages");
1312
expect(tools).toHaveProperty("slackMessageAddReaction");
1413
expect(tools).toHaveProperty("slackCanvasCreate");
@@ -18,7 +17,6 @@ describe("Slack tool registration", () => {
1817
const tools = createTools([], {}, { channelId: "C12345", sandbox: noopSandbox });
1918

2019
expect(tools).toHaveProperty("slackChannelPostMessage");
21-
expect(tools).toHaveProperty("slackChannelListMembers");
2220
expect(tools).toHaveProperty("slackChannelListMessages");
2321
expect(tools).toHaveProperty("slackMessageAddReaction");
2422
expect(tools).toHaveProperty("slackCanvasCreate");
@@ -29,7 +27,6 @@ describe("Slack tool registration", () => {
2927

3028
expect(tools).not.toHaveProperty("slackCanvasCreate");
3129
expect(tools).not.toHaveProperty("slackChannelPostMessage");
32-
expect(tools).not.toHaveProperty("slackChannelListMembers");
3330
expect(tools).not.toHaveProperty("slackChannelListMessages");
3431
expect(tools).not.toHaveProperty("slackMessageAddReaction");
3532
});

0 commit comments

Comments
 (0)