fix(rules): inject end-marker prompt for every non-no-reply discord turn

This commit is contained in:
2026-02-26 01:47:27 +00:00
parent ca96779159
commit 46ea43b3fe
2 changed files with 10 additions and 12 deletions

View File

@@ -63,9 +63,6 @@ function pruneDecisionMap(now = Date.now()) {
} }
} }
function shouldInjectEndMarker(reason: string): boolean {
return reason.startsWith("end_symbol:");
}
function getLivePluginConfig(api: OpenClawPluginApi, fallback: WhisperGateConfig): WhisperGateConfig { function getLivePluginConfig(api: OpenClawPluginApi, fallback: WhisperGateConfig): WhisperGateConfig {
const root = (api.config as Record<string, unknown>) || {}; const root = (api.config as Record<string, unknown>) || {};
@@ -335,7 +332,7 @@ export default {
} }
sessionDecision.delete(key); sessionDecision.delete(key);
if (!shouldInjectEndMarker(rec.decision.reason)) return; if (!rec.decision.shouldInjectEndMarkerPrompt) return;
api.logger.info(`whispergate: prepend end marker instruction for session=${key}, reason=${rec.decision.reason}`); api.logger.info(`whispergate: prepend end marker instruction for session=${key}, reason=${rec.decision.reason}`);
return { prependContext: END_MARKER_INSTRUCTION }; return { prependContext: END_MARKER_INSTRUCTION };

View File

@@ -21,6 +21,7 @@ export type ChannelPolicy = {
export type Decision = { export type Decision = {
shouldUseNoReply: boolean; shouldUseNoReply: boolean;
shouldInjectEndMarkerPrompt: boolean;
reason: string; reason: string;
}; };
@@ -64,12 +65,12 @@ export function evaluateDecision(params: {
const { config } = params; const { config } = params;
if (config.enabled === false) { if (config.enabled === false) {
return { shouldUseNoReply: false, reason: "disabled" }; return { shouldUseNoReply: false, shouldInjectEndMarkerPrompt: false, reason: "disabled" };
} }
const channel = (params.channel || "").toLowerCase(); const channel = (params.channel || "").toLowerCase();
if (config.discordOnly !== false && channel !== "discord") { if (config.discordOnly !== false && channel !== "discord") {
return { shouldUseNoReply: false, reason: "non_discord" }; return { shouldUseNoReply: false, shouldInjectEndMarkerPrompt: false, reason: "non_discord" };
} }
const policy = resolvePolicy(config, params.channelId, params.channelPolicies); const policy = resolvePolicy(config, params.channelId, params.channelPolicies);
@@ -87,20 +88,20 @@ export function evaluateDecision(params: {
if (mode === "human-list") { if (mode === "human-list") {
if (inHumanList) { if (inHumanList) {
return { shouldUseNoReply: false, reason: "human_list_sender" }; return { shouldUseNoReply: false, shouldInjectEndMarkerPrompt: true, reason: "human_list_sender" };
} }
if (hasEnd) { if (hasEnd) {
return { shouldUseNoReply: false, reason: `end_symbol:${lastChar}` }; return { shouldUseNoReply: false, shouldInjectEndMarkerPrompt: true, reason: `end_symbol:${lastChar}` };
} }
return { shouldUseNoReply: true, reason: "rule_match_no_end_symbol" }; return { shouldUseNoReply: true, shouldInjectEndMarkerPrompt: false, reason: "rule_match_no_end_symbol" };
} }
// agent-list mode: listed senders require end symbol; others bypass requirement. // agent-list mode: listed senders require end symbol; others bypass requirement.
if (!inAgentList) { if (!inAgentList) {
return { shouldUseNoReply: false, reason: "non_agent_list_sender" }; return { shouldUseNoReply: false, shouldInjectEndMarkerPrompt: true, reason: "non_agent_list_sender" };
} }
if (hasEnd) { if (hasEnd) {
return { shouldUseNoReply: false, reason: `end_symbol:${lastChar}` }; return { shouldUseNoReply: false, shouldInjectEndMarkerPrompt: true, reason: `end_symbol:${lastChar}` };
} }
return { shouldUseNoReply: true, reason: "agent_list_missing_end_symbol" }; return { shouldUseNoReply: true, shouldInjectEndMarkerPrompt: false, reason: "agent_list_missing_end_symbol" };
} }