feat(policy): add per-channel channelPolicies with hot-reload list mode/lists
This commit is contained in:
@@ -4,6 +4,15 @@ export type WhisperGateConfig = {
|
||||
listMode?: "human-list" | "agent-list";
|
||||
humanList?: string[];
|
||||
agentList?: string[];
|
||||
channelPolicies?: Record<
|
||||
string,
|
||||
{
|
||||
listMode?: "human-list" | "agent-list";
|
||||
humanList?: string[];
|
||||
agentList?: string[];
|
||||
endSymbols?: string[];
|
||||
}
|
||||
>;
|
||||
// backward compatibility
|
||||
bypassUserIds?: string[];
|
||||
endSymbols?: string[];
|
||||
@@ -21,9 +30,34 @@ function getLastChar(input: string): string {
|
||||
return t.length ? t[t.length - 1] : "";
|
||||
}
|
||||
|
||||
function resolvePolicy(config: WhisperGateConfig, channelId?: string) {
|
||||
const globalMode = config.listMode || "human-list";
|
||||
const globalHuman = config.humanList || config.bypassUserIds || [];
|
||||
const globalAgent = config.agentList || [];
|
||||
const globalEnd = config.endSymbols || ["🔚"];
|
||||
|
||||
if (!channelId) {
|
||||
return { listMode: globalMode, humanList: globalHuman, agentList: globalAgent, endSymbols: globalEnd };
|
||||
}
|
||||
|
||||
const cp = config.channelPolicies || {};
|
||||
const scoped = cp[channelId];
|
||||
if (!scoped) {
|
||||
return { listMode: globalMode, humanList: globalHuman, agentList: globalAgent, endSymbols: globalEnd };
|
||||
}
|
||||
|
||||
return {
|
||||
listMode: scoped.listMode || globalMode,
|
||||
humanList: scoped.humanList || globalHuman,
|
||||
agentList: scoped.agentList || globalAgent,
|
||||
endSymbols: scoped.endSymbols || globalEnd,
|
||||
};
|
||||
}
|
||||
|
||||
export function evaluateDecision(params: {
|
||||
config: WhisperGateConfig;
|
||||
channel?: string;
|
||||
channelId?: string;
|
||||
senderId?: string;
|
||||
content?: string;
|
||||
}): Decision {
|
||||
@@ -38,16 +72,18 @@ export function evaluateDecision(params: {
|
||||
return { shouldUseNoReply: false, reason: "non_discord" };
|
||||
}
|
||||
|
||||
const mode = config.listMode || "human-list";
|
||||
const humanList = config.humanList || config.bypassUserIds || [];
|
||||
const agentList = config.agentList || [];
|
||||
const policy = resolvePolicy(config, params.channelId);
|
||||
|
||||
const mode = policy.listMode;
|
||||
const humanList = policy.humanList;
|
||||
const agentList = policy.agentList;
|
||||
|
||||
const senderId = params.senderId || "";
|
||||
const inHumanList = !!senderId && humanList.includes(senderId);
|
||||
const inAgentList = !!senderId && agentList.includes(senderId);
|
||||
|
||||
const lastChar = getLastChar(params.content || "");
|
||||
const hasEnd = !!lastChar && (config.endSymbols || []).includes(lastChar);
|
||||
const hasEnd = !!lastChar && policy.endSymbols.includes(lastChar);
|
||||
|
||||
if (mode === "human-list") {
|
||||
if (inHumanList) {
|
||||
|
||||
Reference in New Issue
Block a user