2026-03-08 01:15:05 +00:00
|
|
|
import { describe, expect, it } from "vitest";
|
|
|
|
|
import { buildDiscordNativeCommandContext } from "./native-command-context.js";
|
|
|
|
|
|
|
|
|
|
describe("buildDiscordNativeCommandContext", () => {
|
|
|
|
|
it("builds direct-message slash command context", () => {
|
|
|
|
|
const ctx = buildDiscordNativeCommandContext({
|
|
|
|
|
prompt: "/status",
|
|
|
|
|
commandArgs: {},
|
|
|
|
|
sessionKey: "agent:codex:discord:slash:user-1",
|
|
|
|
|
commandTargetSessionKey: "agent:codex:discord:direct:user-1",
|
|
|
|
|
accountId: "default",
|
|
|
|
|
interactionId: "interaction-1",
|
|
|
|
|
channelId: "dm-1",
|
|
|
|
|
commandAuthorized: true,
|
|
|
|
|
isDirectMessage: true,
|
|
|
|
|
isGroupDm: false,
|
|
|
|
|
isGuild: false,
|
|
|
|
|
isThreadChannel: false,
|
|
|
|
|
user: {
|
|
|
|
|
id: "user-1",
|
|
|
|
|
username: "tester",
|
|
|
|
|
globalName: "Tester",
|
|
|
|
|
},
|
|
|
|
|
sender: {
|
|
|
|
|
id: "user-1",
|
|
|
|
|
tag: "tester#0001",
|
|
|
|
|
},
|
|
|
|
|
timestampMs: 123,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
expect(ctx.From).toBe("discord:user-1");
|
|
|
|
|
expect(ctx.To).toBe("slash:user-1");
|
|
|
|
|
expect(ctx.ChatType).toBe("direct");
|
|
|
|
|
expect(ctx.ConversationLabel).toBe("Tester");
|
|
|
|
|
expect(ctx.SessionKey).toBe("agent:codex:discord:slash:user-1");
|
|
|
|
|
expect(ctx.CommandTargetSessionKey).toBe("agent:codex:discord:direct:user-1");
|
|
|
|
|
expect(ctx.OriginatingTo).toBe("user:user-1");
|
|
|
|
|
expect(ctx.UntrustedContext).toBeUndefined();
|
|
|
|
|
expect(ctx.GroupSystemPrompt).toBeUndefined();
|
|
|
|
|
expect(ctx.Timestamp).toBe(123);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("builds guild slash command context with owner allowlist and channel metadata", () => {
|
|
|
|
|
const ctx = buildDiscordNativeCommandContext({
|
|
|
|
|
prompt: "/status",
|
2026-03-07 17:33:45 -08:00
|
|
|
commandArgs: { values: { model: "gpt-5.2" } },
|
2026-03-08 01:15:05 +00:00
|
|
|
sessionKey: "agent:codex:discord:slash:user-1",
|
|
|
|
|
commandTargetSessionKey: "agent:codex:discord:channel:chan-1",
|
|
|
|
|
accountId: "default",
|
|
|
|
|
interactionId: "interaction-1",
|
|
|
|
|
channelId: "chan-1",
|
|
|
|
|
threadParentId: "parent-1",
|
|
|
|
|
guildName: "Ops",
|
|
|
|
|
channelTopic: "Production alerts only",
|
|
|
|
|
channelConfig: {
|
|
|
|
|
allowed: true,
|
|
|
|
|
users: ["discord:user-1"],
|
|
|
|
|
systemPrompt: "Use the runbook.",
|
|
|
|
|
},
|
|
|
|
|
guildInfo: {
|
|
|
|
|
id: "guild-1",
|
|
|
|
|
},
|
|
|
|
|
allowNameMatching: false,
|
|
|
|
|
commandAuthorized: true,
|
|
|
|
|
isDirectMessage: false,
|
|
|
|
|
isGroupDm: false,
|
|
|
|
|
isGuild: true,
|
|
|
|
|
isThreadChannel: true,
|
|
|
|
|
user: {
|
|
|
|
|
id: "user-1",
|
|
|
|
|
username: "tester",
|
|
|
|
|
},
|
|
|
|
|
sender: {
|
|
|
|
|
id: "user-1",
|
|
|
|
|
name: "tester",
|
|
|
|
|
tag: "tester#0001",
|
|
|
|
|
},
|
|
|
|
|
timestampMs: 456,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
expect(ctx.From).toBe("discord:channel:chan-1");
|
|
|
|
|
expect(ctx.ChatType).toBe("channel");
|
|
|
|
|
expect(ctx.ConversationLabel).toBe("chan-1");
|
|
|
|
|
expect(ctx.GroupSubject).toBe("Ops");
|
|
|
|
|
expect(ctx.GroupSystemPrompt).toBe("Use the runbook.");
|
|
|
|
|
expect(ctx.OwnerAllowFrom).toEqual(["user-1"]);
|
|
|
|
|
expect(ctx.MessageThreadId).toBe("chan-1");
|
|
|
|
|
expect(ctx.ThreadParentId).toBe("parent-1");
|
|
|
|
|
expect(ctx.OriginatingTo).toBe("channel:chan-1");
|
|
|
|
|
expect(ctx.UntrustedContext).toEqual([
|
|
|
|
|
expect.stringContaining("Discord channel topic:\nProduction alerts only"),
|
|
|
|
|
]);
|
|
|
|
|
expect(ctx.Timestamp).toBe(456);
|
|
|
|
|
});
|
|
|
|
|
});
|