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", commandArgs: { values: { model: "gpt-5.2" } }, 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); }); });