scoootscooob 8746362f5e
refactor(slack): move Slack channel code to extensions/slack/src/ (#45621)
Move all Slack channel implementation files from src/slack/ to
extensions/slack/src/ and replace originals with shim re-exports.
This follows the extension migration pattern for channel plugins.

- Copy all .ts files to extensions/slack/src/ (preserving directory
  structure: monitor/, http/, monitor/events/, monitor/message-handler/)
- Transform import paths: external src/ imports use relative paths
  back to src/, internal slack imports stay relative within extension
- Replace all src/slack/ files with shim re-exports pointing to
  the extension copies
- Update tsconfig.plugin-sdk.dts.json rootDir from "src" to "." so
  the DTS build can follow shim chains into extensions/
- Update write-plugin-sdk-entry-dts.ts re-export path accordingly
- Preserve extensions/slack/index.ts, package.json, openclaw.plugin.json,
  src/channel.ts, src/runtime.ts, src/channel.test.ts (untouched)
2026-03-14 02:47:04 -07:00

68 lines
2.3 KiB
TypeScript

import { formatAllowlistMatchMeta } from "../../../../src/channels/allowlist-match.js";
import { issuePairingChallenge } from "../../../../src/pairing/pairing-challenge.js";
import { upsertChannelPairingRequest } from "../../../../src/pairing/pairing-store.js";
import { resolveSlackAllowListMatch } from "./allow-list.js";
import type { SlackMonitorContext } from "./context.js";
export async function authorizeSlackDirectMessage(params: {
ctx: SlackMonitorContext;
accountId: string;
senderId: string;
allowFromLower: string[];
resolveSenderName: (senderId: string) => Promise<{ name?: string }>;
sendPairingReply: (text: string) => Promise<void>;
onDisabled: () => Promise<void> | void;
onUnauthorized: (params: { allowMatchMeta: string; senderName?: string }) => Promise<void> | void;
log: (message: string) => void;
}): Promise<boolean> {
if (!params.ctx.dmEnabled || params.ctx.dmPolicy === "disabled") {
await params.onDisabled();
return false;
}
if (params.ctx.dmPolicy === "open") {
return true;
}
const sender = await params.resolveSenderName(params.senderId);
const senderName = sender?.name ?? undefined;
const allowMatch = resolveSlackAllowListMatch({
allowList: params.allowFromLower,
id: params.senderId,
name: senderName,
allowNameMatching: params.ctx.allowNameMatching,
});
const allowMatchMeta = formatAllowlistMatchMeta(allowMatch);
if (allowMatch.allowed) {
return true;
}
if (params.ctx.dmPolicy === "pairing") {
await issuePairingChallenge({
channel: "slack",
senderId: params.senderId,
senderIdLine: `Your Slack user id: ${params.senderId}`,
meta: { name: senderName },
upsertPairingRequest: async ({ id, meta }) =>
await upsertChannelPairingRequest({
channel: "slack",
id,
accountId: params.accountId,
meta,
}),
sendPairingReply: params.sendPairingReply,
onCreated: () => {
params.log(
`slack pairing request sender=${params.senderId} name=${senderName ?? "unknown"} (${allowMatchMeta})`,
);
},
onReplyError: (err) => {
params.log(`slack pairing reply failed for ${params.senderId}: ${String(err)}`);
},
});
return false;
}
await params.onUnauthorized({ allowMatchMeta, senderName });
return false;
}