// Thread command registration, including channel-specific create request normalization. import type { Command } from "commander"; import { getChannelPlugin } from "../../../channels/plugins/index.js"; import type { ChannelMessageActionName } from "../../../channels/plugins/types.public.js"; import { resolveMessageSecretScope } from "../../message-secret-scope.js"; import type { MessageCliHelpers } from "./helpers.js"; function resolveThreadCreateRequest(opts: Record) { const { channel } = resolveMessageSecretScope(opts); if (channel) { const request = getChannelPlugin(channel)?.actions?.resolveCliActionRequest?.({ action: "thread-create", args: opts, }); if (request) { return { action: request.action, params: request.args, }; } } return { action: "thread-create" as ChannelMessageActionName, params: opts, }; } /** Register thread create/list/reply commands. */ export function registerMessageThreadCommands(message: Command, helpers: MessageCliHelpers) { const thread = message.command("thread").description("Thread actions"); helpers .withMessageBase( helpers.withRequiredMessageTarget( thread .command("create") .description("Create a thread") .requiredOption("--thread-name ", "Thread name"), ), ) .option("--message-id ", "Message id (optional)") .option("-m, --message ", "Initial thread message text") .option("--auto-archive-min ", "Thread auto-archive minutes") .action(async (opts) => { const request = resolveThreadCreateRequest(opts); await helpers.runMessageAction(request.action, request.params); }); helpers .withMessageBase( thread .command("list") .description("List threads") .requiredOption("--guild-id ", "Guild id"), ) .option("--channel-id ", "Channel id") .option("--include-archived", "Include archived threads", false) .option("--before ", "Read/search before id") .option("--limit ", "Result limit") .action((opts) => helpers.runMessageAction("thread-list", opts)); helpers .withMessageBase( helpers.withRequiredMessageTarget( thread .command("reply") .description("Reply in a thread") .requiredOption("-m, --message ", "Message body"), ), ) .option( "--media ", "Attach media (image/audio/video/document). Accepts local paths or URLs.", ) .option("--reply-to ", "Reply-to message id") .action((opts) => helpers.runMessageAction("thread-reply", opts)); }