Files
openclaw/src/shared/silent-reply-policy.test.ts
Tak Hoffman cc57d56b92 fix: Align silent reply prompt guidance (#70954)
* Align silent reply prompt guidance

* Pass explicit silent reply conversation types

* Handle dm alias in direct prompt guidance

* Respect policy session type for routed replies

* Preserve routed silent reply policy type

* Propagate silent reply dispatcher chat type

* Align prompt silent reply target policy

* Avoid direct silent fallback prompt token

* Use inbound key for prompt silent policy

* Rewrite direct silent replies in dispatcher
2026-04-24 12:06:54 -05:00

91 lines
2.9 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
DEFAULT_SILENT_REPLY_POLICY,
DEFAULT_SILENT_REPLY_REWRITE,
classifySilentReplyConversationType,
resolveSilentReplyPolicyFromPolicies,
resolveSilentReplyRewriteFromPolicies,
resolveSilentReplyRewriteText,
} from "./silent-reply-policy.js";
describe("classifySilentReplyConversationType", () => {
it("prefers an explicit conversation type", () => {
expect(
classifySilentReplyConversationType({
sessionKey: "agent:main:group:123",
conversationType: "internal",
}),
).toBe("internal");
});
it("classifies direct and group session keys", () => {
expect(
classifySilentReplyConversationType({
sessionKey: "agent:main:telegram:direct:123",
}),
).toBe("direct");
expect(
classifySilentReplyConversationType({
sessionKey: "agent:main:discord:group:123",
}),
).toBe("group");
});
it("treats webchat as direct by default and unknown surfaces as internal", () => {
expect(classifySilentReplyConversationType({ surface: "webchat" })).toBe("direct");
expect(classifySilentReplyConversationType({ surface: "subagent" })).toBe("internal");
});
});
describe("resolveSilentReplyRewriteFromPolicies", () => {
it("uses defaults when no overrides exist", () => {
expect(resolveSilentReplyRewriteFromPolicies({ conversationType: "direct" })).toBe(
DEFAULT_SILENT_REPLY_REWRITE.direct,
);
expect(resolveSilentReplyRewriteFromPolicies({ conversationType: "group" })).toBe(
DEFAULT_SILENT_REPLY_REWRITE.group,
);
});
it("prefers surface rewrite settings over defaults", () => {
expect(
resolveSilentReplyRewriteFromPolicies({
conversationType: "direct",
defaultRewrite: { direct: true },
surfaceRewrite: { direct: false },
}),
).toBe(false);
});
});
describe("resolveSilentReplyRewriteText", () => {
it("picks a deterministic rewrite for a given seed", () => {
const first = resolveSilentReplyRewriteText({ seed: "main:NO_REPLY" });
const second = resolveSilentReplyRewriteText({ seed: "main:NO_REPLY" });
expect(first).toBe(second);
expect(first).not.toBe("NO_REPLY");
expect(first.length).toBeGreaterThan(0);
});
});
describe("resolveSilentReplyPolicyFromPolicies", () => {
it("uses defaults when no overrides exist", () => {
expect(resolveSilentReplyPolicyFromPolicies({ conversationType: "direct" })).toBe(
DEFAULT_SILENT_REPLY_POLICY.direct,
);
expect(resolveSilentReplyPolicyFromPolicies({ conversationType: "group" })).toBe(
DEFAULT_SILENT_REPLY_POLICY.group,
);
});
it("prefers surface policy over defaults", () => {
expect(
resolveSilentReplyPolicyFromPolicies({
conversationType: "direct",
defaultPolicy: { direct: "disallow" },
surfacePolicy: { direct: "allow" },
}),
).toBe("allow");
});
});