Fix discussion channel closure handling
This commit is contained in:
@@ -7,6 +7,7 @@ import { sendModeratorMessage } from "./moderator-discord.js";
|
||||
type DiscussionServiceDeps = {
|
||||
api: OpenClawPluginApi;
|
||||
moderatorBotToken?: string;
|
||||
moderatorUserId?: string;
|
||||
workspaceRoot?: string;
|
||||
forceNoReplyForSession: (sessionKey: string) => void;
|
||||
};
|
||||
@@ -171,6 +172,7 @@ export function createDiscussionService(deps: DiscussionServiceDeps) {
|
||||
async function maybeReplyClosedChannel(channelId: string, senderId?: string): Promise<boolean> {
|
||||
const metadata = getDiscussion(channelId);
|
||||
if (!metadata || metadata.status !== "closed") return false;
|
||||
if (deps.moderatorUserId && senderId && senderId === deps.moderatorUserId) return true;
|
||||
if (!deps.moderatorBotToken) return true;
|
||||
await sendModeratorMessage(deps.moderatorBotToken, channelId, buildClosedMessage(), deps.api.logger);
|
||||
return true;
|
||||
@@ -179,6 +181,9 @@ export function createDiscussionService(deps: DiscussionServiceDeps) {
|
||||
return {
|
||||
initDiscussion,
|
||||
getDiscussion,
|
||||
isClosedDiscussion(channelId: string): boolean {
|
||||
return isDiscussionClosed(channelId);
|
||||
},
|
||||
maybeSendIdleReminder,
|
||||
maybeReplyClosedChannel,
|
||||
handleCallback,
|
||||
|
||||
@@ -29,6 +29,9 @@ type BeforeModelResolveDeps = {
|
||||
pruneDecisionMap: () => void;
|
||||
shouldDebugLog: (config: DirigentConfig & DebugConfig, channelId?: string) => boolean;
|
||||
ensureTurnOrder: (api: OpenClawPluginApi, channelId: string) => Promise<void> | void;
|
||||
discussionService?: {
|
||||
isClosedDiscussion: (channelId: string) => boolean;
|
||||
};
|
||||
};
|
||||
|
||||
export function registerBeforeModelResolveHook(deps: BeforeModelResolveDeps): void {
|
||||
@@ -47,6 +50,7 @@ export function registerBeforeModelResolveHook(deps: BeforeModelResolveDeps): vo
|
||||
pruneDecisionMap,
|
||||
shouldDebugLog,
|
||||
ensureTurnOrder,
|
||||
discussionService,
|
||||
} = deps;
|
||||
|
||||
api.on("before_model_resolve", async (event, ctx) => {
|
||||
@@ -86,6 +90,15 @@ export function registerBeforeModelResolveHook(deps: BeforeModelResolveDeps): vo
|
||||
|
||||
if (derived.channelId) {
|
||||
sessionChannelId.set(key, derived.channelId);
|
||||
if (discussionService?.isClosedDiscussion(derived.channelId)) {
|
||||
sessionAllowed.set(key, false);
|
||||
api.logger.info(`dirigent: before_model_resolve forcing no-reply for closed discussion channel=${derived.channelId} session=${key}`);
|
||||
return {
|
||||
model: ctx.model,
|
||||
provider: ctx.provider,
|
||||
noReply: true,
|
||||
};
|
||||
}
|
||||
}
|
||||
const resolvedAccountId = resolveAccountId(api, ctx.agentId || "");
|
||||
if (resolvedAccountId) {
|
||||
|
||||
@@ -118,6 +118,7 @@ export default {
|
||||
const discussionService = createDiscussionService({
|
||||
api,
|
||||
moderatorBotToken: baseConfig.moderatorBotToken,
|
||||
moderatorUserId: getModeratorUserId(baseConfig),
|
||||
workspaceRoot: process.cwd(),
|
||||
forceNoReplyForSession: (sessionKey: string) => {
|
||||
if (sessionKey) forceNoReplySessions.add(sessionKey);
|
||||
@@ -163,6 +164,7 @@ export default {
|
||||
pruneDecisionMap,
|
||||
shouldDebugLog,
|
||||
ensureTurnOrder,
|
||||
discussionService,
|
||||
});
|
||||
|
||||
registerBeforePromptBuildHook({
|
||||
|
||||
Reference in New Issue
Block a user